mit6.S081 -- 虚拟内存

8 篇文章 0 订阅
3 篇文章 0 订阅

虚拟内存是使用地址偏移来保存虚拟地址到物理地址的映射

重点: 隔离!!!

在这里插入图片描述
cat 和 sh之间是隔离互不干扰的(cat的地址1000不等于sh 的地址1000),每个程序间地址空间独立

在这里插入图片描述
cpu通过mmu将虚拟地址转换成物理地址,一旦MMU启动,每条指令都是虚拟地址,每个应用程序都有自己的映射;
而cpu通过将反映 虚拟地址物理地址 之间的内存映射的 关系表单地址 存在 寄存器 中,这样cpu就可以告诉mmu(内存处理单元)这个关系表单在哪里。

而这个表单叫做 page table ,存放在内存中;
每个应用程序都有独立的表单,当加载不同的程序时,寄存器也会切换不同的内容,所以才会有:cat的1000地址和sh的1000地址映射到了内存中不同的物理地址;

如果一个虚拟地址对应一个page table,寄存器是64bit位,这样的话表单会变得非常大(2^64 个地址),所以这样不合理。
那应该怎么办呢?
1.不要为每一个地址创建一个table,而是应该为每个page创建一个table,这样每次映射转换都是针对一个page;首先对于虚拟内存地址,我们将它划分为两个部分,index和offset,index用来查找page,offset对应的是一个page中的哪个字节;
在这里插入图片描述

因为RISC-V的寄存器是64bit的。但是实际上,在我们使用的RSIC-V处理器上,并不是所有的64bit都被使用了,也就是说高25bit并没有被使用。这样的结果是限制了虚拟内存地址的数量,虚拟内存地址的数量现在只有2^39个,大概是512GB。当然,如果必要的话,最新的处理器或许可以支持更大的地址空间,只需要将未使用的25bit拿出来做为虚拟内存地址的一部分即可。

因为RISC-V的寄存器是64bit的。但是实际上,在我们使用的RSIC-V处理器上,并不是所有的64bit都被使用了,也就是说高25bit并没有被使用。这样的结果是限制了虚拟内存地址的数量,虚拟内存地址的数量现在只有2^39个,大概是512GB。当然,如果必要的话,最新的处理器或许可以支持更大的地址空间,只需要将未使用的25bit拿出来做为虚拟内存地址的一部分即可。

在这里插入图片描述我们之前提到的虚拟内存地址中的27bit的index,实际上是由3个9bit的数字组成(L2,L1,L0)。前9个bit被用来索引最高级的page directory,当我们在使用中间级的page directory时,我们通过虚拟内存地址中的L1部分完成索引。接下来会走到最低级的page directory,我们通过虚拟内存地址中的L0部分完成索引。在最低级的page directory中,我们可以得到对应于虚拟内存地址的物理内存地址。

实际中,几乎所有的处理器都会对于最近使用过的虚拟地址的翻译结果有缓存。这个缓存被称为:Translation Lookside Buffer(通常翻译成页表缓存),简称TLB,就是Page Table Entry的缓存,也就是PTE的缓存。

当第一次寻找一个虚拟地址,硬件会通过三级index来查询得到最终的PPN(物理号),并将查询结果保存至TLB,这样的话下次查找就不需要再次通过三级index来查询,节省时间;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值