- 论坛徽章:
- 0
|
本帖最后由 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
复制代码 求大婶指教! |
|