在操作系统原理的教材上,我们学到虚拟内存的管理方式有3种,段式内存,页式内存,和段页式内存。Intel的CPU同时支持段式内存和页式内存。我们在这一篇中先介绍段式内存。
我们知道,Intel CPU在启动后处于实模式(Real Mode)。在实模式下,CPU可以管理1M内存。由于现代计算机上的内存早以远远超过了1M,Intel CPU从80386开始提供了一个新的模式,保护模式,在保护模式下,CPU可以管理4G的物理内存。将CPU切换到保护模式非常简单。只需将CR0控制寄存器的最低位置1即可。下面的代码可以将CPU切换到保护模式
mov eax, cr0
or eax, 00000001h
mov cr0, eax
当CPU被切换到保护模式之后,由于指预取的指令队列中还是实模式下的指令,所以一般在后面会跟一条远跳转指令。我将在以后的章节中指出这一点。
切换到保护模式后,CPU的分段机制就不是实模式下的机制了。在实模式下,物理地址=段地址*16+偏移。而在保护模式下,物理地址依然由段地址和段内偏移构成,但是段地址不再保存在段寄存器中了。
在保护模式下,CPU中有一个寄存器GDTR指向内存中的一个数据结构,这个数据结构在一般的操作系统原理教材中称为段表,而Intel给它的正式名称叫描述符表,描述符表是一个拥有8192个元素的数组,数组中每一个元素我们称之为描述符。每个描述符由8个字节构成,描述了一个内存段的基地址和长度,以及其他一些访问权限控制信息。而在段寄存器中则存放了一个描述符在GDTR中的索引,以及其他一些访问权限信息。这样,结合段寄存器,描述符表和另外给出的段内偏移,我们就得到了保护模式下的物理地址。
在Rome中,我们将通过设置描述符表将内存变成一个平坦的32位空间。下面的描述符定义就可以做到这一点:
GDT_Table:
dq 00000000000000000h ; 00: Intel要求第一个描述符必须是空的
dq 000CF9A000000FFFFh ; 08: 代码段,段基址=0,长度=4G
dq 000CF92000000FFFFh ; 10: 数据段,段基址=0,长度=4G
dq 000CF92005000FFFFh ; 18: 特殊的一个段,用来实现VC++的异常处理
由于Intel CPU的保护模式相对实模式来说比较复杂,这里将不作更详细的介绍,读者可以自行阅读《Intel程序员手册》。手册可以在Intel官方网站上下载。下载地址:http://www.intel.com/products/processor/manuals/index.htm
假如对保护模式和分段还有任何疑问,欢迎在评论中指出。
Intel CPU的保护模式和段式内存管理简介
最新推荐文章于 2024-10-31 19:23:52 发布