学了一些保护模式的皮毛,困顿于GDT 和 LDT的概念纠葛不清。后来按照intel的设计思路,发现了所以然来,拿来分享。
其实Intel这么煞费苦心地设计出这样的寻址方式,说到底,和它为了支持多任务有关系。每个任务都是要保护起来的,这样,我们就必须保护每个任务对应的一些内存段,防止被其他任务破坏。保护这些内存段,关键在段描述符。段描述符内有对应内存段的“读\写\执行”控制字。这些控制字决定着该段内存是否可读,是否可写,是否可执行。特定进程的相关段描述符集合在一起,就构成了该进程的段描述符表。
每个进程都有一张自己相应的段描述符表。也就是LDT。有多少个进程就有多少个这样的表。每个表都放在内存的某一特定的位置上。这些位置的地址都被集中管理,放在了一个地方。这个地方就是GDT。也就是全局描述符表。当然,GDT除了各个LDT的地址以外,还保存着其他东西。这个我们先不管。
说到GDT,我们要说说全局描述符。内存里,除了进程还有操作系统。操作系统的一些数据是被所有进程共享的。这些数据所构成的段,也是需要段描述符去控制相关的读写安全的。这些段描述符的地址像进程中那些段描述符的地址一样,都被集中到一块内存中管理。也就是我们说的GDT。这个GDT的首地址,放在了什么地方呢?放在了GDTR(全局描述符表寄存器)中。想要找到GDT,直接就从GDTR中读取它的地址就好了。
先到这里,有时间再聊聊段描述符索引的问题。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!