可执行程序反汇编之后的地址为逻辑地址,即段地址:偏移地址
CPU访问L1cache用到的地址为物理地址
段地址在8086里面就是CS的值,左移四位加偏移地址就是逻辑地址
而在80386之后,CS里面是一个段描述符,要到GDT、LDT查表得到段地址
磁盘,主存 DRAM cache :
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wLB2lVZ-1652448304221)(D:\Documents\markdown\watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMTAzNDc5,size_16,color_FFFFFF,t_70)]
关于几个地址的分类解释如下:
物理地址:物理地址就是存储器实际上的地址,是内存单元的绝对地址,例如你有一个4G的内存条,物理地址0x0000就表示内存条的第一个存储单元,0x0010就表示内存条的第17个存储单元,而不管CPU内部怎么处理地址,最终访问的都是物理地址。
实际地址:物理地址的别称,就是存储器实际上的地址。
逻辑地址:逻辑地址由两个16位地址分量组成,段地址和偏移量,一般会这样表示–>段地址:偏移量。是应用程序角度看到的内存单元地址。 不同于物理地址(physical address),通过地址翻译器(address translator)或映射函数可以把逻辑地址转化为物理地址。
线性地址:CPU在保护模式下,“段基址+段内偏移地址”叫做线性地址,注意,保护模式下段基址寄存器中存储的不是真正的段基值(和实模式的含义不一样),而是被称为“段描述符”的东西,通过段选择子在GDT(全局描述表)或LDT中找到真正的段基值。另外,如果CPU在保护模式下没有开启分页功能,则线性地址就被当做最终的物理地址来用,若开启了分页功能,则线性地址就叫虚拟地址(在没开启分页功能的情况下线性地址和虚拟地址就是一回事)。但是,如果开启分页功能,虚拟地址(或线性地址)还要通过页部件电路转换成最终的物理地址。
有效地址:有效地址(EA)即偏移地址(偏移地址=偏移量)。有效地址可以由几部分组成:基址寄存器内容、变址寄存器内容、比例因子和位移量。
下面介绍虚拟内存VM,先介绍一下英文缩写
PA physical address | 物理地址 |
---|---|
VA | 虚拟地址 |
MMU memory management unit | CPU上的一个内存管理单元 |
VM virtual memory | 虚拟内存 |
VP virtual page | 虚拟页 |
PP physical page | 物理页 |
page table | 页表 |
PTE page table entry | 页表条目 |
PTBR page table base register | 页表控制寄存器 |
VPN virtual page number | 虚拟页号 |
VPO virtual page offset | 虚拟页面偏移 |
---|---|
PTEA | PTE的地址 |
PPN physical page number | 物理地址编号 |
PPO physical page offset | 物理页偏移量 |
TLB translation lookaside buffer | 快表 |
TLBL | 快表的标记位 |
TLBI | 快表的索引 |
早期的物理寻址与现代的虚拟寻址
主存可以认为是内存,内存比磁盘快但是小,数据从磁盘上传到主存中
虚拟内存作用于缓存
虚拟内存将主存看做是一个储存在磁盘上的地址空间的高速缓存,在主存中仅保留活动的区域,通过页面调度,高效的使用了主存
虚拟内存地址空间的两大映射
这个映射不是指针,指针地址是具体实现
虚拟内存被分割为块,这些块就叫虚拟页
虚拟内存的页,其状态为一下三者之一
- 未分配的,有效位没有被设置,既不映射磁盘,也不映射主存
- 未缓存的,和磁盘上某个数据关联,但这个数据还没有上传到缓存 上
- 已缓存的,和磁盘上某个数据关联,且这个数据还没有上传到缓存 上
虚拟内存地址空间的两大映射的具体实现
想实现这个功能,需要考虑怎样判断一个虚拟页是否在DRAM上分某个地方,以及这个虚拟页是否在物理页(主存)中存着,如果不,那就是不命中,应该到磁盘的那个位置去找,缺页异常如何处理
实际上,采用操作系统、MMU、页表共同完成这个任务
页表是一个页表条目(Page Table Entry, PTE)的数组
PTE有一个有效位和一个地址地段组成,根据状态,内容如下
未分配的 | 有效位未设置 | 空地址 |
---|---|---|
已分配未缓存的 | 有效位未设置 | 地址为磁盘中该虚拟页的起始位置 |
已缓存的 | 有效位已经设置 | 地址为物理内存(DRAM)中虚拟页对应物理页的起始地址 |
虚拟内存的缺页
虚拟内存的缺页,指的是DRAM的缓存不命中,也就是已分配未缓存的那部分
操作系统负责处理缺页异常,以及页表的维护
缺页异常处理程序会在DRAM中找一个牺牲页,这个牺牲页将被替换为缺少的页。如果牺牲页没有被更改过,就算了,如果被更改过,为了保证数据不缺失,会把牺牲页的内容复制回磁盘,然后更改牺牲页对应的页表条目,说明牺牲页已经不在DRAM里面了。替换后,更新页表,重启导致缺页异常的指令,这次就没问题了。
页面调度
在磁盘和DRAM间传送页的活动叫做页面调度,现代系统都使用按需页面调度策略,也就是说,仅在发生不命中时才调度
页面分配
状态是已分配未缓存,实际上DRAM没有分配,只有在产生缺页异常是才会进行页面调度
虚拟内存用于内存管理
每个进程都拥有一个独立的虚拟地址空间,多个虚拟页面可以映射到同一个物理页面上
虚拟地址空间与按需调度对内存管理产生了深远的影响
主要分为以下方面
- 简化内存分配,分配大块内存是,没必要在主存中开辟连续空间,虚拟内存页面连续即可,映射结果可以散乱分布在主存中
- 简化代码和数据共享,不同的虚拟内存页面被映射到相同的物理页面
- 链接,每个程序使用相似的虚拟地址空间代码、数据和堆都使用相同的起始地址.
- 加载,execve 为代码段和数据段分配虚拟页,并标记为无效(即未被缓存)。每个页面被初次引用时,虚拟内存系统会按照需要自动地调入数据页
虚拟内存用作内存保护
主题思想为在PTE上添加许可位,提供访问控制,MMU加载PTE是,检测许可位即可
地址翻译
从虚拟地址到物理地址
地址翻译的命中与不命中
添加了L1缓存
快表TLB
快表是在MMU里面的一个小缓存,在快表中查询 比上文使用L1还快
VA由标记位,索引位和VPO组成,前两者就是VPN
快表的命中与不命中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HVrqtwvO-1652448304228)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220512022543362.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LZumPUlY-1652448304228)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220512022549383.png)]
多级页表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C07yvD5I-1652448304229)(D:\Documents\markdown\计算机系统\虚拟内存\season1\QQ图片20220512023317.png)]
二级页表示例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ixMoUE7-1652448304230)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220512024111516.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hQhc8xJl-1652448304230)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220512024700555.png)]
多级页表的 翻译
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DbgxNhFI-1652448304231)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220512025136293.png)]
core i7的地址翻译
两张图说明了大概的原理
内存系统(MMU为内存管理单元)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jXxz7HdN-1652448304231)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220512025903993.png)]
地址翻译
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BgWb067w-1652448304231)(season1\image-20220512030009246.png)]
linux的虚拟内存系统
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEL8r9Ez-1652448304232)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220513194626594.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sKYZEIWM-1652448304232)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220513194857165.png)]
上述的任务结构就是上上图中内核虚拟内存里面与进程有关的数据结构(task,mm等)
缺页
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GwA5s6TM-1652448304233)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220513195311575.png)]
linux的内存映射
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tMPRMzck-1652448304233)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220513200720190.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhMS4vQm-1652448304233)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220513200846117.png)]
fork与execve
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2N7pHYyG-1652448304234)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220513200925035.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pDo4wAAF-1652448304234)(D:\Documents\markdown\计算机系统\虚拟内存\season1\image-20220513200938459.png)]