Chinaunix首页 | 论坛 | 博客
  • 博客访问: 269405
  • 博文数量: 45
  • 博客积分: 1618
  • 博客等级: 上尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-11 10:13
文章分类

全部博文(45)

文章存档

2012年(1)

2011年(25)

2010年(19)

我的朋友

分类:

2010-10-11 10:31:40

在操作系统的Bootloader过程中,利用

lgdt gdtdesc

装载全局描述符的基地址和长度进入全局描述符表寄存器,注意加载的时候限长为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

可以和段描述符的各个字节进行对比,看看每一段的作用,注意内存布局的顺序
阅读(4332) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~