实现了在多个线程之间切换
Context *on_interrupt(Event ev, Context *ctx) {
if (!current) {
current = &tasks[0]; // First trap
} else {
current->context = ctx;
current = current->next;
}
return current->context;
}
内核线程 v.s. 进程,还差了什么?
我们看到的世界未必真实
pmap: 进程拥有 $[0,2^{64})$ 的地址空间
地址翻译
是的,你没看错,AddrSpace 就是一个数据结构 $f$
bool vme_init (void *(*alloc)(int), void (*free)(void *));
void protect (AddrSpace *as);
void unprotect(AddrSpace *as);
void map (AddrSpace *as, void *va, void *pa, int prot);
Context *ucontext (AddrSpace *as, Area kstk, void *entry);
“映射了,但没有真的映射”
还记得 mmap 分配空间/映射磁盘的例子吗?
mmap.mmap(fd, prot=mmap.PROT_READ, length=128 << 30)
“映射了很多次,但又只有一个”
我们相信:厉害的操作系统,同一份代码仅有一个副本
“复制了,但没有完全复制”
复制,很有可能白复制