Skip to content

Commit 28460bb

Browse files
Update p3-batchos.md
1 parent 6c805ac commit 28460bb

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

lec3/p3-batchos.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,11 @@ unsafe fn load_app(&self, app_id: usize) {
617617

618618
- fence.i :用来清理 i-cache
619619

620-
注:``fence.i``是i-cache屏障(barrier)指令,非特权指令,属于 “Zifencei”扩展规范
620+
- fence.i 是一条专门用于保持指令缓存一致性的指令,它通常用于程序需要在运行时修改代码或者生成新的代码片段的情境下,确保修改后的代码能够被正确地从内存中取出并执行。
621+
622+
- 对于大多数普通应用程序,不涉及自修改代码或 JIT 编译的场景,fence.i 不会经常被使用。
623+
624+
* 注:``fence.i``是i-cache屏障(barrier)指令,非特权指令,属于 “Zifencei”扩展规范
621625

622626
**WHY?**
623627

@@ -1058,6 +1062,34 @@ impl TrapContext {
10581062
cx
10591063
```
10601064

1065+
<!--1. set_sp 方法
1066+
1067+
功能:这个方法用于设置栈指针(stack pointer, SP)。
1068+
实现:它直接将传入的 sp 值赋给 self.x[2],假设在这个上下文中,寄存器数组 x 的第 2 个元素是用来存储栈指针的。
1069+
2. app_init_context 函数
1070+
1071+
目标:初始化一个应用程序的陷阱上下文。
1072+
1073+
步骤:
1074+
1075+
let mut sstatus = sstatus::read();
1076+
1077+
读取当前的状态寄存器 sstatus,这通常涉及到 CPU 特权级别、全局中断使能等状态。
1078+
sstatus.set_spp(SPP::User);
1079+
1080+
设置陷阱返回时的特权级别为用户模式 (SPP::User)。这意味着当从陷阱返回时,CPU 将进入用户模式。
1081+
let mut cx = Self { ... };
1082+
1083+
创建一个新的 TrapContext 实例,初始化其内部的寄存器数组 x 为 [0; 32] (表示32个通用寄存器,初始值为0)。同时,将 sstatus 和 sepc 初始化为 sstatus 和 entry 参数。
1084+
sepc 是保存异常发生时的程序计数器地址,通常用于返回处理完异常后继续执行的位置。
1085+
cx.set_sp(sp);
1086+
1087+
调用方法 set_sp 设置栈指针,确保程序在陷阱返回后有正确的栈环境。
1088+
cx
1089+
1090+
返回初始化好的 TrapContext 实例。
1091+
-->
1092+
10611093

10621094
---
10631095
##### 运行下一程序

0 commit comments

Comments
 (0)