状态,内核在分配和回收时只操作这些段表,不直接碰物理地址。
分配空间时若找到空闲段就标记为已占用,回收空间时则合并相邻的空闲块。
他把这个逻辑写成一段大约三十行的程序,一边写一边在脑子里逐行推演边界情况。
“分配段大小:
寻空闲段其中段长>=大小
若找着:
标该段已占用
返段址
否则:
返空
止
回”
写完之后他把这一段和引导程序衔接在一起,确认没有语法冲突,然后继续往下写进程管理模块。
进程管理的核心是时间片轮转。
每一道运行中的程序被看作一个进程,内核记录它的状态、寄存器值和程序计数器位置,每个进程获得一个固定长度的时间片,时间片用完之后内核自动切换上下文保存当前进程状态、恢复下一个进程的状态、把中央处理器交给它。
他为此设计了一个进程控制块的结构,包含进程标识、运行状态、寄存器备份、优先级和时间片计数器,并配有相应的调度机制让多个程序像轮流使用机器一样交替运行。
“若时间片满:
存当前
恢复下一进程
转继续
止”
他写到设备驱动部分的时候,天已经黑透了。
键盘的输入中断、显示器的输出缓冲、磁盘的读写控制,每一块都需要单独的接口定义和状态机逻辑。
他没有把所有的驱动一次性写完,而是先搭了一个基础的设备抽象层,把每种设备的操作抽象成统一的“读”“写”“控制”三个入口,具体的实现留到后续填充。
这样将来接入任何新设备都不会影响到上层应用程序的执行。
第一版完整的系统内核手稿写完的时候,时钟已经指向下午五点。
他把手稿从头到尾通读了一遍,修改了几处边界条件处理不当的地方,又补了一段异常处理逻辑,确保程序在遇到未定义指令或者内存越界时不会直接死机。
“异常:
停当前
记错误码于日志
转调度”
林北没有立刻把这些代码全部录入机器,而是下个礼拜一上班的时候,跑一趟超算中心,打算使用超级计算机上的仿真环境,把整个内核的架构模型输入进去跑一遍。
确认仿真结果确认逻辑无死锁、内存无泄漏、时间片切换没有跨周期丢失之后,这套系统才能证明没有问题。
至于眼前的这台计算机,事实上,连一个壳