大连网站建设是什么,建设工程安全员教育网站,网站设计目标与背景,广州建设信息网官方网站文章目录 用户态和内核态mstatus设置模式切换核心流程封装代码背景解释代码示例解析解释目的 用户态和内核态 mstatus设置
此时UIE设置为1和MPIE为1#xff0c;MPP设置为0 代表当前权限允许UIE中断发生#xff0c;并且在第一个mret后将权限恢复为用户态#xff0c;同时MIE也… 文章目录 用户态和内核态mstatus设置模式切换核心流程封装代码背景解释代码示例解析解释目的 用户态和内核态 mstatus设置
此时UIE设置为1和MPIE为1MPP设置为0 代表当前权限允许UIE中断发生并且在第一个mret后将权限恢复为用户态同时MIE也保持开启
模式切换
ecall相当于一次触发异常然后在对应的异常中去处理对应的系统调用
核心流程
首先在进程中使用到gethartid函数gethartid函数保存a7寄存器为调用号然后ecall进行系统调用ret再回到调用gethartid函数的下一条地址ecall会触发中断进入trap_vector此时的mepc是ecall地址mecause是8trap_vector会保存当前上下文然后增加一个指向保存了的上下文的地址作为trap_hander的第三个参数trap_hander结束后会将返回值写到mepc中然后mret到mepc对应的位置此时是ecall4的地址trap_hander中会执行syscall函数参数是传入的之前刚开始保存了的上下文然后syscall函数中的会对该上下文的a0寄存器赋值为hart的id此时回到最后恢复保存的上下文的地方也就是trap_vector那里恢复上下文后此时返回值正好是hart的id然后mepc也被选择到了ecall4那么返回到上一级为gethartid的ret函数此时返回值也是hart的id即得到hartid 原则a6其实也可以作为参数
封装
就是用户态使用的函数用到的头文件和内核态使用的函数用到的头文件建议分别封装到各个文件中在用户态中的作为C库内核态中的内核维护如果头文件相关定义不一致可能会出现问题
代码
https://github.com/FULLK/risllkos/tree/main/Fullkenerl11
#ifdef CONFIG_SYSCALLli t0, 0xffffffff # Load the value 0xffffffff into register t0csrw pmpaddr0, t0 # Write this value to the PMP address register 0li t0, 0xf # Load the value 0xf (binary 1111) into register t0csrw pmpcfg0, t0 # Write this value to the PMP configuration register 0
#endif背景解释
在RISC-V架构中PMPPhysical Memory Protection是用于控制不同特权级别访问内存的能力的一个特性。它通过一系列配置寄存器PMP配置寄存器如pmpcfg0和地址寄存器PMP地址寄存器如pmpaddr0来定义内存区域的访问权限读、写、执行以及哪些特权模式可以访问这些区域。
代码示例解析
假设你正在开发一个RISC-V的操作系统并且使用QEMU作为模拟器来测试你的代码。当你升级到QEMU 6.0及以上版本时遇到了一个与PMP配置相关的问题如果没有设置任何PMP条目从Supervisor (S) 或 User (U) 模式进行的内存访问会导致异常。
解释 li t0, 0xffffffff: 这行代码将寄存器t0赋值为0xffffffff这个值在32位地址空间中代表一个非常大的地址几乎接近地址空间的最大值。按照标准这个值本意是用来设置PMP条目的上界地址但由于一些QEMU实现细节将其设置为全1时可能被解释为覆盖整个地址空间的特殊情况。 csrw pmpaddr0, t0: 此指令将寄存器t0的值写入到PMP地址寄存器0(pmpaddr0)试图设置PMP的第一个条目覆盖整个地址空间的访问权限。 li t0, 0xf: 这行代码设置寄存器t0为0xf二进制形式为1111。在PMP配置中每个位对应一个PMP条目的访问权限读、写、执行因此0xf意味着开启所有权限。 csrw pmpcfg0, t0: 最后这行代码将寄存器t0的值写入到PMP配置寄存器0(pmpcfg0)激活了第一个PMP条目并设置了读、写、执行的权限。
目的
这段代码的主要目的是作为临时解决方案确保即使在没有详细配置PMP条目的情况下用户和监督模式下的程序也能正常访问内存以避免在使用QEMU 6.0及以上版本时遇到的异常问题。它通过配置一个PMP条目来覆盖整个地址空间并赋予所有访问权限从而绕过了新版本QEMU对未配置PMP条目的严格检查。
在RISC-V架构中PMPPhysical Memory Protection物理内存保护机制通过一系列配置寄存器来控制对物理内存的访问权限以此增强系统的安全性。PMP寄存器分为地址寄存器如pmpaddrN和配置寄存器如pmpcfgN共同定义了多个内存访问控制区域。
当说“试图设置PMP的第一个条目覆盖整个地址空间的访问权限”时这指的是通过编程PMP的地址和配置寄存器来创建一个PMP规则这个规则旨在允许对整个物理地址空间执行读、写和执行操作而不受任何访问限制。具体到代码示例 li t0, 0xffffffff这一行是装载指令将立即数0xffffffff即32位地址空间中的最大值减一送入寄存器t0。在TORTop of Range匹配模式下PMP地址寄存器中的值通常表示区间的上界地址。理论上全1的上界地址可能被解释为企图涵盖整个地址空间的意图尽管实际上因为地址对齐和边界处理它可能无法精确覆盖到地址空间的最后一个字节。 csrw pmpaddr0, t0这条指令将t0寄存器中的值写入到PMP地址寄存器0(pmpaddr0)试图设置PMP的第一个条目的上界地址。 li t0, 0xf 和 csrw pmpcfg0, t0这两行是配置PMP条目的权限。0xf十六进制等于二进制的1111分别代表了读®、写(W)、执行(X)和开启(L)权限位。通过写入到pmpcfg0为PMP条目0设置了全权限。
然而根据RISC-V的PMP规范单个PMP条目通常不能直接覆盖整个地址空间特别是在TOR模式下pmpaddr0寄存器存储的是第一个区间的上界物理地址的高32位即使设置为全1也无法完美覆盖到地址空间的最末尾。而且如之前讨论中提及的QEMU的特定实现方式可能使得pmpaddr0 0xffffffff在某些情境下被特殊处理看似覆盖了整个地址空间。