Linux内核如何设置GDT

9

我正在阅读Linux内核代码。

关于Linux中的GDT(全局描述符表),我有一些疑问。

我的问题如下:

Where Linux Kernel Setup Large GDT?
I know that in pm.c [http://lxr.free-electrons.com/source/arch/x86/boot/pm.c#L123] 
kernel call function setup_gdt() and it set up a small GDT with only three entries. 

Then jumps to protected mode code.
Then where is the code to setup large GDT with 32 entries 

( One specified in Understanding Linux Kernel  https://books.google.co.in/books?id=h0lltXyJ8aIC&pg=PT59&lpg=PT59&dq=linux+kernel+file+gdt&source=bl&ots=gO0lH05fHX&sig=h4X1I6TP_P7JlEwzoCkQk3uztjw&hl=en&sa=X&ei=XFwPVM-WBbOBsQTtiIDIDw&redir_esc=y#v=onepage&q=linux%20kernel%20file%20gdt&f=false  )

Kernel also defined constants for Large GDT set up in segment.h http://lxr.free-electrons.com/source/arch/x86/include/asm/segment.h#L46.

为什么内核使用两个步骤来设置GDT?

如果我们使用GRUB作为引导加载程序,那么GRUB也会在grub-core/kern/i386/realmode.S中设置一个GDT。为什么Linux要重置这个GDT呢?


你听说过 CPU 寄存器 GS/FS 吗?如果我没记错的话,其中一个寄存器携带着 GDT。 - icbytes
1
那完全是错误的。GDT由GDTR指向。FS/GS寄存器在架构中没有隐式使用,但引用内存的指令通常可以重载以使用FS或GS段而不是默认值(通常为DS; 有时为SS或ES)。FS和GS寄存器在Linux上有各种用途,例如TLS或堆栈(cookie) (https://en.wikipedia.org/wiki/X86_memory_segmentation)。 - icecreamsword
澄清一下,在保护模式下,GS/FS寄存器(以及所有其他段寄存器)存储选择器,这些选择器是对GDT条目(以及一些其他数据位)的引用。它们的行为与CPU处于实模式时完全不同。指向GDT的实际指针存储在不同的结构中;指向结构的指针存储在CPU的GDTR寄存器中。 - adrian
1个回答

2
主GDT的布局似乎在arch/x86/include/asm/segment.h中定义,具体在第91行
初始化似乎在arch/x86/kernel/cpu/common.c中进行,具体在第123行
但我可能错了。而且不知道内核为什么要使用两个步骤来设置GDT。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接