转自:http://blog.csdn.net/weiganyi/article/details/11561859

在我们的周围,大量的嵌入式设备都是基于Linux系统来构建的,嵌入式Linux与主机Linux相比有着自己的一些特点,本文就嵌入式Linux系统的构成和启动过程做一些总结。

一、嵌入式Linux系统构成

上图是一个嵌入式Linux系统的典型结构,划分成了4个区:

1、Bootloader区存放的是Bootloader,它负责嵌入式系统最初的硬件初始化、驱动和内核加载。

2、参数区不是必须的,通常存放了一些系统参数,并且通常这个区是没有文件系统,参数以原始数据的格式来存放。

3、内核镜像区存放的Linux内核压缩镜像,它被解压后运行于内存,作为嵌入式设备的Linux操作系统。

4、文件系统区存放经过压缩的文件系统,它会被Linux内核解压并挂载,并作为各种应用程序、文件的主要载体。

这4个区都以二进制数据的形式存放于嵌入式设备的Flash芯片上。

二、嵌入式Linux系统启动过程

嵌入式设备从上电那一刻到应用程序正常运行,其间经历过一系列漫长的过程,下面对主要的步骤进行阐述:

1、嵌入式设备上电后,CPU开始运行,通常CPU会从某一个固定的物理地址开始运行,这个物理地址一般是Flash芯片的起始物理地址。Flash芯片的最初一段通常存放的是Bootloader,于是CPU就会开始运行Bootloader的代码。

2、我们知道CPU可以读写Flash上的数据,但是不能直接执行Flash上的指令,CPU通常只能执行内存中的指令,那么CPU刚开始运行时怎样去执行Flash上的指令呢?这里分两种情况,Flash芯片主要分为两种,一种是Nor Flash,另一种是Nand Flash,Nor Flash具有可以直接在Flash芯片上执行指令的特点。如果嵌入式设备采用的是Nor Flash,那就比较简单了,CPU可以直接运行在Nor Flash上的指令。如果采用的是Nand Flash呢,怎么办?目前主要有两种方法,一种方法是Flash控制器能够把Nand Flash的前4k数据搬到4k的内部RAM中,并设置CPU从这个内部RAM的起始地址开始启动执行。另一种方法是Flash控制器能够把Nand Flash的前4k数据的地址映射到系统总线的某个地址上,并设定CPU从这个地址开始启动执行。这两种方法都是硬件来完成的。

3、Bootloader分为两个部分,第一部分是汇编代码且不做压缩,第二部分是C代码且有压缩的。Bootloader开始执行时,第一部分汇编代码先负责初始化CPU、PLL、DDR、Cache等硬件,让CPU和内存能够稳定运行,然后解压第二部分的Image,并拷贝到到内存执行。第二部分C代码完成串口、flash、网口等驱动的加载,并构建一个shell环境来接受用户输入。注意,在整个Bootloader运行其间CPU的MMU是没有被初始化的,所有的地址访问都是采用物理地址直接访问的。

4、在完成Bootloader初始化后,根据代码中设定的内核区物理地址,Bootloader会把内核区压缩后的Linux镜像拷贝到内存中并解压。同时准备好内核的启动参数,如:console=ttyS0,115200 root=31:2 mtdparts=ar7100-nor0:196608(boot),835236(kernel),-(rootfs),这里主要是把Bootloader里设置的MTD分区信息传递给内核,还有需要加载的根文件系统。最后跳转到内核入口开始运行。

5、Linux内核代码开始执行,会先进行内核各个子系统初始化,并完成对MMU的初始化。MMU是CPU中的一个单元,它跟操作系统一起配合完成从虚拟地址到物理地址的转换。如果CPU带有MMU单元,则CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址,而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,这个地址称为物理地址。在这个过程中Linux内核会维护页表结构,它保存着内核和进程的虚拟地址到物理地址的映射,而MMU则通过Linux内核页表去完成地址翻译和保护工作。

6、接下来Linux内核会挂载根文件系统,要挂载的根文件系统是通过内核启动参数来获取的。这里有一个问题,根文件系统通常表示为一个Linux文件系统下的某个MTD设备,但在加载根文件系统前Linux还没有一个文件系统,那它怎样通过访问文件系统中的MTD设备来加载根文件系统呢?事实上,根文件系统的安装分为两个阶段,首先Linux内核会安装一个特殊的RootFS文件系统,该文件系统仅提供一个作为初始安装点的空目录,然后Linux内核再在空目录上安装一个真正的根目录。Linux内核对Flash的访问都是通过MTD子系统来进行的,它抽象了对于各种Flash设备的访问,提供统一的接口。

7、Linux内核继续初始化各种类型的驱动程序,完成之后会启动第一个应用程序,它的进程ID为1。这个应用程序可以由内核启动参数传入,如果没有则会默认执行/sbin/init。init进程会读取配置文件/etc/inittab,根据配置文件的内容它会完成两个工作,执行rcS和启动Shell。至此,Linux系统已经启动完成,给用户提供了一个Shell的交互环境,后续的行为就取决于用户的输入或者系统特定应用的加载。

嵌入式Linux系统的构成和启动过程的更多相关文章

  1. 浅析嵌入式Linux系统的构成和启动过程

    在我们的周围,大量的嵌入式设备都是基于Linux系统来构建的,嵌入式Linux与主机Linux相比有着自己的一些特点,本文就嵌入式Linux系统的构成和启动过程做一些总结. 一.嵌入式Linux系统构 ...

  2. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  3. Holer实现外网访问ARM嵌入式Linux系统

    公网访问ARM嵌入式Linux系统 实验室里的ARM嵌入式Linux系统,只能在局域网内访问,怎样从公网也能访问内网ARM嵌入式Linux系统? 本文将介绍使用holer实现的具体步骤. 1. 准备工 ...

  4. 外网访问ARM嵌入式Linux系统

    外网访问ARM嵌入式Linux系统 实验室里的ARM嵌入式Linux系统,只能在局域网内访问,怎样从外网也能访问ARM嵌入式Linux系统? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并 ...

  5. 嵌入式linux系统中,lsusb出现unable to initialize libusb: -99 解决办法 【转】

    转自:http://cpbest.blog.163.com/blog/static/41241519201111575726966/ libusb是linux系统中,提供给用户空间访问usb设备的AP ...

  6. 嵌入式linux系统的构建

    前期工作:a.配置好tftp服务器:在嵌入式的童年中有介绍 b.开发板可以pc,linux 三者可以互相ping通 c.配置好nfs服务器:同样在嵌入式的童年中有介绍 一.嵌入式linux内核的制作( ...

  7. 4种用于构建嵌入式linux系统的工具_转

    转自:4种用于构建嵌入式linux系统的工具 Linux 被部署到比 Linus Torvalds 在他的宿舍里开发时所预期的更广泛的设备.令人震惊的支持了各种芯片,使得Linux 可以应用于大大小小 ...

  8. 龙尚3G、4G模块嵌入式Linux系统使用说明【转】

    本文转载自;http://blog.csdn.net/zqixiao_09/article/details/52506812 驱动部分: 1.kernle/drivers/usb/serial/opt ...

  9. 嵌入式linux系统应用开发

    关于嵌入式系统   平时大家说的嵌入式其实范围比较广的,是一种软硬件可裁剪,以应用为中心开发的专用系统,硬件平台可以是单片机,或者以ARM系列的处理器.单片机一般直接裸奔程序,不过现在有了好多基于单片 ...

随机推荐

  1. 关于bootstrap框架美化的实例教程(python)

    经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的b ...

  2. Redis集群(主从模式)

    主从模型   在Redis的集群当中,每个节点(实例)都有一个身份:Master或者Slave,Master:主要负责数据写入,Slave一般提供数据读取,Master与Slave之间是一对多关系,M ...

  3. 使用C#创建Windows服务 并发布Windows 服务

    一.开发环境 操作系统:Windows 10 X64 开发环境:VS2015 编程语言:C# .NET版本:.NET Framework 4.0 目标平台:X86 二.创建Windows Servic ...

  4. 树莓派3代刷ubuntu mate在命令行下配置wifi不能连接的一个诡异的bug的解决

    家里路由器不在自己卧室,用树莓派考虑用wifi,之前用Raspberry官方系统,按照教程写的wpa.conf可以连接wifi,后来重新刷ubuntu mate 16.04就不好用了 各种找原因,后来 ...

  5. HDU 1024 Max Sum Plus Plus(DP的简单优化)

    Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To b ...

  6. inode满处理

    https://blog.csdn.net/liuxiao723846/article/details/79423581 [root@monitor251 bin]# for i in /boot; ...

  7. 现代 PHP 新特性 —— 闭包

    一.概述 闭包是指在创建时封装周围状态的函数,即使闭包所在的环境的不存在了,闭包中封装的状态依然存在.闭包对象实现了__invoke()魔术方法,只要变量名后有(),PHP就会查找并调用__invok ...

  8. 超详细的PDF Expert的注释功能介绍

    今天,要给大家很是详细地介绍一下PDF Expert(一款专门在mac上使用的PDF阅读编辑器)的注释功能,让有点健忘的各位小伙伴们通过积极地与文本交互,从而记住更多的专业书内容. 具体使用方法请看以 ...

  9. redis 集群引出hash一致性算法

    写的很棒的文章 https://blog.csdn.net/bntX2jSQfEHy7/article/details/79549368 这篇分析的更叼 https://www.jianshu.com ...

  10. 思科模拟器PacketTracer7--利用一台交换机将两台pc划分到不同vlan下

    实验2—3 实验内容:将同一交换机下的两台pc划分到不同vlan中 实验工具:思科模拟器PacketTracer7 使用设备:一台交换机,两台PC 实验步骤: 一.配置网络拓扑图 注:1.连线可选择闪 ...