RISC-V 的MMU

以rv64 为例
riscv64 的 MMU 为 code 增加了一个新概念 : 虚拟地址 ,在这个概念之上,加了很多限制
目前好像是无法在物理地址上直接加限制的 //  MPU 就是这样子的,但是颗粒度大
相关的限制
size			:
	有效位数(可选择 64/57/49/39)  	// 根据 satp.MODE 选择 , satp 为标准寄存器
	颗粒度(总是4KB)  				// 参考 附录
	
内存属性			:共享  缓冲缓存  内存顺序模型(普通/设备)
	有扩展标准,Svpbmt
		对于 设备内存,只有一个内容可以选择   // 0b10
		对于 普通内存,可以有两个内容可以选择 // 0b10 或 0b01
	page.[62:61] // Svpbmt标准定义的内容
		0b00 : None
		0b01 : Non-cacheable, idempotent, weakly-ordered (RVWMO), main memory
		0b10 : Non-cacheable, non-idempotent, strongly-ordered (I/O ordering), I/O
		0b11 : Reserved for future standard use

	没有像arm64那样子比较详细的属性控制.
		arm64 : 设备还是内存
			设备
				GRE的组合
			内存
				cacheablity & shareablity 的 组合

权限			:s-mode u-mode 读写执行
	有标准
	page.[6] : A 	// accessable
	page.[4] : U	// u-mode accessable
	page.[3] : X	// executeable
	page.[2] : W 	// writeable
	page.[1] : R 	// readable

	没有像arm64那样子比较详细的权限控制.

相关的控制
寄存器
	satp.PPN
		页目录表基址所在页面的pfn
	satp.MODE
		有效虚拟地址位数 , 高位虚拟地址不被解析
	satp.MODE
		控制MMU的开关. 设置为0 则关MMU . 设置为 非0 则 开MMU
页表描述
  • 以Sv48为例
Sv48最大支持4级别页表

所有可能存在的页表如下
L0 				索引512G 
L0 L1			索引1G
L0 L1 L2 		索引2M
L0 L1 L2 L3  	索引4K

页表
	Level 	offset  offset+2    2^(offset+2)
	L0		10 		12 			4K		个512G页面
	L1		19 		21 			2M		个1G  页面
	L2		28 		30 			1G		个2M  页面
	L3		37 		39 			512G 	个4K  页面
分别是
图4.22 Sv48 模式下 , 任何虚拟地址 的低48bit 被分解为图所示
图4.23 Sv48 模式下 , 目标物理地址 的低48bit 被分解为图所示
图4.24 Sv48 模式下 , 页表项中的   所有64bit 都可以图所示(该页表可以是叶子页表,也可以页目录表)
	注意: 	1. 其中的 PPN[3] 和 PPN[2] 和 PPN[1] 和 PPN[0] 是 一个PPN的不同部分
		  	2. 如果 V = 1 && (R == 1 || X == 1) , 是叶子页表 ; 否则是页目录表 

RISC-V 的MMU_第1张图片

  • mmu table walk 过程
    RISC-V 的MMU_第2张图片
附录
  • 页面颗粒度 为什么只有一种
riscv-privileged-20211203.pdf P74

For many applications, the choice of page size has a substantial performance impact. 
对于许多应用程序,页面大小的选择对性能有很大影响。
A large page size increases TLB reach and loosens the associativity constraints on virtually indexed, physically tagged caches. 
较大的页面大小会增加TLB覆盖范围,并放松对虚拟索引、物理标记缓存的关联性约束。
At the same time, large pages exacerbate internal fragmentation, wasting physical memory and possibly cache capacity.
同时,大页面加剧了内部碎片,浪费了物理内存,可能还浪费了缓存容量。
After much deliberation, we have settled on a conventional page size of 4 KiB for both RV32 and RV64.
经过深思熟虑,我们在RV32和RV64上,固定了页面大小为 常规页面大小(4KB)
We expect this decision to ease the porting of low-level runtime software and device drivers. 
我们希望这一决定能够简化低级运行时软件和设备驱动程序的移植。
The TLB reach problem is ameliorated by transparent superpage support in modern operating systems [2]. 
现代操作系统中的透明超页支持改善了TLB到达问题[2]。
Additionally, multi-level TLB hierarchies are quite inexpensive relative to the multi-level cache hierarchies whose address space they map.
此外,与映射其地址空间的多级缓存层次相比,多级TLB层次相当便宜。

你可能感兴趣的:(杂七杂八总览,riscv,MMU)