ARM 嵌入式 Linux 系统开发从入门到精通
内容简介:
这是一本以实践为宗旨的嵌入式 ARM Linux 开发书籍,它不同于一般的教材重点讲述
理论而缺乏实践的部分,也不同于许多类似书籍只针对特定开发板讲述,这对于没有开发板
的读者来说很难掌握书中的内容。ARM 是当今最主流的嵌入式微处理器,本书以应用最广
泛的新一代 ARM9 处理器为讲述对象。此外,Linux 是一个成熟而稳定的开放源代码操作系
统,将 Linux 植入嵌入式设备具有众多的优点。本书分为三部分:第 一部分讲述 ARM Linux
系统移植,其中包括嵌入式系统开发入门,交叉编译器的构建,BootLoader 的移植与实现以
及 Linux 2.6 内核的编译与下载;第二部分讲述 ARM Linux 的驱动程序开发,其中包括最常
见的字符设备驱动的分析,块设备驱动的分析以及网络设备驱动的分析。其中每一种类型的
驱动都是利用典型的实例来讲述,使读者充分了解驱动程序的实现思想;第三部分讲述 Qt
GUI 开发,其中包括 Qt 的具体安装,Qt 的核心技术,以及最新的 Qtopia Core 开发环境,
最后利用实例来讲述 Qtopia Core 开发过程。总之,本书包括了嵌入式 Linux 系统移植,底
层驱动实例的讲解以及上层应用的实例讲述,针对那些想从事嵌入式开发或已经从事嵌入式
开发的读者来说无疑是一本难得的参考书籍。
前言:
嵌入式系统由于芯片、软件、网络和传感器等技术的不断发展,正在成为未来社会的“数
字基因”。如今,人类已经进入了后 PC 时代,嵌入式技术已被广泛应用于科学研究、工程
设计、军事技术以及文艺、商业等方方面面,成为后 PC 时代的主力军。与此同时,嵌入式
Linux 操作系统也在嵌入式领域蓬勃发展,它不仅继承了 Linux 源码开放,内核稳定性强,
软件丰富等特点,而且还支持几乎所有的主流处理器和硬件平台。嵌入式硬件系统和 Linux
系统的有机结合,成为后 PC 时代计算机最普遍的应用形式。嵌入式 Linux 技术在中国有巨
大的发展潜力和市场需求。有数据显示,未来两年里,在计算机、消费电子、通信、汽车电
子、工业控制和军事国防这六大主要应用领域,嵌入式 Linux 产品将达到 80 亿美元的市场
规模,可见这个行业的前景是非常乐观的。当然,Linux 嵌入式操作系统本身也有一定的局
限性,就是开发难度过高,对于企业需要很高的技术实力。这 就要求 Linux 系统厂商们不光
要利用 Linux,更要掌握 Linux。此外,社会需要更多人加入到学习和使用 Linux 行业中来。
本书编写的目的:
嵌入式 Linux 属于一个交叉学科,并且也是一个高起点的学科,它涵盖了微电子技术、
电子信息技术、计算机软件和硬件等多项技术领域的应用。另外学习嵌入式 Linux 最好具备
相应的嵌入式开发板和软件,还需要有经验的人进行指导开发,目前国内大部分高校都很难
达到这种要求,这也造成了目前国内嵌入式 Linux 开发人才极其缺乏的局面。
很多希望学习嵌入式 Linux 的人已经具备了一定的硬件知识,并且对操作系统原理,数
据结构等都有相当的了解,但在 Linux 技术方面又是零起点。目前嵌入式 Linux 的书籍也是
非常之多,但大部分都是要求读者有一定的 Linux 使用基础,对于初学者来说真的非常困难。
写这本书的主要目的就是对那些没有 Linux 开发经验的初学者有个很好的指导参考作用,从
而让他们少走弯路。
其次,笔者希望通过写书来总结这几年在工作中的项目经验,与更多的读者分享自己的
技术,也是对自己的所做项目的一个巩固;通过写这本书,让笔者更加清楚了实践与理论之
间的联系,从而将自己的亲身经验和教训寄托在书中的每个章节。
本书的特点:
首先,本书涵盖了嵌入式 Linux 系统中最重要的三个部分:ARM Linux 系统移植,ARM
Linux 驱动程序开发以及 Qt GUI 开发,这在同类书籍中比较少见。
其次,本书的讲述不依赖于具体某个厂家开发板,这 样 读者可以使用任意一款类似的开
发板就可以进行实践学习,同时对于没有开发板的读者也可以学到更多的知识。
另外,本书提供了书中出现的所有实例的源代码,便于读者参考使用,更重要的是读者
不用手动输入这些代码,从而节省时间。
本书的主要组成:
本书分为三个部分,共 12 章节,每一部分由 4 章内容组成。
第一部分讲述 ARM Linux 系统移植,首先第 1 章讲述嵌入式系统开发入门,主要针对
初学者,讲述嵌入式系统的概要,ARM 处理器,ADS 工具,Linux 开发环境,以及 Linux
内核源码等。接着第 2 章讲述交叉编译工具链的构建,主 要 讲述交叉工具链的作用,使用分
步法构建交叉工具链和使用 Crosstool 工具构建交叉工具链。第 3 章讲述嵌入式系统的
BootLoader,主 要讲述嵌入式 BootLoader 的作用,基于 S3C2410 开发板的 U-Boot 分析与移
植以及自己设计 BootLoader 的方法。最后第 4 章讲述嵌入式 Linux 内核移植,主要讲述移
植的基本概念,内核配置、内核编译、内核下载以及构建根文件系统。
第二部分讲述 ARM Linux 驱动程序开发,首先第 5 章讲述 ARM Linux 驱动程序开发入
门,主要讲述嵌入式 Linux 驱动介绍,简单的内核模块程序分析,以及 Linux 驱动开发的基
本要点。接着第 6 章讲述字符设备驱动程序,主要讲述字符设备驱动相关的重要数据结构,
字符设备驱动开发实例——触摸屏设备驱动开发。第 7 章讲述块设备驱动程序,主 要 讲述块
设备相关的数据结构,块设备驱动开发实例——MMC/SD 设备驱动开发。最后第 8 章讲述
网络设备驱动程序,主 要 讲述网络设备驱动相关的重要数据结构,网络设备驱动开发实例—
—CS8900A 网卡驱动开发。
第三部分讲述 Qt GUI 开发,首先第 9 章介绍了 Qt 的概要知识,包括 Linux 桌面 GUI
系统,Qt/X11,Qtopia Core 等,使读者对 Qt 及其在 Linux GUI 系统中的作用有个大概了解。
紧接着第 10 章讲述了 Qt/X11 的安装以及非常详细的应用实例,使读者可以轻松的编写基本
的 Qt 程序。第 11 章深入讨论了一些 Qt 的核心技术,重点是以 Qt 对象模型为基础的信号和
槽等机制,我们通过剖析 Qt 的源代码来深入的学习 Qt 的这些核心技术,同 时 也为读者今后
对 Qt 源代码的自行研习打下基础。最 后第 12 章重点讲述 Qtopia Core 和 Qt/X11 的一些不同
之处,包括轻量级的窗口系统,QCOP 进程间通信机制及调试工具 qvfb 等,使读者在熟悉
了 Qt/X11 的基础上能够很快过渡到 Qtopia Core 开发。
本书的读者对象:
本书通俗易懂,可作为高等院校电子类、电气类、控制类、计算机类等专业本科生、研
究生学习嵌入式 Linux 的参考书目或自学教材,也 可 供 广 大 希望转入嵌入式领域的科研和工
程技术人员参考使用,还可作为广大嵌入式培训班的教材和教辅材料。
致谢:
首先要感谢这本书的另外一位作者欧文盛,书中 Qt GUI 部分(第 9 章到第 12 章)主要
由他来完成,由于他这几年一直在国际知名的通信公司从事 Qt 方面的开发工作,所以这部
分由他来完成,出版社和我都很放心。其次,我要感谢我的妻子,很特殊的是我写这本书的
时间正是我妻子怀孕的期间,其实在写这本书之前已经得知妻子怀孕,所以本想放弃编写这
本书,但是妻子却很坚定的支持我写这本书。所以,我认为这本书的完成离不开她对我的默
默支持。其次,要感谢我的岳父、岳母,是 他们对我妻子这段时间的精心照顾,才使得我有
更多的时间投入到写书中。
最后,要感谢威盛电子的李松,易宏宇,周志勇,张磊等,他们为本书的完成也提供了
很多的帮助。
鉴于作者水平有限,加之时间仓促,本书一定有不少错误与不清楚之处,希望得到广大
读者批评与指正。有 兴趣的读者可以发送 E-mail 到 lyf99526@yahoo.com.cn 或登录笔者的个
人 Blog 来做技术上的交流:http://mike2linus.blog.com.cn/。
作者
2007 年 3 月 28 日
第一部分 ARM LINUX 系统移植 ...............................................................................................12
第 1 章 嵌入式系统开发入门.........................................................................................................13
1.1 嵌入式系统介绍....................................................................................................................13
1.1.1
嵌入式系统概述
............................................................................................................13
1.1.2
嵌入式系统组成
............................................................................................................15
1.2 ARM 介绍..............................................................................................................................16
1.2.1 ARM
处理器介绍
............................................................................................................17
1.2.2 ARM
处理器的选型
........................................................................................................18
1.2.3 S3C2410
微处理器介绍
..................................................................................................18
1.3 ADS 集成开发环境介绍 ........................................................................................................20
1.3.1 ADS
软件组成
.................................................................................................................21
1.3.1.1 命令行开发工具......................................................................................................................21
1.3.1.2 GUI 开发环境..........................................................................................................................23
1.3.1.3 实用程序 .................................................................................................................................23
1.3.1.4 支持的软件 .............................................................................................................................24
1.3.2
使用
Code Warrior IDE...................................................................................................24
1.3.2.1 创建项目工程..........................................................................................................................24
1.3.2.2 编译和链接项目工程..............................................................................................................27
1.3.3
使用
AXD IDE.................................................................................................................29
1.3.3.1 打开调试文件..........................................................................................................................29
1.3.3.2 设置断点 .................................................................................................................................30
1.3.3.3 查看寄存器内容......................................................................................................................30
1.3.3.4 查看变量值 .............................................................................................................................31
1.4 嵌入式 LINUX 开发介绍 ........................................................................................................32
1.4.1 Linux
历史
.......................................................................................................................32
1.4.2 Linux
开发环境
...............................................................................................................33
1.4.2.1 GCC 介绍 ................................................................................................................................35
1.4.2.2 GNU Make 介绍 ......................................................................................................................36
1.4.2.3 GDB 介绍................................................................................................................................38
1.4.3 ARM Linux
系统开发流程
...............................................................................................41
1.5 LINUX 内核介绍.....................................................................................................................43
1.5.1 Linux
内核目录结构
.......................................................................................................44
1.5.2
如何阅读
Linux
内核源代码
..........................................................................................45
1.6 本章小节...............................................................................................................................47
1.7 常见问题 ...............................................................................................................................48
第 2 章 交叉编译工具链的构建.....................................................................................................49
2.1 交叉编译工具链介绍............................................................................................................49
2.2 ARM LINUX 交叉编译工具链的构建.....................................................................................49
2.2.1
分步构建交叉编译链
......................................................................................................50
2.2.1.1 建立工作目录..........................................................................................................................50
2.2.1.2 建立环境变量..........................................................................................................................51
2.2.1.3 编译、安装 Binutils.................................................................................................................51
2.2.1.4 获得内核头文件......................................................................................................................52
2.2.1.5 编译安装 boot-trap gcc............................................................................................................53
2.2.1.6 建立 glibc 库............................................................................................................................54
2.2.1.7 编译安装完整的 gcc................................................................................................................55
2.2.1.8 测试交叉编译工具链 ..............................................................................................................55
2.2.2
用
Crosstool
工具构建交叉工具链
.................................................................................55
2.2.2.1 准备资源文件..........................................................................................................................56
2.2.2.2 建立脚本文件..........................................................................................................................56
2.2.2.3 建立配置文件.........................................................................................................................57
2.2.2.4 执行脚本 ................................................................................................................................57
2.2.2.5 添加环境变量.........................................................................................................................57
2.3 本章小节 ...............................................................................................................................58
2.4 常见问题 ...............................................................................................................................58
第 3 章 嵌入式系统的 BOOTLOADER........................................................................................60
3.1 BOOTLOADER 概述.................................................................................................................60
3.2 常用的嵌入式 LINUX BOOTLOADER.......................................................................................61
3.2.1 U-Boot.............................................................................................................................61
3.2.2 VIVI.................................................................................................................................61
3.2.3 Blob.................................................................................................................................62
3.2.4 RedBoot...........................................................................................................................62
3.2.5 ARMboot.........................................................................................................................63
3.2.6 DIY..................................................................................................................................63
3.3 基于 S3C2410 开发板的 BOOTLOADER 实现.........................................................................63
3.3.1 S3C2410
开发板介绍
......................................................................................................63
3.3.2 U-Boot
分析与移植
.........................................................................................................66
3.3.2.1 U-Boot Stage1 分析 .................................................................................................................66
3.3.2.2 U-Boot Stage2 分析 .................................................................................................................71
3.3.2.3 U-Boot 的移植过程 .................................................................................................................72
3.4 基于 S3C2410 开发板自己编写 BOOTLOADER ......................................................................88
3.4.1
设计系统的启动流程
.....................................................................................................88
3.4.2 BootLoader
的具体实现
..................................................................................................90
3.4.2.1 设置异常向量表.....................................................................................................................91
3.4.2.2 初始化看门狗和外围电路.......................................................................................................92
3.4.2.3 初始化存储器..........................................................................................................................92
3.4.2.4 初始化堆栈 .............................................................................................................................93
3.4.2.5 初始化数据区..........................................................................................................................94
3.4.2.6 跳转到 C 程序 Main 函数........................................................................................................96
3.4.2.7 Main 函数的具体实现 .............................................................................................................96
3.5 本章小节 ...............................................................................................................................97
3.6 常见问题 ...............................................................................................................................97
第 4 章 嵌入式 LINUX 内核移植 ..................................................................................................98
4.1 移植的基本概念 ....................................................................................................................98