|
|
|
@ -564,10 +564,10 @@ csrw medeleg, 1<<0 | 1<< 3 | 1<<8 | 1<<12 | 1<<13 | 1<<15
|
|
|
|
|
|
|
|
|
|
这段代码的作用是将M模式中interrupt中的1、5和9号,分别对应Supervisor software interrupt,Supervisor timer interrupt和Supervisor external interrupt代理出去,到S模式处理;再将M模式中的exception(或trap)中的0、3、8、12、13和15号,分别对应Instruction address misaligned,调试中断Breakpoint(3号),用户态系统调用Environment call from U-mode(8号),缺页或访存异常(12、13和15号)代理出去,到S模式处理。实际上,将这些重要的中断代理出去后,系统中产生的绝大部分中断事件将都在S模式处理。所以,在其后的PKE实验中,读者主要跟U模式以及S模式的代码打交道,除启动过程和一些简单的设置(如访存、中断代理等),实验也基本不涉及M模式的代码。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h3 id="1.5"> 1.5 页式虚存管理 </h3>
|
|
|
|
|
[//]:# (### 1.5 页式虚存管理)
|
|
|
|
|
|
|
|
|
|
###1.5 页式虚存管理 ###
|
|
|
|
|
|
|
|
|
|
我们知道,程序中的代码对数据进行访问(如使用load和store指令)时,采用的是数据的逻辑地址(即程序地址)。然而,将程序装入内存时,装载器无法保证数据的逻辑地址和物理地址(内存的编址)之间有完全相等的关系。实际上,由于操作系统往往是计算机装入物理内存的第一个程序,如果仔细规划逻辑地址空间,还能勉强建立(操作系统程序内部)逻辑地址到(其所装入的物理内存的)物理地址间的相等关系,但是这一点对于后续装入的应用程序,几乎是无法也不可能保证的。
|
|
|
|
|
|
|
|
|
|
为了实现程序逻辑地址到(其装入物理内存后的)物理地址的转换,保证程序对数据的正确寻址,采用RV64G指令集的RISC-V处理器在监管模式(即S模式,也就是我们的PKE操作系统代码运行的特权模式)提供了三种逻辑地址到物理地址的转换方式:Bare,Sv39和Sv48。由于逻辑地址到物理地址的转换与物理内存的管理有着紧密的关联,所以以上三种方式也被称为虚拟内存管理(Virtual Memory Management,简称VMM)方式。其中Bare模式是最简单的VMM方式,即寻址时不对虚拟地址进行任何转换,所访问的物理内存地址就等于虚拟内存地址,这种方式在操作系统启动和刚进入S模式时很有用,单任务模式(只执行一个应用)下仍然可用,但多任务模式(启动多个进程)下就没法用了;Sv39和Sv48是页式虚拟内存的管理方式,它们分别支持39位和48位的逻辑地址,且将物理内存以页面(page)的粒度进行管理。Sv39和Sv48这两种VMM用得较多的是Sv39,Sv48只是在Sv39上的一个简单扩展,所以在后续讨论中,我们将着重讨论Sv39。
|
|
|
|
|