4-计算机os启动流程
计算机os启动流程
主板通电,立刻找bios程序启动,可以按F2或esc等,停在bios界面。
1:装好os后往往hdd优先级设置最高,bios到硬盘第一个扇区(512bytes)找bootloader。
512bytes=446bytes BootLoader(grub是bootloader其中一种)+64位是分区信息+2bytes是结束标志。
但是这512byte存的只是grub主程序,还有其他的要加载,例如grub的配置文件/boot/grub/grub.conf在其他mbr中
2: grub去加载内核(操作硬件的程序集合)到内存当中。
grub是最流行的bootloader。
提供一个界面让用户选择启动哪个os,例如装了双系统的主机,用户选择后,或者时间到选择默认选项,(linux提供修复模式的系统后面说)。
选择好之后,读取grub的配置文件/boot/grub/grub.conf加载对应的内核,grub将控制权移交给kernel。
3:kernel获得控制权后
a.解压缩自己并安装相应驱动
b.初始化与文件系统相关的虚拟设备,LVM或RAID、初始化内存管理,检测内存大小、初始化系统的进行见通信等等与硬件平台相关的初始化工作。
4:装载根文件系统,挂在根目录下面,即装载os接口等文件信息,还有在os接口之上的解释器程序文件。
根文件系统至少包括以下目录:
/etc/ :存储重要的配置文件。
/bin/ :存储常用且开机时必须用到的执行文件。
/sbin/ :存储着开机过程中所需的系统执行文件。
/lib/ :存储/bin/及/sbin/的执行文件所需的链接库,以及Linux的内核模块。
/dev/ :存储设备文件。
注:五大目录必须存储在根文件系统上,缺一不可。
以只读的方式挂载根文件系统,之所以采用只读的方式挂载根文件系统是因为:此时Linux内核仍在启动阶段,还不是很稳定,如果采用可读可写的方式挂载根文件系统,万一Linux不小心宕机了,一来可能破坏根文件系统上的数据,再者Linux下次开机时得花上很长的时间来检查并修复根文件系统。
挂载根文件系统的而目的有两个:一是安装适当的内核模块,以便驱动某些硬件设备或启用某些功能;二是启动存储于文件系统中的init 服务,以便让 init服务接手后续的启动工作。
5:启动第一个进程 init (centos7启动第一个进程systemd),init祖宗进程启动标志着kernel顺利启动完成,下面就是初始化os使用环境了。
先从文件系统中找到init服务启动,读取运行级别
init服务会读取/etc/inittab文件,根据/etc/inittab中的设置数据进行初始化系统环境的工作。 /etc/inittab定义 init 服务在 linux启动过程中必须依序执行以下几个脚本文件:
/etc/rc.d/rc.sysinit
/etc/rc.d/rc
/etc/rc.d/rc.local
/etc/rc.d/rc.sysinit
主要的功能是设置系统的基本环境,例如图形界面。
1 (1)启动udev 2 3 (2)设置内核参数 4 5 执行sysctl –p ,以便从 /etc/sysctl.conf 设置内核参数 6 7 (3)设置系统时间 8 9 将硬件时间设置为系统时间 10 11 (4)启用交换内存空间 12 13 执行 swpaon –a –e,以便根据/etc/fstab的设置启用所有的交换内存空间。 14 15 (5)检查并挂载所有文件系统 16 17 检查所有需要挂载的文件系统,以确保这些文件系统的完整性。检查完毕后以可读可写的方式挂载文件系统。 18 19 (6)初始化硬件设备 20 21 Linux除了在启动内核时以静态驱动程序驱动部分的硬件外,在执行rc.sysinit 时,也会试着驱动剩余的硬件设备。 r c.sysinit 驱动的硬件设备包含以下几项: 22 23 a)定义在/etc/modprobe.conf 的模块 24 25 b) ISA PnP的硬件设备 26 27 c) USB设备 28 29 (7)初始化串行端口设备 30 31 Init服务会管理所有的串行端口设备,比如调制解调器、不断电系统、串行端口控制台等。Init 服务则通过rc.sysinit来初始化linux 的串行端口设备。当rc.sysinit 发现 linux 才能在这 /etc/rc.serial 时,才会执行 /etc/rc.serial ,借以初始化所有的串行端口设备。因此,你可以在 /etc/rc.serial 中定义如何初始化 linux所有的串行端口设备。 32 33 (8)清除过期的锁定文件与IPC文件 34 35 (9)建立用户接口 36 37 在执行完3个主要的 RC Script 后, init服务的最后一个工作,就是建立linux的用户界面,好让用户可以使用 linux 。此时init 服务会执行以下两项工作: 38 39 (10)建立虚拟控制台 40 41 Init 会在若干个虚拟控制台中执行 /bin/login,以便用户可以从虚拟控制台登陆 linux 。 linux 默认在前6个虚拟控制台,也就是 tty1~tty6 ,执行 /bin/logi 登陆程序。当所有的初始化工作结束后,cpu_idle()函数会被调用来使系统处于闲置( idle)状态并等待用户程序的执行。至此,整个Linux内核启动完毕。

浙公网安备 33010602011771号