80386 的内存地址辨析

****************************************
80386 的内存地址辨析
author: hjjdebug
****************************************
内存条的地址是物理地址。也称真实地址。
与真实地址相对者为虚拟地址.
对x86来说,编译器看到的只是一个偏移量,cpu看到的是段和段偏移构成的线性地址。
逻辑地址经段式管理(基址+偏移量),转换为线性地址.
线性地址,经页式管理(俗称MMU转换),转换为物理地址。
其中:
    逻辑地址(偏移量) --> 虚拟地址
    线性地址 --> 虚拟地址
    物理地址 --> 真实地址
本来,cpu只认识线性地址,让线性地址等于偏移地址,让线性地址等于物理地址,这个世界也挺好,为什么要搞这么复杂呢?

这是因为intel 要扩展功能,启用保护模式,所以它启用了段式管理,使得段与段间不能跨越并设级别限制.

这样就引入了段基址和段限长的概念. 如此线性地址就等于段基址+段偏移,才有了偏移量和线性地址的概念。

为了增加内存的灵活性,引入了MMU, 这就引进了线性地址和物理地址.


1. 什么是段式管理?
    把内存划分为不同的段,每个段可以有不同的属性。
    8086(所谓的实模式)的段基址是段寄存器左移4bits构成. 再加上偏移构成线性地址.
    80386(所谓的保护模式)段基址的获取:
    需要选择子选择gdt或ldt(由ldtr 确定ldt位置)的相应表项(4个word, 64bits)
    从中获得32bits base-addr, 再加上偏移构成线性地址, 段限长及属性值可以起到保护作用。
    80386可以启用保护模式,进入段式管理。

    0 特权级直接使用gdt 中的描述符, 3 特权级使用ldt中的描述符。 这就是gdtr, ldtr 寄存器的用途。

   同时还要造gdt描述符表,ldt描述符表才能工作。

2. 什么是页式管理?
线性地址怎样映射到物理地址?: (MMU)
为什么要用页式管理? 1.用较少的物理内存,访问更多的虚拟内存. 2.多进程的需要。
    段式管理提供的线性地址为4G空间(当然其逻辑地址中的偏移量也可达4G空间),
    而物理内存往往没有那么大,而且程序还有支持多进程,如何解决内存的矛盾?(实际内存小,逻辑内存大)
    这就需要内存 管理单元了。
    我们把经常用到的内容放到真实物理内存中,不常用的东西不要放到内存中。不同进程映射到不同物理内存。
    怎么来映射呢?
    把内存按固定长度分块,叫做一页,80386 4k为一页, 把线性地址空间进行编号,从0开始,
    物理地址空间也编号,从0开始,建立号与号的对应关系。这样需要一个映射表。
    为了减小表的容量,源就不用写了,可以用偏移量代替,目的要写上对应的编号(实际是物理页面基地址+属性)
    这样,一个 4G的线性空间,需要建一个4G/4K = 1M 的页表项,由于一项需4个字节,故需要4M 的页表项。
    把常用的虚拟地址映射到物理内存中,不常用的填上缺页。
3. 为什么要用两级页式管理?
    分级管理乃管理之道,为了减小管理成本。
    由于用一个页表,页表本身开销太大,纵使所需内存没有4G那么大,但页表本身开销也很大,必需要设置不少必要的无效映射地址。
    所以,把页表再分为1024个小页表,无用的页表可以不用存在就可节省出不少内存空间。
    但是1024个小页表到底要用哪个又需要寻址,这就交给页目录来完成。 两级页表的好处是无效的页表可以不设置而节约了内存。
看看80386的2级页表管理模式。
1. 用cr3 寄存器确定页目录基地址。
2. 用线性地址高10位确定页目录的偏移量,从而拿到页框地址。
3. 用线性地址中后续10位确定页框内偏移量,从而拿到页地址。
4. 用线性地址低12位为页偏移量,从而拿到数据。

当你造好页目录表,页表后,上述变换是透明的。 这种查表操作,是硬件之功。

这就是寄存器cr3的用途, 伴随者页目录表和页表两个累赘。 才能完成内存寻址。

页目录基址,我们叫PDE, 每一项都是一个页表基址

页表基址,我们叫PTE,每一项都是一个页基址

页基址 PAGE, 已4K为一页。

前面所述的一项是4个byte, 高20位为地址,低12位为属性.

 

由于线性地址远大于物理地址,在某些线性地址上标记不可写, 不存在等标记,就可以不用与物理地址相映射。

当访问这些地址读或写,会引起内存异常, 这个异常的地址(32位线性地址),就保存在cr2 寄存器中。

异常处理程序可以根据cr2寄存器内容, 把物理内存映射到这个地址上。 从而可以向它写数据和读取数据。

不用的时候,要及时释放物理内存, 这样就实现了以小博大的企图, 程序以为自己在一个很大的内存中运行,

实际上,只是一个较小的物理内存,但不断的换来换去。

 

 

4. 对等映射:
    对等映射是内存管理的一种特例。
    让线性地址等于物理地址,这样的映射关系是对等映射。
    对等映射只有内核为自己方便而使用.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值