知识储备:Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行
在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:
1、 引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。
2、Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。
3、 文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。
4、 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。
注意:1 cpu找到了bootloader,启动运行bootloader,在bootloader里面定义了linux内核等参数,bootloader会根据这些地址和参数去执行相应的东西,就这样
2 Linux内核来引导挂载相应的文件系统
流程图:
流程简介:
Linux的系统启动流程,boot loader,init
系统启动流程
以debian6为例
1 加载BIOS的硬件信息与进行自我测试,并取得启动设备(如硬盘、光盘、闪存)
2 读取并执行启动设备内MBR的boot loader(如grub等)
3 依据boot loader的设定加载kernel,kernel开始侦测硬件并加在驱动程序
4 硬件驱动成功后,kernel会主动呼叫init程序,而init会取得run-level信息
5 init执行/etc/init.d/rc脚本来准备软件执行的工作环境(如网络、时区等)
6 init执行run-level的各个服务之启动(scipt方式)
7 init执行/etc/rc.d/rc.local文件
8 init执行终端机启动login程序,等待用户登录
boot loader
1 每个硬盘的MBR只有一个
2 每个文件系统(filesystem,或者是partition)都会保留一块启动扇区(boot sector)
3 每个操作系统默认会安装boot loader到他自己的文件系统的boot sector中
4 boot loader可以安装在MBR中,boot loader也可以安装在boot sector中
5 boot loader可以将管理权转交给其他的boot loader
init初始程序及其配置文件/etc/inittab
/sbin/init最主要的功能就是准备软件执行的环境,包括系统主机名、网络设定、语系处理、文件系统格式即其他服务的启动
/etc/inittab是/sbin/init的配置文件,此配置文件类似script,需要一步一步执行
init处理流程,也就是/etc/inittab执行步骤
1 设置默认的runlevel id:2:initdefault:
2 系统启动初始化脚本 si::sysinit:/etc/init.d/rcS
3 运行runlevel为2的脚本 l2:2:wait:/etc/init.d/rc 2
4 设置ctrl+alt+del组合进行重启 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
5 设置电源管理 pf::powerwait:/etc/init.d/powerfail start
6 启动终端tty1 1:2345:respawn:/sbin/getty 38400 tty1
步骤详细分析
1 上表第2步调用rsS其实是调用/etc/init.d/rc S,
上表第3步也是同样调用/etc/init.d/rc 2
2 查看/etc/init.d/rc脚本,此脚本根据参数runlevel调用相应runlevel的脚本
相应runlevel的脚本的路径为/etc/rc$runlevel.d/
3 /etc/rc$runlevel.d/路径下脚本被依次执行,启动或关闭相应的服务
/etc/rc$runlevel.d/S* 需要开启的服务
/etc/rc$runlevel.d/K* 需要关闭的服务
4 /etc/init.d/rc.local脚本在/etc/rc$runlevel.d/路径下最后执行
/etc/init.d/rc.local脚本为用户自定义系统启动脚本
/etc/inittab主要语法
/etc/inittab由:(冒号)来分隔成4部分
1 id。最多4个字符,代表init的主要工作,只是简单说明
2 runlevel。代表该初始化动作在哪些runlevel下运行
3 action。代表初始化的特别动作
4 process。代表需要进行的命令,通常是一些script
更详细的可参考man inittab
action初始化特别动作
initdefault 代表预设的runlevel设定值
sysinit 代表系统初始化的动作
ctrlaltdel 代表按下这3个按键是否可以重启
wait 代表后面的process命令必须执行完毕才能继续
respawn
代表后面的process命令可以无限制的再生。
例如getty启动login,注销后,此动作还会启动login
runlevel执行等级
runlevel作用就是规定系统使用不同的服务来启动,根据目的设置相应的工作环境
不同版本的linux还需要查看/etc/inittab
0 halt 系统直接关机
1 single-user 单人维护模式,用在系统出问题时的维护
2 multi-user without NFS 多用户文本模式,无NFS服务
3 full multi-user 完整含有网络功能的多用户纯文本模式
4 unused 系统保留
5 X11 多用户图形界面,加载使用X Window
6 reboot 重启
相关文件
/boot/vmlinuz-$(uname -r) linux核心文件
/boot/initrd-$(uname -r) 启动时虚拟文件系统
/boot/grub/* boot loader程序
/etc/inittab init配置文件
/etc/init.d/rc 初始化系统启动脚本
/etc/rc$runlevel.d/* 相应runlevel系统启动脚本
/etc/init.d/rc.local 用户自定义系统启动脚本