我正在QEMU中运行一个模拟的RV64GC内核,并试图更好地理解RISC-V中的虚拟内存子系统和地址转换过程。我的模拟系统使用OpenSBI、LinuxKernalv5.5和最小的rootfs运行。
在QEMU调试跟踪中,我看到有时(最常见的使用ecalls)控件被传递给SBI,并且地址从内核(虚拟?)更改。地址的偏移量为0xffffe000000000的东西看起来像真实的,物理的,地址在RAM中。例如,
...
00000073 .
IN: sbi_ecall__1_handler
0x0000000080004844: 00093603 ld a2,0(s2)
0x0000000080004848: 4785 addi a5,0,1
0x000000008000484a: 00a797b3 sll a5,a5,a0
..。
在RISC-V特权规范版本1.11,第4.1.12节中,将satp (控制和状态寄存器)定义为具有确定地址转换指定的模式字段。0的模式意味着转换是空的(地址被认为是物理的),8或9的模式分别需要基于Sv39或Sv48页面的虚拟寻址,并且保留任何其他模式值。
现在,RISC-V特权和非特权规范似乎都没有提到什么时候可以更改satp (csrrw除外),这就引出了以下问题:
当控制权交给SBI (如上面的ecall )时,satp模式是否更改为0?如果是,这是否意味着应该在u/s/mret指令上重置satp模式?是否有其他实例(csrrw除外)应该更改satp?
如果没有,是否还有其他机制来解释和指定地址为物理地址?还是这些地址(上面的0x80XXXXXX地址)被认为是虚拟的,应该经过通常的虚拟地址转换过程(如RISC-V特权规范第4.3.2节所述)?如果是这样的话,什么时候会为此创建页表条目?
发布于 2020-04-08 10:33:55
RISC-V的内存模型工作方式如下:
M模式有自己的内存保护系统,在称为PMP (物理内存保护)的特权规范第3.6节中描述。这是为了将内存保护强加于较低的特权级别,以及M模式本身(如果使用锁位)。在M模式下没有虚拟内存系统。
现在在S模式中,它有基于页面的虚拟内存系统,S模式可以用来设置虚拟到物理地址映射,也可以对S模式本身和U模式施加内存限制。
因此,每个特权级别都控制着自己的资源和它下面的资源,但从来没有控制过高于它的特权级别的资源。事情就是这样运作的。
M模式可以控制M模式、S模式和U模式可以访问的内存,S模式可以控制存储器视图(虚拟内存)和S和U模式的可访问性,但不能控制M模式。因此,当移动到M模式时,satp模式甚至不会改变。由于它所指出的映射甚至不适用于M模式。它有它的内存保护单元。
如果较低的权限级别可以对更高的权限级别施加内存限制,这将是一个巨大的安全漏洞。
https://stackoverflow.com/questions/60975813
复制相似问题