跳到主要内容

OS启动

注意

这一部分涉及文件系统, CPU状态, 中断等内容. 有问题可以先去看这一部分.

操作系统启动

磁盘的组织结构规范,以MBR和Legacy BIOS启动为例。

一共可以分为五步(CPU-磁盘-分区-扇区-表和程序):

  1. CPU激活,boot启动BIOS
  2. BIOS获权硬件自检POST通知CPU各种硬件设备的中断向量地址,并提供BIOS中断服务程序。
  3. BIOS读取CMOS中的Boot Sequence,依次加载MBR,寻找引导硬盘
  4. MBR(磁盘的第一个扇区55AAh结尾)获权通过DPT(硬盘分区表)查找活动分区
  5. PBR(操作系统分区的第一扇区首字母为0x80h)找到分区下的引导程序地址
  6. 引导程序Loader引导操作系统启动

操作系统初始化

  1. Loader的任务和boot程序很相似,将存储设备中的操作系统内核kernel.dll载入内存;加载内核头程序:在内核启动前还需要进行全局段描述表GDT、中断描述表IDT以及页表PT的结构初始化,为后面内核进行中断处理和内存管理的初始化奠定基础;然后将控制权交给kernel。
  2. kernel:内核初始化的主要是初始化处理器和中断、各个管理模块、最后创建主进程。以Linux为例,内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。
    1. 中断处理初始化:依托于内核头程序完成的 IDT 以及 GDT ,我们在进行一些中断策略等初始化操作就完成了中断处理的初始化了。
    2. 内存管理初始化:对于内存管理的初始化,主要就是如何获取物理内存信息,如何进行物理内存的分配管理以及如何设计可用内存和可用物理页的分配与回收等等。
    3. 进程管理初始化:而对于进程管理我们可以分为两个步骤,如何设计我们的进程控制结构PCB以及如何设计进程间的调度策略。
    4. 虚拟文件系统初始化:如何进行文件到磁盘逻辑地址的映射,逻辑地址到物理地址的映射也是我们需要解决的事情。当我们进行open()、read()、write()这些系统调用的时候肯定需要对底层的物理磁盘介质进行操作,而虚拟文件系统 VFS 就是我们文件与物理介质中的胶水层。这一步其实并没有进行整个文件系统的初始化,没有进行物理磁盘文件系统的挂载,而仅仅是创建了第一个挂载点目录/ 和进行一些格式的定义 ,也就是说我们现在并不能通过类似 /root/xxx 去访问文件。
  3. 在虚拟文件系统初始化完成之后就需要进入用户态以完成真正的用户文件系统的创建过程。ramdisk/init 先根据存储系统的类型加载驱动,设置真正的根文件系统,然后我们就可以访问根文件系统中的 init 程序做一些用户态的初始化了。
  4. 2号用户进程是内核进程的祖先,管理调度其它的内核线程。它会一直循环运行 kthreadd 函数,这个函数主要就是负责所有内核态的线程的调度和管理。等到内核态也有了管理者,整个内核的初始化流程也就结束了。用户就可以开始自己创建进程,运行各种软件了。然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。
  5. 至此,全部启动过程完成。
Loading Comments...