LGDT这个指令在setup.s中的使用问题
本帖最后由 liuyaolinux 于 2014-10-27 10:15 编辑大婶们,小弟最近在读linux0.11的启动代码关于段描述符的设置部分,这部分用于从实模式到保护模式的切换,但是其中的LGDT这个指令的使用小弟是真的不明白
查到的指令描述:
LGDT 源操作数
说明:源操作数是48位(6字节)的内存操作数。该指令的功能是把源操作数装入到全局描述符表寄存器GDTR中。操作数的低字是以字节为单位的段界限,高双字是段基址。该指令对标志位没有影响。
下面这段代码是设置的段描述符表:其中只有第八个和第十个使用:gdt:
.word 0,0,0,0 ! dummy
//用于设置代码段
.word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb) 8Mb
.word 0x0000 ! base address=0 0_0
.word 0x9A00 ! code read/exec A = 0;TYPE=101B;DT=1;DPL=00;D=1;G=1 可读的普通代码段
.word 0x00C0 ! granularity=4096, 386
//用于设置数据段
.word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
.word 0x0000 ! base address=0
.word 0x9200 ! data read/write A = 0;TYPE=001B;DT=1;DPL=00;D=1;G=1 可读写的数据段
.word 0x00C0 ! granularity=4096, 386
这里的设置就不是很明白了。此处的低字是0x800是段界限,后面的就不清楚了。
gdt_48:
.word 0x800 ! gdt limit=2048, 256 GDT entries
.word 512+gdt,0x9 ! gdt base = 0X9xxxx
然后在代码使用的地方也就是后面的一段程序,lgdt gdt_48 这个指令如何解释?end_move:
mov ax,#SETUPSEG ! right, forgot this at first. didn't work :-)
mov ds,ax
lidt idt_48 ! load idt with 0,0
lgdt gdt_48 ! load gdt with whatever appropriate求大婶指教!
页:
[1]