在操作系统中,全局描述符是什么?GDT又是什么?在进入保护模式之前,准备好GDT和GDT中的描述符是必须的吗?用汇编代码怎么创建描述符?本文解答上面几个问题。
在实模式下,CPU是16位的,意思是,寄存器是16位的,数组总线(data bus)是16位的,但地址总线是20位的。物理内存地址的计算公式是:
物 理 地 址 = 段 地 址 ∗ 16 + 偏 移 量 物理地址 = 段地址 * 16 + 偏移量 物理地址=段地址∗16+偏移量
段地址和偏移量都是16位的,能寻址的最大内存地址是1M。
1M是怎么计算出来的?2的20次方就是1M,能表示的内存地址是 0~(2的20次方-1)。用简单例子来理解,1位十进制数能表示的最大数是10 - 1 = 9,但1位十进制数能表示的数却是 0
,和 1-9
,总计10个数字。
若一个内存地址是20:30
,最终内存地址是:20 * 16 + 30
。
在保护模式下,内存地址仍然用“段地址:偏移量”的方式来表示。不过,“段地址”的含义不同于实模式下的“段地址”。在实模式下,段地址是物理地址的高地址部分,具体说,是高16位部分。而在保护模式下,段地址是选择子,指向一个结构,这个结构描述了一个内存区域,告知该区域的内存地址从哪里开始,在哪里结束,还告知了这片内存能不能被访问、能不能被读取等数据。这个结构组成一个集合,叫GDT,而这个结构叫GDT项,它有一个术语,叫“描述符”。
GDT的作用是提供段式存储机制。段式存储机制由段寄存器和GDT共同提供。段寄存器提供段值,即描述符在GDT中的索引,也就是选择子。根据选择子在GDT中找到目标描述符。这个描述符中包含一段内存的初始地址、这段内存的最大地址、这段内存的属性。
GDT的构成
GDT项即全局描述符的长度是8个字节,64个bit,64个位,063位,而不是164位。下图是写了位编号的8个字节。真实的全局描述符是不折行的,这里无法在一行显示全部数据,因此折行了。
63|62|61|60|59|58|57|56| 55|54|53|52|51|50|49|48| 47|46|45|44|43|42|41|40| 39|38|37|36|35|34|33|32| 31|30|29|28|27|26|25|</