linux系统启动知识学习总结

嵌入式学习总结
Linux系统的一般启动过程通常划分为内核引导、内核启动和应用程序启动
3个阶段:
第一阶段是目标板硬件初始化,解压内核映像,再跳转到内核映像入口。这部分的工作
一般由目标板的引导程序和内核映像的自引导程序完成。不同体系结构的目标板引导的方式
和程序都有差异。
第二阶段是内核的初始化,初始化设备驱动,挂接根文件系统。这里是Linux 内核通用
的启动函数入口。所有体系结构的目标板都顺序调用统一的函数,尽管有些函数的代码实现
是跟体系结构相关的。
第三阶段是执行用户空间的init 程序,完成系统初始化、启动相关服务和管理用户登录
等工作。这个阶段可以提供给用户交互界面,例如:Shell命令行或者图形化的窗口界面。也
可以自动执行应用程序。
在Linux 系统启动过程中,有两个关键点。一个是内核映像的解压启动;另一个是根文
件系统的挂接。




BusyBox是标准Linux工具的一个单个可执行实现。BusyBox包含了一些简单的工具,例如cat和echo,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及 telnet。有些人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令。


(1)make install这样编译好的busybox就会自动安装到BusyBox installation prefix中,一般是三个文件夹bin sbin usr和一个文件linuxrc。
其中可执行文件busybox在需要制作文件系统映像烧入板子的情况下,busybox应放在根文件系统目录下的bin中,其他的都是指向他的符号链接.


(2)使用示例
BusyBox 所包含的程序只需要简单的将名称附加在第一个参数即可运行:
/bin/busybox ls
更常见的作法是,这些指令会以链接 (使用 硬链接 或者 符号链接) 至 BusyBox 可执行文件,BusyBox 会侦测其被链接时的名称,并运行对应的指令。举例来说,只要将/bin/ls链接到/bin/busybox
#ln -s busybox ls
#ln -s busybox rm
#ln -s busybox mkdir
然后分别运行这三个链接:
#./ls
#./rm
#./mkdir
就可以分别完成了ls rm 和mkdir命令的功能.虽然他们都指向同一个可执行程序busybox,但是只要链接名不同,完成的功能就不同,很多linux网站都提供busybox的源代码下载。


一.Ramdisk:虚拟内存盘是通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术。相对于直接的硬盘文件访问来说,这种技术可以极大的提高在其上进行的文件访问的速度。但是RAM的易失性也意味着当关闭电源后这部分数据将会丢失。但是在一般情况下,传递到RAM盘上的数据都是在硬盘或别处永久贮存的文件的一个拷贝。经由适当的配置,可以实现当系统重启后重新建立虚拟盘。


rootfs:一个基于内存的文件系统,是linux在初始化时加载的第一个文件系统.有的地方这个rootfs也称为初始RAM磁盘(initrd).
initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。在 linux内核启动前, boot loader 会将存储介质中的 initrd 文件加载到内存,内核启动时会在访问真正的根文件系统前先访问该内存中的 initrd 文件系统。在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第一阶段先执行 initrd 文件系统中的"某个文件",完成加载驱动模块等任务,第二阶段才会执行真正的根文件系统中的 /sbin/init 进程。这里提到的"某个文件",Linux2.6 内核会同以前版本内核的不同,所以这里暂时使用了"某个文件"这个称呼,后面会详细讲到。第一阶段启动的目的是为第二阶段的启动扫清一切障爱,最主要的是加载根文件系统存储介质的驱动模块。我们知道根文件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞大、臃肿。分为两种:虚拟rootfs和真实rootfs.


initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM磁盘卸载,并释放内存。在很多嵌入式Linux系统中,initrd 就是最终的根文件系统。本文将探索 Linux 2.6 的初始 RAM磁盘,包括如何创建以及如何在Linux内核中使用。


Linux 的 initrd 技术是一个非常普遍使用的机制.


initrd文件。种类有两种:
1.一种是传统格式的文件系统镜像image_initrd。
2.另外一种格式的initrd是cpio格式的,这种格式的initrd从linux2.5 起开始引入,使用cpio工具生成,其核心文件不再是 /linuxrc,而是 /init,实际上它的含义就是:在内核镜像中附加一个cpio包,这个cpio包中包含了一个小型的文件系统,当内核启动时,内核将这个cpio包解开,并且将其中包含的文件系统释放到rootfs中,内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行。




Linux2.6 内核对Initrd文件的处理流程
linux2.6 内核支持两种格式的initrd文件,一种是前面第linux2.4 内核那种传统格式的文件系统镜像image_initrd它的制作方法同Linux2.4内核的initrd一样,其核心文件就是 /linuxrc。另外一种格式的initrd 是 cpio格式的,这种格式的initrd 从linux2.5 起开始引入,使 cpio工具生成,其核心文件不再是 /linuxrc,而是 /init,本文将这种 initrd 称为 cpio_initrd。尽管 linux2.6 内核对 cpio-initrd和 image_initrd 这两种格式的 initrd 均支持,但对其处理流程有着显著的区别,下面分别介绍linux2.6内核对这两种initrd 的处理流程。


cpio-initrd: cpio格式的rootfs
image-initrd:传统格式的rootfs


