Linux启动过程

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

阅读更多
个人分类: 工作随笔
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