标题：ARM编程的方法与实践
图书信息
书名：一步步写嵌入式操作系统——ARM编程的方法与实践  　　作者：李无言 著
ISBN：978-7-121-12240-8
出版日期：2011年1月
定价：39.00元
宣传语
深入研究嵌入式操作系统的绝佳教材
内容简介
本书是一本介绍怎样去实际编写一款嵌入式操作系统的书，所涉及的内容包括操作系统基本原理以及这些原理在嵌入式平台中的实现方法。全书共分九章，从最基本的嵌入式编程方法开始，逐渐深入到中断管理、内存管理、设备管理、文件系统管理以及进程管理等操作系统核心部分，为读者系统地呈现了一个操作系统的全貌。另外，本书遵循理论联系实际的基本原则，在阐述基本原理的同时，还给出非常详尽的示例代码，以及对这些代码的讲解。读者研读这些代码，不但可以进一步巩固对操作系统理论知识的理解，更可以以此为基础，去实现一个属于自己的嵌入式操作系统。也许写操作系统是很多人的梦想，或者对有些人来说根本不敢想象，希望通过学习本书，您可以超越您的想象，实现您的梦想！
前    言
本书作者多年的嵌入式领域研发、管理和教学经验，促成了本书的诞生。
本书的目的
操作系统是一个古老的话题，它的出现和发展，对于计算机技术来说，意义非凡。这种发展不仅仅体现在传统的计算机中，在强调精简、高效率和实时性的嵌入式领域，操作系统也发挥着不可替代的作用。
熟悉嵌入式技术的读者朋友多少都能列举出一些典型的嵌入式操作系统，如ECOS、UCOS、Linux、VxWorks，等等，这些操作系统凭借自身的优势，在嵌入式领域的各种应用中安营扎寨，各占据了一席之地，国内基于这些嵌入式操作系统的书籍也是琳琅满目、层出不穷。
本书写作的一个根本目的是能够体现出嵌入式操作系统的基本原理和结构特点，于是，本书力求从嵌入式操作系统的实现方法这一角度出发，去讲解嵌入式系统的基本原理，为大家展示一个嵌入式操作系统的全貌，不拘泥于某款具体的操作系统，不局限在操作系统上的应用程序这一范畴。
一次跟Android领军人物高焕堂先生聊天时，他的一番话让我感触颇深。他说，国外先进的开发工具、平台和操作系统就好比是武器，而中国人喜欢拿着别人给的先进武器去打仗（做应用层开发），一旦有一天我们跟外国人打起来，人家拿走我们的武器，我们就真的是一筹莫展了。
这句话很有道理，中国计算机技术整体水平的提高需要以大量自主研发的开发工具、平台架构以及操作系统为基础。不过，目前我们离这样的一个目标还相去甚远。
本书强调实践，力求能够帮助读者编写出属于自己的嵌入式操作系统。如果读者以本书为基础（或者哪怕从中得到了一丝灵感）开发出一些优秀的嵌入式操作系统，那将会是非常令人高兴的事情！
本书的特点
目前，市面上与操作系统理论相关的书有很多，与这些书相比，本书特点十分鲜明。
第一，本书的内容立足于嵌入式技术，以目前最流行的ARM体系结构为基础，为您展示出嵌入式环境下操作系统的基本原理和实现方法。这是一本学习嵌入式技术，尤其是系统级技术的首选教材。
第二，本书是以实践的方式讲述全书内容的，重视理论联系实际。操作系统涉及的每一个角落，如进程、内存、中断、文件系统、驱动程序，都有若干段代码供读者实践。实际上，读者只需要将书中的代码拼接起来，就可以构成一个结构完整的操作系统内核。
第三，涉猎广泛。为了让读者能够全方位地理解操作系统的理论和实现方法，书中涉及了高级C语言编程、汇编语言、算法、ARM体系结构等诸多领域，分析研究了包括freeRTOS、uCOSII、u-boot、Linux、Minix等在内的操作系统和引导程序的源代码。这些必备的知识和概念都将成为您深入研究任何一款操作系统的绝佳入门内容。
第四，本书语言通俗易懂。书中在描述各种操作系统概念或原理时，力求使用通俗的语言浅显地说明问题，这与一些学术性质的操作系统读物有明显的不同。
谁适合读这本书
本书是写给那些想了解操作系统原理的人，也适合那些想要学习ARM技术的开发者。当然，对于那些致力于开发属于自己的嵌入式操作系统的读者们来说，本书是一部绝佳的入门指南。
当然，我们也希望本书的读者至少具备一些基本的C语言编程基础。除了C语言之外，如果您对微机原理之类的知识也略知一二，那么在阅读本书的时候，将会觉得更加轻松。本书不需要读者了解嵌入式技术，因为这些知识在书中都会涉及，但如果您也知道一些关于ARM的事，那么无论是重写书中的代码还是深入理解书中所讲述的操作系统原理，都会水到渠成。
学习本书的方法
本书在知识的宽度和篇幅上做了平衡。希望展示给读者一个操作系统的全貌，保证读者能够自己动手完成操作系统的编写，而这些都需要我们在开发的过程中不断学习书中所涉猎的知识点。毫无疑问，这些内容是相当庞大的。
为了避免在书中罗列各种技术手册的细节，在本书的编写过程中，我们遵循了只对用到的知识深入讲解的原则。这样做的弊端是，读者会对很多知识点有深入的理解，但却不全面。
因此，我们推荐阅读本书的最佳方法是，以本书为主线，以其他本书中未提到的相关知识、参考资料为辅助。当然，如果读者的确是时间有限，那么单凭书中所涉猎的知识，也足以完成读者学习和实践的过程了。
另外，这里还想强调的是，一定要多多实践，实践将成为您快速掌握一门新技术的不二选择。
为了方便读者获取书中涉及的相关资料和工具，我们开设了一个网站，读者朋友可以去访问以获取帮助。
最后，希望所有的读者在读完本书之后，都能够有所收获，希望每位读者都能编写出属于自己的嵌入式操作系统！
目    录
第1章  搭建工作环境 1
1.1  选择合适的开发环境 1
1.1.1  准备Cygwin开发环境 2
1.1.2  使用Linux开发环境 7
1.2  开发工具的使用 8
1.2.1  编译器的选择和安装 8
1.2.2  编辑器的选择和使用 10
1.3  虚拟硬件的安装和使用 13
1.3.1  SkyEye的安装 15
1.3.2  SkyEye的使用 15
1.4  总结 17
第2章  基础知识 18
2.1  使用C语言写第一段程序 18
2.2  用脚本链接目标文件 22
2.3  用汇编语言编写程序 25
2.4  汇编和C的混合编程 29
2.4.1  过程调用标准 30
2.4.2  混合编程的例子 31
2.5  Makefile 33
2.6  总结 35
第3章  操作系统的启动 36
3.1  启动流程 36
3.1.1  ARM的启动过程 38
3.1.2  ARM操作系统解读 39
3.1.3  正式开始写操作系统 46
3.1.4  让启动代码运行起来 52
3.2  MMU 56
3.2.1  页表 58
3.2.2  页权限 64
3.2.3  cache和write buffer 66
3.2.4  激活MMU 69
3.3  GCC内联汇编 71
3.4  总结 78
第4章  打印函数 79
4.1  打印函数实例 80
4.1.1  变参函数是如何工作的 81
4.1.2  亲自实现一个可变参数函数 83
4.1.3  实现打印函数中的格式转换 87
4.2  实现自己的打印函数 91
4.3  总结 99
第5章  中断处理 100
5.1  ARM的中断 101
5.1.1  统一的异常和中断处理 102
5.1.2  独立的中断处理 114
5.2  简单的中断处理实例 118
5.2.1  解决异常向量表的问题 118
5.2.2  简单的中断处理代码 120
5.2.3  S3C2410中的定时器 122
5.2.4  让中断处理程序运行起来 124
5.3  复杂的中断处理实例 126
5.3.1  提高中断的效率 126
5.3.2  中断嵌套的实现 130
5.4  更优秀的中断嵌套方法 134
5.5  总结 139
第6章  动态内存管理 140
6.1  伙伴算法 141
6.1.1  伙伴算法的原理 143
6.1.2  伙伴算法的实现 146
6.2  slab 169
6.2.1  使用slab的前提条件 170
6.2.2  slab的组成 171
6.2.3  通过slab进行内存分配 176
6.2.4  内存空间的释放 177
6.2.5  slab的销毁 178
6.3  kmalloc函数 179
6.4  总结 183
第7章  框架 184
7.1  驱动程序框架 184
7.1.1  基于存储设备的实例 186
7.1.2  运行存储设备实例 192
7.2  文件系统框架 194
7.2.1  文件系统的原理 195
7.2.2  文件系统框架的实现 197
7.2.3  romfs文件系统类型 200
7.2.4  实现romfs文件系统 204
7.2.5  让代码运行起来 210
7.3  总结 215
第8章  运行用户程序 217
8.1  二进制程序的运行方法 218
8.2  可执行文件格式 222
8.2.1  ELF格式的组成结构 223
8.2.2  操作ELF格式文件的方法 226
8.2.3  运行ELF格式的应用程序 230
8.3  系统调用 232
8.3.1  用户和内核的运行空间 232
8.3.2  实现一个系统调用 235
8.3.3  运行系统调用程序 244
8.4  总结 246
第9章  进程 247
9.1  进程的实现原理 247
9.2  进程的实现 252
9.2.1  改写中断处理程序 252
9.2.2  抽象调度函数 256
9.2.3  新进程的产生 258
9.2.4  多个进程同时运行 262
9.3  总结 265
结束语 266
参考资料 267