OS-Lab3总结
进程控制块
进程控制块 PCB 是一个很重要的内容。
1  | /* include/trap.h 文件内容 */  | 
asid 之所以要单独拎出来而不能直接使用 envid(明明他们都是独特的),是因为我们要将 asid 塞入 TLB 表项中,这对 asid 的位长提出了限制。我们对于 asid 位长的限制是 6 位,也就是说我们最多有 64 个可供分配的 asid。我们需要为 asid 建立分配回收机制。
在实验中,存放进程控制块的物理内存在系统启动后就已经分配好,就是 envs 数组。为快速分配进程控制块,我们同样需要使用链表来管理进程块。
env_init:初始化进程块链表,并进行了段地址映射。env_setup_vm:初始化进程地址空间。env_alloc:分配一个进程块。load_icode:将进程二进制映像装入内存。load_icode_mapper:作为elf_load_seg的回调函数,为进程内容分配物理页面并建立映射。env_create:创建一个进程。env_free:释放一个进程。env_destroy:摧毁一个进程。env_run:让一个进程运行起来。
真正创建进程的过程:分配一个 Env 结构体,设置进程控制块,将程序载入到该进程的地址空间。
异常处理
在产生异常时,我们会进入到 kern/entry.S 内进行异常分发处理。
异常处理函数向量表在 kern/trap.c 中设置。在 kern/genex.S 中设置了一些异常处理函数。
推荐阅读 include/asm/asm.h 中的宏,有助于理解汇编代码。
进程调度
进程调度的函数位于 kern/sched.c 中。课程组进行调度的逻辑比较简单,在课上上机时出的题可能是需要实现更加复杂的调度逻辑。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bluebean's Blog!
 评论




