前言
开始前讲讲废话,之所以写这篇文章,是因为当初在接触开发操作系统的时候,看过的相关文章也不少就是搞不懂GDT表的原理跟分页机制。可能是理解力的问题吧,个人比较喜欢图片,看太多字会眼困。编程对于我来说不过是业余爱好,当初接触开发OS的资料是因为学习C语言太过无聊,边研究边学习可以培养兴趣。不过想不到刚开始用汇编比用C的地方多。废话就不讲了,主要发发牢骚,见谅。
正文
1.万恶的概念
在接触GDT表之前先说说GDTR这个东西,对于熟悉汇编的人来说当然知道是什么。GDTR是寄存器,全局描述符寄存器,相当于CPU里面的EAX,EBX,ECX……,它们都是“硬件”。(好吧,当初我把GDTR跟GDT表搞混了) 既然都是硬件当然有大小,就好象内存条一样。EAX 是32位(byte),而GDTR是48位(byte)。
说说GDT表吧,GDTR是硬件,而GDT表是软件中的“数据”,就好像是TXT文件里的文字,不过它不是放在TXT文件里,它放在物理内存里边。
重点说一下的是在理解GDT的时候,区分好“硬件”与“数据”。
2.占用64位的GDT表是如何的?
重申一下,GDTR是“硬件”,48位寄存器。GDT表是“数据”,64位。好吧,上图:
图1 GDT表(intel 手册第3卷第3章)
这就是GDT表,上下都是32位总共64位,Base Address(基地址),Segment Limit(段界限),其他的都是属性,对属性不了解的可以看看intel手册,英语不好的可以找本于渊的《ORANGE’S:一个操作系统的实现》深入了解。
图1中可以看到,下部32位中 Segment Limit 15:0(段界限0~15位) 占用 GDT表0~15位(bit),上部32位中Segment Limit 19:16(段界限16~19位) 占用 GDT表16~19位(bit)。虽然我说了一堆,还是有很多人不明白的吧,继续上图: