注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

嵌入式usb-Linux 启动过程  

2013-07-30 16:15:28|  分类: 嵌入式linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

     本文所描述的的 Linux Image 由 BootLoader、kernel、initrd、rootfs 组成,它们共同存在于一个可以启动的存储设备中(本文以 USB 为例)。组成架构如下:


嵌入式 Linux 启动过程 - lzdzhy-itoedr - itoedr的it学苑

各个模块的作用如下:

  • Boot Loader:由 BIOS 加载,用于将后续的 Kernel 和 initrd 的装载到内存中
  • kernel:为 initrd 运行提供基础的运行环境
  • initrd:检测并加载各种驱动程序
  • rootfs:根文件系统,用户的各种操作都是基于这个被最后加载的文件系统

其调用顺序是 Boot Loader->kernel->initrd->rootfs。

当机器上电时首先 BIOS 会启动,然后装载 USB 设备中的 Boot Loader、kernel,、nitrd 到内存中,由于这些文件大小总和小于 10M,所以我们直接拷贝到内存中再执行不会有问题。

最后要加载的 rootfs 是用户最终进行读写操作的文件系统。

  • 在非嵌入式系统中,这部分文件通常储存在可直接读写的硬盘上,因此直接挂载到根目录后(例如:mount /dev/sda1 /mnt)就可以进行读写操作。
  • 在嵌入式系统中,它是一个压缩的文件系统,大小通常是好几百兆,解压后的大小都超过 1G,如果直接 mount 到系统目录,那么系统目录是只读的,不可进行写入操作。而如果把它加压到内存中可以实现读写的操作,但是这么大的文件直接解压到内存中对于嵌入式设备来说 是不可接受的。因此我们需要找到一种不拷贝 rootfs 到内存中,同时又可以对最终的根文件系统进行读写的方法。


参考附件:

  嵌入式linux启动过程

  1、嵌入式linux启动第一步--加载BIOS

  当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。

  2、嵌入式linux启动第二步--读取MBR

  众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,里面存放了预启动信息、分区表信息。系统找到BIOS所指定的硬盘的MBR后,就会将其复制到 0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到电脑,就是lilo或者grub了。

  3、嵌入式linux系统启动第三步--Boot Loader

  Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状 态,以便为最终调用操作系统内核做好一切准备。系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动 不同的操作系统。

  4、嵌入式linux启动第四步--加载内核

  根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux 核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。

  5、嵌入式linux启动第五步--用户层init依据inittab文件来设定运行等级

  内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。其实 /etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需 要运行在等级5上。Linux的运行等级设定如下:

  0:关机

  1:单用户模式

  2:无网络支持的多用户模式

  3:有网络支持的多用户模式

  4:保留,未使用

  5:有网络支持有X-Window支持的多用户模式

  6:重新引导系统,即重启

  6、启动第六步--init进程执行rc.sysinit

  在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。

  7、嵌入式linux启动第七步--启动内核模块

  具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。

  8、嵌入式linux启动第八步--执行不同运行级别的脚本程序

  根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。

  9、嵌入式linux启动第九步--执行/etc/rc.d/rc.local

  rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。可以把想设置和启动的东西放到这里。

  10、嵌入式linux启动第十步--执行/bin/login程序,进入登录状态

  此时,嵌入式linux系统已经进入到了等待用户输入username和password的时候了,已经可以用自己的帐号登入系统了。

          注:对于开发者来说,在第五步加载/sbin/init这个过程中,可以个性化地定制我们的linux系统.
  评论这张
 
阅读(75)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017