比如按下电脑上的电源按钮, 这个过程就是’上电’.
上电后, CPU的RESET引脚会产生一个逻辑值来复位CPU, CPU唤醒后, CPU将在0xfffffff0处执行一条长跳转指令, 直接跳到固化在ROM中的启动代码处(即BIOS), 然后执行BIOS的代码
顾名思义, BIOS程序负责检测系统外围关键设备比如CPU, 内存, 显卡, I/O, 键盘鼠标等是否正常, 如果自检无法通过则系统无法启动. 检测通过后会显示出这些设备的信息.
此时, BIOS需要知道"下一阶段的启动程序"是谁, 所以需要从Boot的启动序列中顺序检查该设备是否可以启动, 可以启动的标志就是该设备第一个分区最前面的512字节(即主引导记录MBR)的最后两个字节是不是0x55和0xaa. 为什么是0x55和0xaa? 因为AA展开为10101010, 55展开为01010101,变成串行电平的话就是一个占空比为50%的方波, 这种方波在电路中最容易被分辨是否受干扰或者畸变.
BIOS把MBR这第一部分引导代码复制到0x7c00地址所在的物理内存中, 就退出了. 被复制的这部分代码就是BootLoader, 比如grub就是一种常见的BootLoader. 系统读取内存中的grub配置信息(定义在/etc/grub.con,以及/etc/grub/menu.lst和/etc/grub.conf的软连接),并依照此配置信息生成的内核列表来启动不同的操作系统。
MBR共512字节, 其中前446字节为引导程序及参数, 然后是4个16字节的“硬盘分区表”, 及2字节的结束标志.
硬盘分区表可以将一个硬盘最多分为4个一级分区, 一级分区又叫做主分区. 每个主分区占据16个字节, 这16个字节分为6个部分, 这6个部分主要描述了该分区的结构信息. 这里重点关注第一个字节, 如果该字节为0x80, 则该分区是激活分区, 激活分区中存储了加载器. MBR找到加载器后就会把CPU的控制权交给加载器然后退出.
另外扩展一点, 分区结构信息中的最后四个字节描述了该主分区的扇区总数, 所以该分区的扇区总数最多不会超过2的32次方, 如果每个扇区为512字节, 那么意味着该分区最大不超过2TB. 所以如果想使用更大的硬盘, 可以提高每个扇区的字节数或者增加扇区总数.
CPU的控制权交给硬盘的激活分区分为2种情况:
控制权转交给操作系统后, 操作系统的内核首先被载入内存.
以Linux系统为例, 先载入/boot目录下面的kernel.内核加载成功后, 第一个运行的程序是/sbin/init.它根据配置文件(Debian系统是/etc/initab)产生init进程.这是Linux启动后的第一个进程, pid进程编号为1, 其他进程都是它的后代.
然后, init线程加载系统的各个模块, 比如窗口程序和网络程序, 直至执行/bin/login程序, 跳出登录界面, 等待用户输入用户名和密码.
至此, 全部启动过程完成.
详细可以查看参考这篇博文史上最详细linux启动过程讲解—没有之一.
主引导记录
linux启动过程
关于0xAA和0x55
Linux启动过程详解
计算机的启动过程(详细)
史上最详细linux启动过程讲解—没有之一