【发布时间】:2019-08-07 05:17:48
【问题描述】:
我正在阅读Understanding Linux Kernel,其中我阅读了有关全局描述符表和本地描述符表的信息。
在哪个(Linux内核的)源文件中定义了GDT和LDT的数据结构?
【问题讨论】:
标签: linux linux-kernel
我正在阅读Understanding Linux Kernel,其中我阅读了有关全局描述符表和本地描述符表的信息。
在哪个(Linux内核的)源文件中定义了GDT和LDT的数据结构?
【问题讨论】:
标签: linux linux-kernel
谷歌搜索“Linux Kernel file gdt”这个词会得到你正在寻找的确切结果。 This 是本书搜索结果的链接,内容描述了 GDT 和 LDT 的定义位置。
所有 GDT 都存储在 cpu_gdt_table 数组中。
如果查看源代码索引,可以看到这些符号是在文件arch/i386/kernel/head.S 中定义的。不过我觉得有本书的时候可以查看源代码索引。但是,仍然给出了定义 GDT 的文件。
【讨论】:
asm volatile C 代码而不是head.S 汇编代码。但我无法弄清楚新内核如何定义这些数组常量。
对于最新的内核,GDT 似乎定义在至少 3 个单独的文件中。
arch/x86/include/asm/desc_defs.harch/x86/include/asm/desc.harch/x86/include/asm/segment.h主 GDT 的布局似乎在 arch/x86/include/asm/segment.h 中定义在 line 91 周围。这条线以上的布局有cmets。
已完成的表通过函数static inline void native_load_gdt(const struct desc_ptr *dtr) 加载到arch/x86/include/asm/desc.h 中,该函数只调用程序集操作码lgdt。这与旧内核将表加载到处理器中的方式是一致的。见第 303 行here。但是,我在代码库中找不到对此函数的任何调用。请有人帮忙解决这个问题。
我也找不到在较新的内核中定义实际表的常量的等价物,如line 479。
【讨论】: