Linux从上电到登录
步骤:引导、加载、挂载、运行、执行、登录
流程:电源接通–>cpu通电运行–>跳转至bios–>bios读取硬件信息,获得设备启动和启动信息–>初始化硬件设备–>于第一个启动设备的MBR读取bootloader执行–>启动引导程序uboot–>uboot初始化、启动–>传递参数给内核 -->调用内核–>内核解压–>initrd.img解压到ramdisk中–>挂载initrd至根目录–>检测initrd中的linuxrc,执行脚本–>挂载根文件系统 -->根目录下init–>系统初始化,运行级别设置(inittab)–>系统环境init(rcS.conf)–》运行级别环境初始化(rc[0-6].d)–>终端init–>/bin/login
BIOS阶段(启动内核)
- 按下电源,计算机通电,接通cpu的电路,然后通过cpu的针脚让cpu运行起来,执行相关代码跳到bios
- 读取CMOS信息,开机自检,检测硬件设备是否故障、故障停机和恢复
- 获取硬件设备信息和启动信息(启动设备和启动顺序)、开始硬件初始化,规定从启动设备开始读取MBR
- MBR的ROM中读取并执行启动引导程序(uboot为例),传递内核启动参数、initrd.img和target list(or dtb image),寻找内核并加载到内存中
- 详见kernel/Documentation/arm/Booting
内核启动到rootfs挂载阶段(启动init)
-
使用Buysbox制作根文件系统
-
读取ramdisk路径,挂载虚拟根文件系统(initrd.img、initrd.cpio、initramfs)到根目录
-
在vrtfs中,以用户态环境完成内核中在启动阶段不易完成的工作,加载需要的模块等
-
查找vrtfs中linuxrc文件,挂载真正的rootfs,切换根目录,在根目录执行init
-
内核启动最后阶段三个进程idle、init、kthreadd
系统初始化
系统运行级别获取
7个运行级别(systemd管理的系统是没有/etc/inittab文件的,即使有也仅仅只是出于提醒的目的,因为systemd没有了运行级别的概念)
0:halt,即关机
1:单用户模式
2:不带NFS的多用户模式
3:完整多用户模式
4:保留未使用的级别
5:X11,即图形界面模式
6:reboot,即重启
系统环境初始化
其中exec /etc/rc.d/rc.sysinit这一行就表示要执行/etc/rc.d/rc.sysinit文件,该文件定义了系统初始化(system initialization)的内容:
(1) 确认主机名。
(2) 挂载/proc和/sys等特殊文件系统,使得内核参数和状态可与人进行交互。
(3) 启动udev,也就是启动类似windows中的设备管理器。
(4) 初始化硬件参数,如加载某些驱动,设置时钟等。
(5) 设置主机名。
(6) 执行fsck检测磁盘是否健康。
(7) 挂载/etc/fstab中除/proc和NFS的文件系统。
(8) 激活swap。
(9) 将所有执行的操作写入到/var/log/dmesg文件中。
运行级别初始化
Linux采用了将各运行级别初始化内容分开管理的方式,将0-6这7个运行级别要执行的初始化脚本分别放入rc[0-6].d这7个目录中。实际上/etc/init.d/下的脚本才是真正的脚本
终端初始化
调用登录程序/bin/login,getty进程
--笔记总结,后续细化--