复习
本次课回答的问题
本次课主要内容
为什么死循环不能使计算机被彻底卡死?
原理上
实际上
def positive_integers():
i = 0
while i := i + 1:
yield i
positive_integers()
并不是 “调用” 它执行
我们同样也可以在 C 里这么做
call yield
切换到另一个执行流寄存器
内存
持有的操作系统对象 (不可见)
寄存器组 (\$x0...\$x31, \$pc) 只有一份,物理内存也只有一份
操作系统代码最重要的 invariant (假设单处理器)
struct proc
里的指针访问 (struct trapframe
)用最直观的 “封存” 方式
struct page { int prot; void *va, *pa; }
struct proc {
uint64_t x1, x2, ... x31;
struct page pages[MAXPAGES];
};
x86-64
xv6 (不限于 RISC-V)
ecall 指令的行为
ecall 时额外的系统状态
把寄存器保存到 trap frame
切换到内核线程
tf->kernel_sp
tf->kernel_hartid
tf->kernel_trap
tf->kernel_trap
执行所有进程都被 “封存”
struct proc
就可以找到寄存器、内存、操作系统对象、……操作系统代码可以为所欲为
在执行完 “寄存器现场保存” 之后
struct proc
因为被封存,我们的处理器
本次课回答的问题
Take-away messages
struct proc
) 表示进程对象