( 1 )打开 PC 电源
PC 加电后,一个特殊的硬件电路会触发 CPU 的 Reset 脚的逻辑值,然后一些 CPU 寄存器,如 CS , eip 等被给定一个值,接着 CPU 跳转到一个固定地址开始执行代码( BIOS );
( 2 ) BIOS 自检,按设置的设备启动
BIOS 对硬件进行一系列彻底的检查,如 CPU 类型、速度、缓存等,主板类型,内存速度、容量,硬盘大小、类型和工作模式,风扇速度等。 BIOS 完成自检后,查找一个可以引导的操作系统,并查看用户配置的启动设备(软盘、硬盘或者光盘启动)。发现合法的设备后(读取 CMOS 中的引导设备信息), BIOS 就会把其第一扇区的内容( MBR )复制到内存中。然后跳至刚加载的地址并执行之。
( 3 )启动设备上安装的引导程序 LiLo 或 Grub
在 Linux 启动中,当 BIOS 发现是由硬盘引导系统后,就找到此硬盘的 MBR ,将 MBR 中保存的引导程序加载到内存中,然后将 CPU 的控制权交给 MBR 中的这段代码。 MBR 中的内容可分为三部分: 1 )真正的可执行代码,即 BootLoader 代码部分; 2 )一个 64 字节的分区表,包含四个分区记录; 3 )结束标识符( 0xAA55 ),用来做 MBR 的有效性检测。 BootLoader 开始执行,它主要有 LiLo , Grub 。
( 4 )引导 Linux 内核映像
BootLoader 查找分区表中的活动分区(包含了真正分区的信息),通过这个信息找到真正的分区,然后从这个分区将 Linux 内核加载到内存,并 Initrd 文件系统到内存中。获得 CPU 控制权的内核开始执行: 1 )核心数据结构初始化 -- start_kernel() 函数,调用一系列初始化函数,完成 kernel 本身的设置,在其最后,通过调用 init ()函数,系统创建第一个核心线程,启动 init 过程; 2 )外设初始化— init() 函数,首先调用 do_basic_setup() 完成外设及其驱动程序的加载和初始化,文件系统初始化和 root 文件系统的安装; 3 ) do_basic_setup() 函数返回 init() 后, init() 打开 /dev/console 设备,重定 stdin 、 stdout 、 stderr 到控制台; 4 )最后,搜索文件系统中的 init 程序(或者由 init= 命令行参数指定的程序),并使用 execve() 系统调用 加载执行 Init 程序。到此 init() 函数结束,内核的引导部分也到此结束了。
( 5 )执行 Init 程序
Init 程序调用 rc.sysinit 和 rc 的等程序,完成系统初始化和运行服务后返回 Init 。 Init 程序执行的内容可以在 /etc/inittab 文件中定义。
A . Init 调用执行脚本文件 /etc/rc.d/rc.sysinit ,用来完成一些系统初始化的工作。包括:挂载进程文件系统 proc 、设定电脑名称和系统的时间、定义键盘、启用 swap 分区、检查根目录 (/) 有没有问题,并且挂载成可读可写的状态、设定系统的时间、加载一些其他的设备,如 RAID 和 LVM 等。当 rc.sysinit 程序执行完毕后,返回 Init 继续下一步。
B .在 rc.sysinit 执行后,通常接下来会执行到 /etc/rc.d/rc 程序 ,用来决定启用哪些服务。守护进程启动完成后, rc 程序也就执行完了,然后又将返回 Init 继续下一步。
C .这时,基本系统环境已经设置好了,各种守护进程也已经启动了。 Init 接下来会打开 6 个终端,以便用户登录系统。通过按 Alt+Fn(n 对应 1-6) 可以在这 6 个终端中切换。在 inittab 中的以下 6 行就是定义了 6 个终端:
1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6
在 2 、 3 、 4 、 5 的运行级别中都将以 respawn 方式运行 mingetty 。
( 6 ) Init 启动 mingetty ,打开终端供用户登录系统
Mingetty 是 getty 的简化, getty 的功能一般包括: 1 )打开终端线,并设置模式; 2 )输出登录界面及提示,接受用户名的输入; 3 )以该用户名作为 login 的参数,加载 login 程序。
( 7 )用户成功登录,进入 shell ,完成整个启动过程。
A . Login 程序判断 getty 传来的用户名,如果是 root ,则在 /etc/securetty 中指定的 tty 列表登录,否则失败;如果不是,查看是否存在 /etc/nologin 文件,存在则终止登录过程,不存在表示可以登录。
B .分析完用户名后, login 搜素 /etc/passwd 及 /etc/shadow 来验证密码。
C .成功登录后,检查是否需要输出上次登录信息和提示邮件,然后设置 shell 的 UID 、 GID 和相应的环境变量。
D .一切就绪后,为用户启动 shell ,如果没有设置,则默认是 /bin/bash ,工作目录默认是“ / ”。
Julia