在操作系统的Bootloader过程中,利用
装载全局描述符的基地址和长度进入全局描述符表寄存器,注意加载的时候限长为0表示有1个长度的有效字节
gdtdesc: .word 0x17 # sizeof(gdt) - 1 23个字节 限长
.long gdt # address gdt 基址
|
gdt是有三个全局描述符组成,第一个是空描述符,第二个是代码段描述符,第三个是数据段描述符
gdt: SEG_NULL # null seg
SEG(STA_X|STA_R, 0x0, 0xffffffff) # code seg
SEG(STA_W, 0x0, 0xffffffff) # data seg
|
其中SEG_NULL和SEG()是两个宏,展开后是利用汇编进行的空间申请
#define SEG_NULL \
.word 0, 0; \
.byte 0, 0, 0, 0
#define SEG(type,base,lim) \
.word (((lim) >> 12) & 0xffff), ((base) & 0xffff); \
.byte (((base) >> 16) & 0xff), (0x90 | (type)), \
(0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)
|
展开后为
.word 0x0000,0x0000;
.byte 0x00,0x00,0x00,0x00
.word 0xFFFF,0x0000;
.byte 0x00,0x9A,0xCF,0x00
.word 0xFFFF,0x0000;
.byte 0x00,0x92,0xCF,0x00
|
可以和段描述符的各个字节进行对比,看看每一段的作用,注意内存布局的顺序
阅读(4325) | 评论(0) | 转发(0) |