linux 虚拟内存初识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24964575/article/details/52925612

一个运行程序时,虚拟内存技术如何运作:

虚拟内存空间的大小是由程序计数器的寻址能力来决定的

采用虚拟技术,就存在两个内存空间:
虚拟内存空间,其中的地址叫做“虚拟地址”
物理内存空间,其中的地址叫做“物理地址”

处理器运算器、应用程序设计人员 只看到 虚拟内存空间和虚拟地址
处理器片外的地址总线 只看到 物理空间和物理地址

采用虚拟技术,一个应用程序从编写到被执行,需要进行两次映射
第一次是映射到虚拟内存空间,即使用虚拟地址为程序编址
第二次是映射到物理内存空间,即把运行的程序复制到物理内存

编程时的地址与程序的业务逻辑有关->虚拟地址 == 逻辑地址(???)

第二次映射由软件和硬件共同完成
硬件:存储管理单元MMU
软件:操作系统的内存管理模块(会建立一个表格A)

表格A:以虚拟地址为索引,记录了程序段所占用的物理内存的物理地址

表格A是存储管理单元把虚拟地址装换为实际地址的依据

表格A == 映射记录表 == 虚拟地址/物理地址记录表

虚拟技术的实现,是建立在应用程序可以分段,并且“任何时候正在使用的信息总是所有存储信息的一小部分”的局部特性基础之上

处理器运算器、应用程序设计人员的角度来看,它面对的是一个封装的虚拟内存空间
封装的虚拟内存空间 == MMU+映射记录表+物理内存
这里写图片描述

多个运行程序时,虚拟内存技术如何运作:
1.每个程序都有一个大小与处理器寻址空间相等的虚拟内存空间
2.在一个具体时刻,处理器只能使用其中一个程序的映射记录表
3.使用程序映射记录表可方便的实现物理内存的共享

映射记录表是系统由虚拟内存进入物理内存的唯一接口,这里可以设置保护措施


段基址+段内偏移地址 ==虚拟地址(得到段描述符项) –(段机制)–>线性地址 –(分页机制)–>物理地址
[AAA]
这里写图片描述

段描述符:段描述符是GDT和LDT表中的一个数据结构项,用来向处理器提供一个有关段的位置和大小信息以及访问控制的状态信息。
这里写图片描述
DPL:00代表系统,01代表用户
这里写图片描述
①段基址给出该段的基础地址,用于形成线性地址;
②段界限说明该段的长度,用于存储空间保护;
③存储权字节说明该段的访问权限、该段当前在内存中的存在性,以及该段所在的特权级。
Linux内部文件示例:
这里写图片描述
段选择符:又称端选择子,是段的一个16位标识符。
这里写图片描述
请求特权级RPL(Request Privilege Level):RPL>=DPL才能得到相应的请求
RPL(00,11)
表指示标志TI(Table Index):0代表GDTR、1代表LDPR
索引值(Index):3-15位
Linux段选择结构示例:
这里写图片描述
段描述符表: 是段描述符的一个数组。
这里写图片描述
描述表的基址(Base Address),内核用GDTR,进程用LDTR。
这里写图片描述

[AAA]索引值(Index)+ 描述表的基址(Base Address)->段描述符 (含线性地址)

线性地址[两级页表的地址转换]:
这里写图片描述
分页单元中,页目录是唯一的,它的地址放在CPU的cr3寄存器中

DIRECTORY+CR3 -> 目录项(linux中DIRECTORY == 0)
目录项+TABLE -> 页起始地址
页起始地址+OFFSET -> 物理地址

linux系统的本质是有目录DIRECTORY==页目录PGD + 中间页目录PMD ,但是为了迎合CPU,通过让DIRECTORY中的中间页目录PMD恒为0的实现了普通分页机制

Example:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_24964575/article/details/52925612