系统初启 - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Table of Contents

系统初启的过程

预备工作

  • 将操作系统的源代码逐一编译后连接到一起构成一个单一的目标文件,然后存放在根目录下的/unix文件中
  • 将硬件引导装入程序的地址设置到开关寄存器

非操作系统完成的初启部分

  • 按下启动键
  • 启动存放在只读存储器中的第一级引导程序,将存放在根存储设备上的0#块装入内存,该块中包含了第二级引导程序
  • 第二级引导程序查找名为"/unix"的文件并将其装入内存低地址区
  • 从内存0#地址启动该系统,由unix系统自己来进行其他的初启工作

操作系统完成的初启部分

  • 0#内存单元中存放的是一条转移指令(low.s文件的第508行),转移到low.s文件的522行,执行系统引导程序start,这是一段汇编代码
  • start函数在进行了一些初始化处理后又转入一段c语言程序main,对系统进行进一步初始化
  • 系统在初启的过程中生成了0#进程与1#进程两个系统最初始的进程,这正是我们接下来要讨论的问题

初始进程

0#进程

  • 0#进程的产生过程:
    • start中KISA6被指向用户可用内存区域的起始位置,并扫清了该区域,用以存放0#进程的PPDA区,并为其初始化了栈顶指针
    • main中为proc[0]设置相应参数,并将其置为0#进程的proc结构
    • 可以说0#进程是由系统强制生成的,它没有父进程
  • 0#进程的作用:
    • 1.产生1#进程
    • 2.执行进程图像调度函数sched
  • sched函数不会有返回.除非操作系统程序终结,否则0#进程不会终止,它总是在需要进行进程调度时被唤醒,完成任务后又进入睡眠状态

1#进程

  • 1#进程由0#进程在main函数中产生,它是1#进程的子进程
  • 1#进程在生成后改换图像转而执行/etc/init程序,它的主要作用是为每个终端创建一个子进程
  • 1#进程在为每个终端创建完子进程后进入睡眠状态,系统初启到此结束
  • 1#进程会在某一终端子进程终止时被唤醒,重新为该终端生成一个进程
⚠️ **GitHub.com Fallback** ⚠️