Intel CPU的保护模式和段式内存管理简介


在操作系统原理的教材上,我们学到虚拟内存的管理方式有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

假如对保护模式和分段还有任何疑问,欢迎在评论中指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值