cpio-initrd 的处理流程
1.boot loader 把内核以及 initrd 文件加载到内存的特定位置。
2.内核判断initrd的文件格式,如果是cpio格式。
3.将cpio-initrd的内容释放到rootfs中。
4.执行initrd中的/init文件,执行到这一点,内核的工作全部结束,完全交给/init文件处理。


image-initrd的处理流程
1.bootloader把内核以及initrd文件加载到内存的特定位置。
2.内核判断initrd的文件格式,如果不是cpio格式,将其作为image-initrd处理。
3.内核将initrd的内容保存在rootfs下的/initrd.image文件中。
4.内核将/initrd.image的内容读入/dev/ram0设备中,也就是读入了一个内存盘中。
5.接着内核以可读写的方式把/dev/ram0设备挂载为原始的根文件系统。
6.如果/dev/ram0被指定为真正的根文件系统,那么内核跳至最后一步正常启动。
7.执行initrd上的/linuxrc文件,linuxrc通常是一个脚本文件,负责加载内核访问根文件系统必须的驱动, 以及加载根文件系统。
8./linuxrc执行完毕,常规根文件系统被挂载
9.如果常规根文件系统存在/initrd目录,那么/dev/ram0将从/移动到/initrd。否则如果/initrd目录不存   在, /dev/ram0将被卸载。
10.在常规根文件系统上进行正常启动过程 ,执行/sbin/init。


通过上面initrd处理流程的介绍,cpio-initrd的处理流程显得格外简单,通过对比可知cpio-initrd的处理流程在如下两个方面得到了简化:


1.cpio-initrd并没有使用额外的ramdisk,而是将其内容输入到rootfs中,其实rootfs本身也是一个基于内存的文件系统。这样就省掉了ramdisk的挂载、卸载等步骤。
2.cpio-initrd启动完/init进程,内核的任务就结束了,剩下的工作完全交给/init处理;而对于image-initrd,内核在执行完/linuxrc进程后,还要进行一些收尾工作,并且要负责执行真正的根文件系统的/sbin/init。通过图1可以更加清晰的看出处理流程的区别:


二.bootloader:是用来初始化硬件设备,建立内存空间的映射关系,搭建起整个系统的硬软件环境,从而引导操作系统在合适的环境中开始工作。它是系统加电后运行的第一段软件代码,位于存储设备空间的某一段区域中。
其中最常见的一种Bootloader是U-boot。是一款支持多处理器架构和操作系统的开源的Bootloader。另外还有vivi,Blob,GRUB,RedBoot,LILO等。Bootloader从系统启动地址的第一条指令跳转后就开始执行初始化各种硬件的操作。
Bootloader的主要完成的工作:
1.初始化cpu的频率,中断寄存器,系统启动时候需要关系中断和看门狗。
2.初始化内存,配置相关寄存器,确定下面的映像文件在内存中存放位置。
3.初始化化堆栈指针,设置引导系统的参数与标记。
4.将操作系统和根文件系统的映像从FLash存储器中复制到系统内存中。
5.跳转到操作系统的内核的第一条指令处继续执行,将控制权交给操作系统。
Bootloader的操作模式:
1.自启动模式:在这种模式下,bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
2.交互模式:在这种模式下,目标机上的bootloader将通过串口或网络等通行手段从开发主机(Host)上下载内核映像等到RAM中。可以被bootloader写到目标机上的固态存储媒质中,或者直接进入系统的引导。也可以通过串口接收用户的命令。




三.DRAM:内存。
Nvram:非易失性随机访问存储器 (Non-Volatile RNVRAM andom Access Memory),是指断电后仍能保持数据的一种RAM。




flash即Flash Memory,全名叫Flash EEPROM Memory,又名闪存,是嵌入式系统中重要的组成部分,是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器,数据删除不是以单个的字节为单位而是以固定的区块为单位,区块大小一般为256KB到20MB。这些区块是相互独立的。根据结构的不同有可以分成NOR FLASH和NAND FLASH.
NOR FLASH是把整个存储区分成若干个扇区(section),通常容量是1~16M,主要是应用在代码的存储介质中,应用程序可以直接在NOR Flash内运行,不需要把代码读到系统的RAM中运行。其传输效率到,但很低的写入和擦除速度影响了它的性能。
而NAND FLASH是把整个存储区分成若干个快(block).8~128MB产品中使用,它的结构可以达到高存储密度,并且写入和擦除的速度都很快,就是在NAND FLASH上运行代码的时候,通常需要驱动程序,也就是内存技术驱动程序(MTD).
NAND和NOR器件在进行写入和擦除操作时都需要MTD。
mtdblock的总和就是flash的大小;
另外,Linux内核映像和RAMDISK也可以存储在Flash上。通常需要把Flash分区使用,每个区的大小应该是Flash擦除块大小的整数倍
MTD:(memory technology device)存储技术设备.在硬件和文件系统层之间的提供了一个抽象的接口,MTD是用来访问内存设备(如:ROM、flash)的中间层,它将内存设备的共有特性抽取出来,从而使增加新的内存设备驱动程序变得更简单。
JFFS2:是一个开源的文件系统。JFFS2支持原始的NAND芯片同时支持SmartMediaCard。
内核启动后,通过mount 命令可以将flash中的其余分区作为文件系统挂载到mountpoint上。
查看编译脚本:
查看系统启动:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值