页表、物理地址、逻辑地址

发布时间 2023-12-26 11:41:25作者: 廿陆

页表:

  虚拟内存的概念。操作系统虚拟内存到物理内存的映射,被称为页表

  不可能每一个虚拟内存的Byte都对应到物理内存的地址,因为这样的页表非常大,于是引入 页(Page)概念,进行分页,减小虚拟内存页对应物理内存页映射表的大小。

  缺页异常:malloc和mmap函数分配内存是仅建立了 进程虚拟地址空间,并没有分配虚拟内存对应的物理内存,进程访问没有建立映射关系的虚拟内存时,处理器自动触发 缺页异常,引发缺页中断。

  缺页中断:缺页异常后产生一个缺页中断,操作系统根据页表中的   外存地址  在外村中找到所缺的一页,将其调入 内存。

  在进行动态内存分配的时,(C++ 中 new),操作系统会在硬盘中创建或申请一段虚拟内存空间,并更新到页表(分配一个页表条目),该条目指向硬盘上新创建的虚拟页,产生映射关系。

逻辑地址转线性地址:段起始地址(基地址) + 段内偏移地址 = 线性地址

  例如一个存储器大小是  1KB(8位)可以分为4段,第一段地址范围是0~255,段地址为0;;;第四段地址范围是768~1023,段地址为768;偏移地址为0~255之间。

  线性地址是一个32位的无符号整数,可以用来表达4GB的地址,高达4294967296个内存单元。十六进制表示(0x00000000~0xffffffff)

  分页机制:

    4KB分页大小,线性地址的高10位为页目录项在页表中的编号,中间10位为页表中的页号,低12位是偏移地址。

    4MB分页大小,高10位页号,低22位偏移地址。 

  1、分页单元中,页目录是唯一的,它的地址放在CPU的cr3寄存器中,是进行地址转换的开始点。
  2、每一个活动的进程,因为都有其独立的对应的虚似内存(页目录也是唯一的),那么它也对应了一个独立的页目录地址。——运行一个进程,需要将它的页目录地址放到cr3寄存器中。
  3、每一个32位的线性地址被划分为三部份,面目录索引(10位):页表索引(10位):偏移(12位)
依据以下步骤进行转换:
  1、从cr3中取出进程的页目录地址(操作系统负责在调度进程的时候,把这个地址装入对应寄存器);
  2、根据线性地址前十位,在数组中,找到对应的索引项,因为引入了二级管理模式,页目录中的项,不再是页的地址,而是一个页表的地址。(又引入了一个数组),页的地址被放到页表中去了。
  3、根据线性地址的中间十位,在页表(也是数组)中找到页的起始地址;
  4、将页的起始地址与线性地址中最后12位相加,得到最终我们想要的物理地址;

线性地址转物理地址:页目录地址 + 页目录索引 = 页表地址      -----      页表地址 + 页表索引 = 页地址     ------    页地址 + 页内偏移 = 物理地址