嵌入式Linux开发综述
建立目标板Linux的基本步骤
建立目标板Linux系统有4个重要的步骤:
(1)决定系统组件
Linux具有大量可选软件,应当为目标系统列出必须的功能清单
(2)配置并建立内核
选择合适的Linux内核版本与适当的配置
建立内核
(3)建立根文件系统
(4)设置引导软件与配置
开发嵌入式Linux系统最常用的主机类型
开发嵌入式Linux系统最常用的主机类型有如下:
(1)Linux工作站
通常就是一台安装了某个标准的Linux发行套件的PC机,如Debian、Mandrake、Red Hat等。需约2、3G或更多的磁盘空间进行嵌入式Linux开发。建议具有128或以上的RAM及交换空间。
(2)Unix工作站
由于Linux与Unix非常相似,对Linux适用的通常对Unix也适用
(3)Windows工作站
许多开发者比较习惯Windows平台,并希望在Windows平台上开发嵌入式Linux系统。
Cygwin:可在Windows平台上建立跨平台开发工具链;
VMWare:可在虚拟环境中执行Linux,并在Linux上进行嵌入式Linux的开发。
主机/目标机的开发体系结构
在嵌入式Linux系统开发中,存在3种主机/目标机开发体系结构
1、连接式
目标板和主机通过一个物理线路(如串行线或者以太网连接)永久的连接在一起
好处:
目标代码的传送无需物理存储设备参与,只需要上述连接就足够了,在这种方式中,主机
包含了跨平台开发环境,而目标板则包含了适当的引导加载程序、可用的内核以及最起码的根文件系统。
另一种做法是,以远程组件来简化目标板的开发工作,例如通过TFTP下载内核此外,根文件系统还可以通过NFS安装,而不必在目标板中使用存储介质;还可以使用连接进行调试,通常使用以太网连接进行下载功能,而使用RS232串口连接进行调试.
TFPT:Trivial File Transfer Protocol小型文件传输协议,比FTP简单;
NFS:Network File System网络文件系统,允许访问远程计算机上的文件。
2、使用可移动存储设备
主机和目标板之间没有实际的连接。先由主机将数据写入存储设备,然后将存储设备转接到目标板,并使用该存储设备引导目标板。同样的,在主机上包含了跨平台开发环境。而目标板则只包含了最起码的引导加载程序。其余的组件被存放在可移动存储设备上。
一种通常的操作方式使用易插拔的flash芯片:先在主机上使用flash编程器将数据写入芯片,然后再将该芯片插入目标板上的插座中。
3、独立开发式
在这种设置中,目标板是个独立的开发系统,它包含了引导、操作以及开发额外软件所必须的任何软件。不需要跨平台开发环境,不必在主机和目标板之间传送任何数据。这适合以PC为主的高级嵌入式系统的开发。
主机/目标板的调试方式
用来连接目标板与主机进行调试的接口基本上有3种类型:串行线、网络接口和特殊的调试硬件(包括BDM、JTAG)。
1、使用串行线进行调试
这是从主机对目标板进行调试的最简单的做法。缺点:串行连接的速度比较有限;当嵌入式系统中只有一个串行串口,或者串行连接是嵌入式系统对外唯一的接口,那么就不可能在对系统调试的同时,以终端仿真器跟系统交互。
2、使用网络接口进行调试
这种方式与串行线连接相比,可以提供较高的带宽。由于可以在相同的物理网络连接上使用多重网络连接,可以兼顾调试与终端仿真交互。缺点:
无法使用网络连接对Linux内核进行调试。因为网络协议栈本身在Linux内核里。相对而言,内核的调试通常可以通过串行连接来进行。
3、使用特殊的调试硬件
通常会使用BDM或JTAG接口。这些接口依靠的是CPU芯片中内嵌的BDM或JTAG特殊功能。只要将一个特殊的调试器连接到CPU上的JTAG或BDM相关管脚,就可以完全控制CPU的行为。因此,当遇到新的嵌入式目标板、或者对目标板上的Linux内核进行调试时,通常会使用JTAG和BDM。
BDM:Background Debug Mode,背景调试模式
JTAG:Joint Test Action Group,联合测试小组,采用IEEE 1149.1,测试存取口和边界扫描标准。
嵌入式Linux系统的一般架构
如图所示,包含4个部分:(1)硬件(2)内核(3)文件系统等(4)应用程序/库。
1、硬件
目标板的硬件必须符合一些要求方能执行Linux系统。一般如下:至少32位CPU;一般情况下必须配备MMU(对于不配备MMU的考虑使用uClinux);RAM容量必须满足系统的需要;一些最起码的I/O能力,以便在线调试;具有某种形式的永久性或网络存储设备以便内核加载及(或)存取根文件系统。
Linux内核
Linux内核是Linux操作系统的中心组件。使用内核的目的是希望以一致的方式管理硬件,以及为用户软件提供高层抽象层。内核大致可以分成两个部分:底层接口层和高层抽象层。
底层接口层专属于硬件配置,内核运行其上,并以硬件无关的高层抽象层提供对硬件资源的直接控制。比如,对于PPC和ARM系统,尽管其寄存器或内存分页的处理方式不同,但却可以使用通用的API来存取内核里高层的组件。通常底层部分会处理CPU特有的操作、架构特有的内存操作以及设备的基本I/O。
2、文件系统和网络协议等
在Linux内核的底层接口层与高层抽象层之间,内核有时会用到与特定设备上的结构化数据交互的组件,例如文件系统和网络协议。通常,Linux内核至少需要一个具有合适结构的根文件系统。Linux内核会从中加载第一个应用程序、加载模块并为进程提供工作目录。
3、应用程序/库
内核上面是应用程序和工具程序。链接库通常与应用程序动态链接在一起。
嵌入式Linux系统的启动过程
在系统启动过程里,有3个主要软件组件参与其中:(1)引导加载程序;(2)内核;(3)Init进程。
1、引导加载程序
引导加载程序是系统启动过程中执行的第一个软件,它与目标板的硬件有高度的依赖关系。Linux有许多引导加载程序可用。引导加载程序在完成底层硬件初始化工作后会接着跳到内核的启动程序代码执行。
2、内核
内核一开始的启动程序代码会因架构不同而有很大的差异,而且在为C程序代码设置合适的执行环境之前,它会先为自己进行初始化工作。
完成以上工作后,内核会跳到与架构无关的start_kernel函数执行,此函数会初始化高层内核功能,安装根文件系统,以及启动init进程。
3、Init进程
启动各种应用程序(根据设置而定)。
嵌入式Linux系统的引导配置的类型
Linux系统的引导配置与所选用的引导加载程序、它的配置以及主机中软硬件的类型有非常密切的关系。
1、固态存储媒体引导配置方式
固态存储媒体用于存放最初的引导加载程序、配置参数、内核和根文件系统。嵌入式Linux系统在开发的不同阶段可能会使用不同的引导配置,但大部分在开发完成后使用固态存储媒体。
2、磁盘引导配置方式
磁盘引导配置方式广泛应用于工作站及服务器中,此时内核和根文件系统位于磁盘上。最初的内核加载程序不是从磁盘上加载,第二个内核加载程序就是直接从磁盘获得内核本身。这可以用于嵌入式系统的开发阶段。但是它要求目标板上能够使用硬盘或者具有模仿硬盘的装置。
3、网络引导配置方式
网络引导配置方式中,存在两种情况:(1)内核位于固态存储设备上或磁盘上,需要通过NFS安装根文件系统;(2)只有内核加载程序位于目标板的存储设备上,需要通过TFTP下载内核和根文件系统(或NFS)。这种方式往往用于开发初期。