保护模式加载描述

保护模式加载描述设置好GDT之后,我们需要通过LGDT指令将设定的gdt的入口地址和gdt表的大小装入GDTR寄存器

GDTR寄存器包括两部分:32-bit的线性基地址,以及16-bit的GDT大小(以字节为单位)

需要注意的是,对于32-bit线性基地址,必须是32-bit绝对物理地址,而不是相对于某个段的偏移量

而我们在启动阶段,在进入保护模式之前,我们CS和DS设置很可能不是0,所以我们必须计算出gdt的绝对物理地址

为了执行LGDT指令,你需要把这两部分内容放在内存的某个位置,然后将这个位置的内存地址作为操作数传递给LGDT指令

然后LGDT指令会自动将保存在这个位置的这两部分值装入GDTR寄存器

# 这是存放GDTR所需的两部分内容的位置gdt_48:.word 0x8000 # gdt limit=2048,# 256 GDT entries.word 0, 0 # gdt base (filled in later)# 下面这段代码用来计算GDT的32-bit线性地址,并将其装入GDTR寄存器

xorl %eax, %eax # Compute gdt_basemovw %ds, %ax # (Convert %ds:gdt to a linear ptr)shll 4, %eaxaddl $gdt, %eaxmovl %eax, (gdt_48+2)lgdt gdt_48 # load gdt with whatever is appropriate

以上内容由大学时代综合整理自互联网,实际情况请以官方资料为准。

相关