第一篇 嵌入式Linux开发概论

1 什么是嵌入式系统?

嵌入式系统是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。12 简单来说,它是相对于运行在x86架构下、具体通用计算能力的PC系统而言的一类系统。

嵌入式系统根据其软件实现的复杂程度,可以简单分为无操作系统类和有操作系统类两种。前者常见的有单片机系统;后者则有智能手机、网络路由器等。而现今比较流行的的嵌入式操作系统有Google的Android系统、苹果的IOS系统、以及现在无处不在的嵌入式Linux系统。而本篇的主角,即是嵌入式Linux系统

2 嵌入式Linux系统的组成

从软件角度来看,一个嵌入式Linux系统通常可分为以下四个层次3

  • 引导程序。包括固化在芯片(如EEPROM或EPLD)固件(firmware)中的boot代码(可选),和Boot Loader两部分。

  • Linux内核。针对特定单板裁剪定制的内核以及对应的启动参数。

  • 文件系统。通常选用Ramdisk。

  • 应用程序。满足用户需求的特定应用软件。

2.1 Boot Loader

Boot Loader是嵌入式设备上电时用于引导操作系统内核的一段小程序。

它最主要的功能是初始化硬件,包括对CPU、DDR、串口(用于调试)、网口(用于从网络下载版本),以及外部存储设备(如flash)等的初始化,并将Linux内核装载至内存中,同时提供内核启动所需的bootargs参数,最后将控制转移到Linux内核起始执行处,完成内核的启动。

目前最流行的Boot loader是Das U-Boot,其含义为the Universal Boot Loader,详见http://www.denx.de/wiki/U-Boot/WebHome

2.2 Linux内核

Linux内核是整个嵌入式操作系统的核心,它向下直接管理系统硬件资源,向上通过系统调用为上层软件提供服务。

为了适应不同的嵌入式环境,我们需要根据单板芯片以及外围器件的选择,对Linux内核进行裁剪和适配。既要保证功能满足要求,又要让体积尽可能小。

2.3 文件系统

嵌入式Linux系统必须要有文件系统支持才能运行。

文件系统中必须包含:

  • 系统init程序
  • Shell
  • 应用程序函数库
  • 应用程序

为适应嵌入式应用的需求,必须尽可能地缩小文件系统的体积。

2.4 应用程序

应用程序是嵌入式系统价值的直接体现,它完成了整个系统的功能需求和对外接口。

应用程序一般以进程的形式运行在Linux的用户态空间,通过系统调用进入内核,访问内核提供服务。

通常,可在/etc/init.d/rcS启动脚本中添加自启动应用程序。

3 嵌入式Linux的开发过程

根据时间先后顺序,可将整个嵌入式Linux系统开发过程大致分为以下五个阶段:

  • Boot及其驱动开发
  • Linux内核开发
  • Linux驱动程序开发
  • 应用程序开发
  • 系统集成

3.1 Boot及其驱动开发

开发目标

  • 启动嵌入式目标系统
  • 使其具备加载并启动Linux内核的能力

关注重点

  • CPU初始化
  • 串口驱动:用于调试打印
  • DDR初始化:DDR寄存器配置
  • 网卡驱动:用于内核版本下载等
  • Flash驱动:用于版本存储等
  • bootargs:内核启动参数配置

输出产品

  • 可启动目标系统,并能正确引导Linux内核执行的Boot Loader

3.2 Linux内核开发

开发目标

  • 满足目标系统的功能需求和性能要求
  • 可正常启动,运行稳定

关注重点

  • 内核裁剪与配置
  • 精小而全面

输出产品

  • 可启动目标系统的Linux内核,如uImage等

3.3 Linux设备驱动开发

开发目标

  • 驱动目标系统上的相关设备,为上层应用提供访问硬件的能力

关注重点

  • 关注设备本身特性,采用合适的驱动方式

输出产品

  • 成为内核的一部分 或 内核可装载模块*.ko文件

3.4 应用程序开发

开发目标

  • 实现单板所需要实现产品功能与接口
  • 提供相应的单板服务与响应

关注重点

  • 明确功能需求
  • 结合开发时间和开发难度,采用合适的实现方式

输出产品

  • 目标系统可执行应用程序(一般为ELF格式,采用动态链接或静态链接)

3.5 系统集成

开发目标

  • 提供产品化的嵌入式Linux系统

关注重点

  • 内存、Flash使用划分
  • 系统自动化加载、系统启动脚本
  • 版本升级、系统维测手段
  • 拷机稳定性测试

输出产品

  • 具备商用能力的,可独立运行的产品化嵌入式Linux系统。

4 嵌入式Linux开发环境

4.1 常用开发平台

平台 优点 缺点
Linux原生平台 原生编译环境,功能强大,编译速度快,稳定性高 对Windows用户不友好,需付出额外学习成本
在Windows系统下,通过Cygwin构建Linux编译环境 方便Windows用户开发 非原生编译环境,功能较弱,编译速度慢

4.2 交叉编译工具链

何为交叉编译?

简单来讲,就是在A体系架构平台下,编译出能在B体系架构平台下运行的程序。比如,在x86 PC机上,编译出能在搭载ARM核CPU的平台上运行的程序。并且,该程序无法在原x86平台上运行,哪怕两者运行的都是Linux系统。

为何需要交叉编译?

由于嵌入式目标系统资源的紧缺性,通常我们会在调试主机上将目标程序编译链接好,再下载至目标单板上进行调试。其过程如下图所示:

交叉编译工具链

交叉编译过程中用到的编译工具被称作交叉编译工具链 。它是一个由编译器、链接器和解释器组成的综合开发环境,主要由binutils、gcc和glibc三个部分组成。

制作交叉编译工具链是一个相当复杂的过程,但通常情况下,我们只需到官网下载对应的交叉编译工具链,而无须自己制作。例如,http://www.veryarm.com/cross-tools 网站提供了ARM体系架构下比较全面的交叉编译工具链支持。

4.3 Makefile

提供对软件工程自动化构建的支持,与交叉编译工具链配合使用。


1. Michael Barr. Embedded Systems Glossary. Neutrino Technical Library. [2007-04-21].
2. Heath, Steve. Embedded systems design. EDN series for design engineers 2. Newnes. 2003: 2. ISBN 978-0-7506-5546-0. "An embedded system is a microprocessor based system that is built to control a function or a range of functions."
3. 詹荣开. 嵌入式系统 Boot Loader 技术内幕. [2003-12-01].

results matching ""

    No results matching ""