前言
为什么写这本书
随着移动互联网技术的成熟,物联网也开始崭露头角,由此产生了各种小型、低功耗的智能硬件,这些智能硬件被嵌入到移动电话、手表、冰箱、空调、电视机、洗衣机等常用电子产品中,使这些常用电子产品功能更加强大、更加智能,而且它们可以连接到网络,便于用户远程操控,从而大大改善了人们的生活。
因此,嵌入式行业才变得如此火热,那些被嵌入到电子产品中的智能硬件,也需要一些小巧、特殊的操作系统软件才能正常工作,这类小巧、特殊的操作系统软件,称为嵌入式系统。2013年下半年,我开始学习嵌入式系统,并编写了一个嵌入式操作系统——LMOSEM。在互联网上也认识了不少研究嵌入式的朋友,在他们的要求和规劝下,我终于有勇气把我研究出来的东西归纳、整理成册,也算是我学习的笔记,于是就有了这本书。虽然有很多的顾虑,怕贻笑方家、怕误导同道……但是我的每行代码、每个点子,都在实机上测试过并证明了其正确性,所以也就心下一片坦然了。如果这本书能够被后来者借鉴一二,或者解决他们的一些疑惑,我自然欣慰万分。
关于LMOSEM
关于LMOSEM,这得从LMOS开始说起。2010年下半年,我开始准备要写个操作系统内核,没有其他目的,只是出于学习,出于兴趣。由于是自己独立从零开始设计、编写的,我觉得自己这种行为有点疯狂,索性用LMOS(liberty madness operating system)命名了我的操作系统。LMOS经过这几年的独立开发,现在已经发布了6个测试版本。先后从32位单CPU架构发展到64位多CPU架构,现在的LMOS已经是多进程、多线程、多CPU、支持虚拟内存的x86_64体系下的操作系统内核。LMOS的这些特性,非常适合通用计算机领域,如PC、工作站、小型服务器。这些特性导致LMOS代码量庞大,一些组件不够小巧,削剪起来非常复杂,很难保证削剪后的组件是否健壮,因此LMOS不适合于嵌入式领域,所以笔者才重新开发了LMOSEM——适合嵌入式领域的操作系统。
LMOSEM依然删除了很多代码,因为写书要做到简单,便于理解。即便如此,LMOSEM依然包含了现代操作系统的大部分重要组件,如内存管理、进程管理、驱动模型、文件系统等。这些组件的实现过程在本书中都会有详细的介绍。LMOSEM不支持实时性功能,嵌入式操作系统也不一定要是实时性的操作系统,何况我们是出于学习的目的。为了代码的清晰、简单,我们暂不考虑安全性和性能方面的问题。等到明白了操作系统原理,我们再去不断修正、优化,使之功能变得更多,性能变得更强。笔者开发的LMOSEM操作系统项目,是在Linux操作系统下开发的,用到了Linux操作系统的很多工具。笔者不会和读者讨论为什么不用常用的Windows系统,也不会说谁好、谁不好。如果读者非常喜欢Windows系统,那么也可以尝试着把这个项目迁移到Windows系统下。但是笔者书中演示的环境还是Linux系统。关于如何搭建开发环境,本书后面的章节有详细的介绍。在那里读者会发现用Linux系统开发LMOSEM内核有很多方便之处,如会用到的MAKE、GCC、LD等,这些工具在Linux系统下都很容易得到,在Windows系统下虽然也能做到,但相对麻烦一点。何况今天的Linux系统已经很好用了。
读者对象
□如果读者是一位纯粹的操作系统爱好者,对其有着浓厚的兴趣,那么本书将非常适合。
□如果读者是嵌入式领域的从业者或者学生,也可以从本书中获得很多帮助。
□如果读者是一位普通的应用软件开发者,业余时间也可以翻翻此书,书中的一些设计方法和编程手段,或许可以借鉴一二。
□如果你只是想了解一些计算机硬件系统和软件系统的常识,那么本书同样会让你获益。
如何阅读本书
为了能更轻松地阅读这本书,笔者建议先了解C语言这门编程语言,对数据结构有所了解就更好了。除这些外,笔者假定读者没有其他任何技能。除了需要的上述技能,读者还需要对操作系统有强大的兴趣和求知欲,要有坚强的意志、永远不放弃的精神。开发操作系统内核本身就不是件容易的事,必然会有很多问题在等着我们,但是遇到问题不要害怕,静下心从容面对,只要我们不放弃,问题最终会解决。
本书很简单,没有拐弯抹角,没有反复修饰,但是必要的细节从不漏掉。宁可在细节上啰嗦一点,也不在不相关的地方多写一句。
本书的最终目的是构建一个用于学习的嵌入式操作系统内核,并工作在真正的物理机上。为了达到这一目的,本书大体上分为三部分:综述、硬件部分和软件部分。
综述部分(第1章)。
第1章,先说明操作系统的概念、功能和演进历史,最后得出现代操作系统的模型,使我们可以了解操作系统的轮廓。
硬件部分(第2~3章)。
第2章,从选择硬件平台开始,首先概述硬件平台的整体情况,接着了解编写操作系统内核必需的一些平台上的组件,如实时时钟、定时器、串口、中断控制器、内存芯片、Flash芯片、CPU、MMU等。让读者有初步的印象,在写代码用到某个组件时再详述其内部编程细节。
第3章,详细介绍处理器,重点介绍处理器的结构和特性、处理器的地址空间、处理器的状态和工作模式、处理器的寄存器和指令集。最后介绍处理器中的MMU和Cache,对于MMU,主要介绍MMU的作用和它对操作系统内核开发的影响、如何对MMU编程、MMU的几种地址映射方式。而对于Cache,重点介绍Cache的作用、Cache的类型、Cache的使用。
软件部分(第4~12章)。
第4章,介绍操作系统内核设计、操作系统内核的开发环境、开发操作系统内核的工具:GCC、LD、MAKE,以及它们的使用方法,最后介绍硬件平台的安装与测试。
第5章,首先介绍C语言使用寄存器的约定,以及它是如何处理参数、返回值的。接着介绍C语言基本数据类型的位宽及占用内存的大小,并用它们构建后面将要用到的一些基本的数据结构,如list_h_t、spinlock_t、kwlst_t、sem_t。然后介绍C语言的数据结构在内存中存在的形式、对齐方式。最后介绍GCC独有的嵌入汇编代码的方式。
第6章,开始介绍LMOSEM的初始化,从第一行汇编代码开始、初始化MMU和中断向量、初始化串口设备、初始化内存管理数据结构和中断相应的数据结构,最后对一些数据结构进行测试。
第7章,开始介绍LMOSEM的内存管理组件。LMOSEM的内存管理组件分为三层:块级内存管理、页级内存管理、字级内存管理,这三个层分别应对不同的内存分配请求。本章将结合实际代码介绍如何一步步实现这三大内存管理层。
第8章,介绍LMOSEM的中断管理组件,内容包括中断控制器的细节、中断管理组件的结构、如何处理中断、安装中断处理的回调函数等。
第9章,介绍LMOSEM的设备驱动模型,其中介绍LMOSEM如何管理众多的硬件设备、LMOSEM支持的设备类型、驱动模型的数据结构和基础性代码,最后用两个驱动程序实例介绍如何在LMOSEM的驱动模型下编写规范的设备驱动程序。
第10章,介绍LMOSEM的进程管理组件,包括进程的由来、进程相关的数据结构、系统空转进程的建立与运行、进程调度、新建进程、进程的睡眠与唤醒、进程测试等相关内容。
第11章,介绍LMOSEM的文件系统组件,包括文件系统的设计、文件系统的建立、文件系统的基础操作、文件本身的操作,如文件的打开、新建、读写、删除等。最后对文件系统组件进行严格的测试。
第12章,介绍LMOSEM的接口,包括许多LMOSEM的API和库函数的实现细节,主要包括时间、进程、内存、文件与设备、标准输入/输出等方面的API和库函数。
勘误和支持
由于笔者水平有限,加之编写时间仓促,书中难免会出现一些不准确的地方,恳请读者批评指正,在技术之路上共勉。我的CU博客地址是:http://blog.chinaunix.net/uid/28032128.html。本书源代码已制作成光盘镜像文件,并上传到华章网站(www.hzbook.com),需要的读者可自行下载。
致谢
我,自幼患病,读书不多,计算机成了唯一的兴趣爱好,没有父母的长期支持,连生活都尚且不能自理,更别说完成此书了,他们对我的帮助和关爱,纵使千万言语也难表一二。由于经常在物理机上测试内核,要拆装一些设备和器件,这多亏了我的小弟,因为他一有时间就帮我做这部分工作。当然还有帮助过我的朋友,有一些是身边的,有些是网络中的。对父母、所有的亲人、朋友,我也只有常怀感恩之心,说声谢谢,谢谢他们一直的支持、帮助,谢谢他们一直对我那满满的关爱!
让笔者和你一起带着未知,带着好奇,带着兴奋,踏上操作系统的旅程吧!