对X86内存管理架构的总结

一.关于地址空间
     X86有两种地址空间:线性地址和物理地址。
1.物理地址空间类似于CPU的“心胸”,“心胸”越宽广,CPU能“看到”的内存和其他硬件设备就越多,比如最早的8086只有1MB的物理地址空间,那么我们就是给它1GB的内存,也无济于事;
2.线性地址空间则类似于进程的“心胸”,“心胸”越宽广,进程能容纳的代码,数据以及堆空间和栈空间就越大;
但是,由于x86的内存管理机制,实际上还存在着一个“逻辑地址”,逻辑地址是我们编写的程序直接使用的地址,由段基址和偏移量构成,比如指针变量存储的内容实际上是偏移量,这个偏移量要结合段基址使用,但这对高级程序员是透明的。开启了分段和分页内存管理机制的计算机自动将程序使用的逻辑地址转换为线性地址(分段),然后线性地址转换为物理地址(分页),最后物理地址才能访问到平台内存和硬件设备。
     以上三者其实都由CPU决定:
1)CPU的寻址能力决定了物理地址空间大小;
2)CPU的位数决定了线性地址空间的大小;
3)CPU是否具有分段机制决定了逻辑地址是否存在。

二.分段内存管理
     分段内存管理的基本思想是将内存分为一个一个的段,每个段由二元组(基址,长度)唯一给定。在没有开启保护模式的实模式洪荒时代,X86提供的段寄存器CS,DS和SS等都是用来存放段基址的,我们通过相应的偏移量索引相应的段来确定我们要找的代码或者数据,但是这样很不安全,一个不负责任的代码很容易就造成程序的崩溃。引入保护模式可以避免相应的问题,但这也使分段内存管理变得复杂,下面我们就来看看保护模式下的分段内存管理机制。
     分段机制有四个基本部分:逻辑地址、段选择符寄存器、段描述符和段描述符表。
     X86平台上运行的程序一开始都是与逻辑地址打交道,也就是说所有的变量的地址实际上都是逻辑地址,每个逻辑地址是一个(段选择符,偏移)的二元组,段选择符16位,偏移32位。段选择符中除了索引之外还有两个属性TI和RPL,分别负责判定目标描述符表是GDT还是LDT,以及权限级别。
     段选择符寄存器其实就是实模式中的段寄存器(DS,CS和SS等),在保护模式下它们不再存储段基址,而存储相应的段选择符。
     段描述符描述某个段的基址,长度和各种属性。
     段描述符表有两种:全局描述符表(GDT)和局部描述符表(LDT)。全局描述符表存储OS的代码段描述符,数据段描述符,堆栈段描述符和特殊的段描述符(如不同任务的LDT的段描述符),它只是内存中的一个数据结构,可以把它看成一个数组;局部描述符表存储任务自身的代码段描述符,数据段描述符和堆栈段描述符,LDT自身也是一个段,它需要被一个段描述符(存于GDT中)来描述,寄存器GDTR和LDTR为二者提供基地址。

三.分页内存管理
     与分段的内存管理机制相比,分页的内存管理机制更加细粒度,它将物理内存空间和虚拟内存空间分别分割为一个个固定大小的页框和页(通常为4KB),再加上TLB(翻译后备缓冲器)的帮助,实现线性地址到物理地址的转换。OS在启动的过程中,通过将CR0中PG位置1来开启分页机制。分页的内存管理是虚拟内存管理机制的基础。分页机制大概的工作过程是:CPU访问线性地址,先查找TLB,地址转换在TLB中的话,我们直接将TLB中页框基址加上偏移量就能得到物理地址;若地址转换不在TLB中,就查找页目录,页表,页,得到物理地址,并将物理页框拷贝到TLB中

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值