页表:
虚拟内存的概念。操作系统虚拟内存到物理内存的映射,被称为页表。
不可能每一个虚拟内存的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位相加,得到最终我们想要的物理地址;线性地址转物理地址:页目录地址 + 页目录索引 = 页表地址 ----- 页表地址 + 页表索引 = 页地址 ------ 页地址 + 页内偏移 = 物理地址
标签:物理地址,地址,页表,线性,缺页,虚拟内存,内存 From: https://www.cnblogs.com/gpf1997/p/17927794.html