第一篇 嵌入式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]. ↩