rCore practising 2
2023年春夏季开源操作系统训练营 IceCliffs
课后习题答案
编程题
- *** 实现一个裸机应用程序A,能打印调用栈。
- ** 扩展内核,实现新系统调用get_taskinfo,能显示当前task的id和task name;实现一个裸机应用程序B,能访问get_taskinfo系统调用。
- ** 扩展内核,能够统计多个应用的执行过程中系统调用编号和访问此系统调用的次数。
- ** 扩展内核,能够统计每个应用执行后的完成时间。
- *** 扩展内核,统计执行异常的程序的异常情况(主要是各种特权级涉及的异常),能够打印异常程序的出错的地址和指令等信息。
注:上述编程基于 rcore/ucore tutorial v3: Branch ch2
问答题
- * 函数调用与系统调用有何区别?
- ** 为了方便操作系统处理,M态软件会将 S 态异常/中断委托给 S 态软件,请指出有哪些寄存器记录了委托信息,rustsbi 委托了哪些异常/中断?(也可以直接给出寄存器的值)
- ** 如果操作系统以应用程序库的形式存在,应用程序可以通过哪些方式破坏操作系统?
- ** 编译器/操作系统/处理器如何合作,可采用哪些方法来保护操作系统不受应用程序的破坏?
- ** RISC-V处理器的S态特权指令有哪些,其大致含义是什么,有啥作用?
- ** RISC-V处理器在用户态执行特权指令后的硬件层面的处理过程是什么?
- ** 操作系统在完成用户态<–>内核态双向切换中的一般处理过程是什么?
- ** 程序陷入内核的原因有中断、异常和陷入(系统调用),请问 riscv64 支持哪些中断 / 异常?如何判断进入内核是由于中断还是异常?描述陷入内核时的几个重要寄存器及其值。
- * 在哪些情况下会出现特权级切换:用户态–>内核态,以及内核态–>用户态?
- ** Trap上下文的含义是啥?在本章的操作系统中,Trap上下文的具体内容是啥?如果不进行Trap上下文的保存于恢复,会出现什么情况?
实验练习
sys_write安全检查
问答作业
正确进入 U 态后,程序的特征还应有:使用 S 态特权指令,访问 S 态寄存器后会报错。请自行测试这些内容 (运行 Rust 三个 bad 测例 ) ,描述程序出错行为,注明你使用的 sbi 及其版本。
请结合用例理解 trap.S 中两个函数
__alltraps
和__restore
的作用,并回答如下几个问题:L40:刚进入
__restore
时,a0
代表了什么值。请指出__restore
的两种使用情景。L46-L51:这几行汇编代码特殊处理了哪些寄存器?这些寄存器的的值对于进入用户态有何意义?请分别解释。
1
2
3
4
5
6ld t0, 32*8(sp)
ld t1, 33*8(sp)
ld t2, 2*8(sp)
csrw sstatus, t0
csrw sepc, t1
csrw sscratch, t2L53-L59:为何跳过了
x2
和x4
?1
2
3
4
5
6
7ld x1, 1*8(sp)
ld x3, 3*8(sp)
.set n, 5
.rept 27
LOAD_GP %n
.set n, n+1
.endrL63:该指令之后,
sp
和sscratch
中的值分别有什么意义?1
csrrw sp, sscratch, sp
__restore
:中发生状态切换在哪一条指令?为何该指令执行之后会进入用户态?L13:该指令之后,
sp
和sscratch
中的值分别有什么意义?1
csrrw sp, sscratch, sp
从 U 态进入 S 态是哪一条指令发生的?
对于任何中断,
__alltraps
中都需要保存所有寄存器吗?你有没有想到一些加速__alltraps
的方法?简单描述你的想法。
Reference
rCore practising 2