Boot

Tags

计算机启动过程

  • 加载BIOS
    • BIOS:固化在电脑主板上ROM芯片中的一组程序
      • 功能:提供最底层硬件设置和控制
      • 问题:16~20位实模式寻址,寻址能力弱,不支持大于2TB的硬盘驱动,历史遗留
    • 硬件自检:检查计算机硬件组件是否可以正常工作
    • 读取启动顺序:选择驱动计算机启动的设备
  • 读取MBR
    • MBR(Master Boot Root):硬盘第0磁头第0磁道上第一个扇区,装有启动用的信息(512byte)
      • 0~446byte:启动代码与数据
      • 447~510: 4个16byte的分区参数表
      • 511~512: magic number AA和55,有这两个数 = 硬盘已初始化
    • 分区问题
      • 分区理由:数据安全性、加速数据查找
      • 一个硬盘的主分区数:1~4(因为MBR只能存四个主分区表的信息,系统必须装在主分区上)
        • 主分区中只能有一个活动分区
      • 扩展分区:0~1,且主+扩 ≤ 4
      • 扩展分区必须划分为若干个逻辑分区
  • Boot Loader
    • 作用
      • 初始化硬件设别
      • 建立内存映射
      • 准备调用系统内核
    • Linux加载器:LILO(out of date), GRUB
    • GRUB磁盘引导过程:
      • BIOS把MBR读入0x7c00处,执行主引导程序
        • 检查介质可用与否([0x7dfe] == [0xaa55] ? 继续 : 找其他介质)
        • 若可用,则跳转0x7c00处执行MBR程序
        • 找主分区中的活动分区(若活动分区数≠1,则停止)
        • 将活动分区第一个扇区(Boot Sector)读入0x7c00
        • 再检查操作系统可用与否([0x7dfe] == [0xaa55] ? 继续 : 停止或软盘启动)
        • 跳转0x7c00执行系统启动程序
      • 识别文件系统
      • 加载 系统引导菜单 和 内核映像
        • 内核用于管理系统资源,常驻内存
        • 内核映像:压缩后的内核镜像
        • notion image
  • 加载内核
    • 作用
      • 解压内核映像,装载至内存中
      • 初始化 内核里的函数 和 各种设备
    • 具体过程:汇编运行三个汇编文件
      • Bootsect.S
        • 换区换到Bootsect.s的尾部
        • 调用引导阶段函数(读Bootsect.s的末尾四个扇区和Setup.s的头四个扇区)
          • 设置堆栈参数啥的
        • 加载内存映像:大内核跳0x100000,小内核跳0x10000
        • 跳到Setup.s入口
      • Setup.S
        • 初始化硬件设备
        • 为内核程序的执行建立环境
        • 跳转Head.S(小内核跳到0x1000)
      • Head.S
        • 第一个start_32():解压内核,放到物理地址0x100000处
        • 第二个start_32():为Linux第一个进程建立环境(略),跳start_kernel()函数
        • start_kernel():建立Linux核心环境
    • 结果:Linux内核建立成功
  • 用户层设定运行等级
  • 设置用户层环境(rc.sysinit)
  • 启动内核模块(?)
  • 根据运行等级不同,初始化
  • 个性初始化
  • 登陆(/bin/login)