Boot
计算机启动过程
- 加载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执行系统启动程序
- 识别文件系统
- 加载 系统引导菜单 和 内核映像
- 内核用于管理系统资源,常驻内存
- 内核映像:压缩后的内核镜像
- 加载内核
- 作用
- 解压内核映像,装载至内存中
- 初始化 内核里的函数 和 各种设备
- 具体过程:汇编运行三个汇编文件
- 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内核建立成功