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!
评论