Lab3 Page tables相关知识和实验

文章详细解释了虚拟地址的作用,如实现用户程序间的内存隔离和保护内核。通过MMU和多级页表结构,虚拟地址被转换为物理地址,每个进程拥有独立的页表。TLB用于缓存最近的地址翻译,提高性能。在RISC-V架构中,虚拟地址的高25位未使用,限制了最大虚拟地址空间。操作系统在切换进程时需更新SATP寄存器以指向新进程的页表,同时清空TLB。
摘要由CSDN通过智能技术生成

为什么需要虚拟地址?

  1. 隔离性。将用户程序之间,用户程序和内核之间进行内存隔离。防止一个程序错误的操作了另一个程序的内存。

  1. 通过PTE的flags位,可为系统提供更多的功能

相关知识点

page tables

  1. MMU并不会保存page table,它只会从内存中读取page table

CPU执行指令,例如_sd $7, (a0)。_假设寄存器a0中是地址0x1000,那么这是一个虚拟内存地址。虚拟内存地址会被转到MMU。在内存的某个位置(比如某个特定的寄存器保存表单的存放地址)保存了地址关系表单,MMU只是会去查看page table。内存管理单元会将虚拟地址翻译成物理地址。之后这个物理地址会被用来索引物理内存,并从物理内存加载,或者向物理内存存储数据。

  1. 每个应用程序都有自己独立的表单

每个应用程序都有自己独立的表单,并且这个表单定义了应用程序的地址空间。所以当操作系统将CPU从一个应用程序切换到另一个应用程序时,同时也需要切换SATP寄存器中的内容,从而指向新的进程保存在物理内存中的地址对应表单。这样的话,cat程序和Shell程序中相同的虚拟内存地址,就可以翻译到不同的物理内存地址,因为每个应用程序都有属于自己的不同的地址对应表单。

  1. 不为每个地址创建一条表单条目,而是为每个page创建一条表单条目。一个page是4KB,也就是4096Bytes

所以对于虚拟内存地址,我们将它划分为两个部分,index和offset,index用来查找page,offset对应的是一个page中的哪个字节。

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

在使用的39bit虚拟地址中,有27bit被用来当做index,12bit被用来当做offset。offset必须是12bit,因为对应了一个page的4096个字节。

物理内存地址是56bit,其中44bit是物理page号(PPN,Physical Page Number),剩下12bit是offset完全继承自虚拟内存地址(也就是地址转换时,只需要将虚拟内存中的27bit翻译成物理内存中的44bit的page号,剩下的12bitoffset直接拷贝过来即可)。

  1. page tables是多级目录结构,可有效节省保存tables所需的内存。之前提到的虚拟内存地址中的27bit的index,实际上是由3个9bit的数字组成(L2,L1,L0)。前9个bit被用来索引最高级的page directory

一个directory是4096Bytes,就跟page的大小是一样的。Directory中的一个条目被称为PTE(Page Table Entry)是64bits,就像寄存器的大小一样,也就是8Bytes。所以一个Directory page有512个条目。

PTE = PPN + Flags

所以,SATP寄存器会指向最高一级的page directory的物理内存地址,用虚拟地址中的高9bits作为偏移,得到一个PPN,也就是物理page号。这个PPN指向了中间级的page directory。同样做法,再用中间L1部分得到第三级目录地址,使用L0得到对应于虚拟内存地址的物理内存地址PPN部分。用PPN加上虚拟地址中低12bits的offset,得到最终的物理地址。

  1. 几乎所有的处理器都会对于最近使用过的虚拟地址的翻译结果有缓存,从而减少对内存的读取次数。这个缓存被称为:TLB (Translation Lookside Buffer(通常翻译成页表缓存))

如果你切换了page table,操作系统需要告诉处理器当前正在切换page table,处理器会清空TLB。因为本质上来说,如果你切换了page table,TLB中的缓存将不再有用,它们需要被清空,否则地址翻译可能会出错。

整个CPU和MMU都在处理器芯片中,所以在一个RISC-V芯片中,有多个CPU核,MMU和TLB存在于每一个CPU核里面。

Kernel Page Table

并不是内核进程,是系统整体的虚拟地址空间规划

中间是RISC-V处理器,我们现在知道了处理器中有4个核,每个核都有自己的MMU和TLB。处理器旁边就是DRAM芯片。

主板的设计人员决定了,在完成了虚拟到物理地址的翻译之后,如果得到的物理地址大于0x80000000会走向DRAM芯片,如果得到的物理地址低于0x80000000会走向不同的I/O设备。

地址0x1000是boot ROM的物理地址,当你对主板上电,主板做的第一件事情就是运行存储在boot ROM中的代码,当boot完成之后,会跳转到地址0x80000000,操作系统需要确保那个地址有一些数据能够接着启动操作系统。

高于0x80000000的物理地址对应DRAM芯片,但是对于例如以太网接口,也有一个特定的低于0x80000000的物理地址,我们可以对这个叫做内存映射I/O(Memory-mapped I/O)的地址执行读写指令,来完成设备的操作

XV6使用free memory来存放用户进程的page table,text和data。如果我们运行了非常多的用户进程,某个时间点我们会耗尽这段内存,这个时候fork或者exec会返回错误

每个进程有自己的用户地址空间,所有进程共享一段内核地址空间

page tables创建流程(debug)

从boot中加载内核到内存指定位置,启动内核。

创建kernel page table,将table的地址存到satp寄存器中,之后使用的内存地址就全是虚拟地址了。(每个CPU核只有一个SATP寄存器,但是在每个proc(进程)结构体,如果你查看proc.h,里面有一个指向page table的指针,这对应了进程的根page table物理内存地址。)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值