riscv-virtual-memory

Introduce riscv virtual memory.

satp

Supervisor Address Translation and Protection Register.

该寄存器包括:mode模式,ASID(address space identifier),PPN(physical page number)。

mode格式如下:

Note: machine mode始终是Bare模式。

Bare模式表示虚拟地址等于物理地址。

PPN是页表基址。

ASID用来在进程切换的时候,减少TLB flush。比如在进程1切换到进程2的时候,必须把进程1的页表清除掉。而有了ASID,给每个进程加上个ID,这样就可以不用清除了,只要判断下当前ID是否和TLB里面的ASID是否相等,就直到是否为该进程的页表。

需要注意的是,写satp并不意味着在页表更新和随后的地址转换之间存在任何排序约束。因此,在修改了新的地址空间页表,或者ASID被重用,必须在写satp之后,由软件显式地执行SFENCE.VMA指令。

Addressing and Memory Protection

Sv39 虚拟地址和页表entry如下。

其中:

V:指示该PTE是否valid。如果是0,所有的其他bit都无效,软件可以自由使用这些bit。

R:readable,是否可读。

W:writable,是否可写。

X:excutable,是否可执行。

U:指示page是否user mode可访问。U-mode只能访问U=1的page。如果sstatus中SUM为一,supervisor模式软件也可以访问U=1的page。如果SUM是0,supervisor软件访问U=1的page会产生fault。不管SUM是什么,supervisor都不能执行U=1的代码。

G:指示global mapping。global mapping是存在于所有地址空间的。对于non-leaf PTEs,该bit意味着所有的子level的page table都是global。注意,没有将全局映射标记为全局只会降低性能,而把一个非全局映射标记为全局则是一个软件bug,在转换到一个地址空间后,该地址范围有不同的非全局映射,将导致不可预测的结果。

RSW:reserved for use by supervisor software。

A:accessed。表示该page自从上次被clear掉A之后,有过read,write,或fetch

D:dirty。表示该page自从上次被clear掉D之后,有过write

当RWX都为0时,PTE时指向下一个level的页表,否则是leaf PTE。有W必须有R,writable 必须标记为readable。

取指时,如果page不含execute权限,会产生fetch page-fault exception。

执行load或者load-reserved指令,如果page不含read权限,会产生load page-fault exception。

执行store,store-conditional(不管是否成功),或AMO指令,如果page没有write权限,会产生store page-fault exception。

以下两种A和D管理方式都是允许的。

  • 当访问虚拟page时A位已清除,或者写入虚拟page时D位已清除,则会引发page-fault exception。
  • 当访问虚拟page时A位已清除,或者写入虚拟page时D位已清除,implementation设置相应的PTE bit。相对于对PTE的其他访问,PTE更新必须时原子的,必须原子地检查PTE是否有效并授予足够的权限。PTE更新必须是准确的(exact, not speculative),并且本地hart观察到的遵循program order。PTE更新必须在global memory order中出现,并且不迟于本地hart对虚拟page的显式访问或任何或许显式内存访问。FENCE提供的load和store顺序和atomic指令acquire/releasebit的顺序,同样作用于PTE更新,如同remote hart所观察到的那样。相对于导致更新的显式内存访问而言,PTE更新不需要是原子的,而且该序列是可中断的。但是在PTE更新全局可以见之前,hart不能执行显式内存访问。