【问题标题】:Where Linux Kernel Setup GDTLinux内核设置GDT在哪里
【发布时间】:2016-11-29 21:32:15
【问题描述】:

我正在阅读 Linux 内核代码。 我对 Linux 中的 GDT(Global Descriptor Table) 有一些疑问。

我的问题是:

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,IIRC。
  • 那是完全错误的。 GDT 由 GDTR 指向。 FS/GS 寄存器在架构中的任何地方都没有隐式使用,但是引用内存的指令通常可以重载以使用 FS 或 GS​​ 段而不是默认值(通常是 DS;有时是 SS 或 ES)。 FS 和 GS 寄存器在 Linux 上有多种用途,例如 TLS 或堆栈 cookie (en.wikipedia.org/wiki/X86_memory_segmentation)。
  • 澄清一下,在保护模式下,GS/FS 寄存器(以及所有其他段寄存器)存储 选择器,它们是对 GDT 条目的引用(以及一些其他位数据)。它们的行为与 CPU 处于实模式时完全不同。指向 GDT 的实际指针存储在不同的结构中;一个指向 那个 结构的指针存储在 CPU 的 GDTR 寄存器中。

标签: memory-management linux-kernel operating-system kernel gdt


【解决方案1】:

主 GDT 的布局似乎在 line 91. 的 arch/x86/include/asm/segment.h 中定义

初始化好像在arch/x86/kernel/cpu/common.c in line 123.

但我可能错了。而且不知道为什么内核使用两个步骤来设置 GDT。

【讨论】:

    猜你喜欢
    • 2015-05-05
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2015-01-19
    • 2020-07-19
    • 1970-01-01
    • 2011-09-18
    相关资源
    最近更新 更多