2.2.1 原因
如果现在,在只有5行代码的程序中有一个错误,我们很快就能找到并解决它。如果100行代码的程序中有一个错误,我们也能容易地找到它。如果10000行代码中有一个错误,找到它就有点难度了。如果1000万行代码中有一个错误,要找到它可真不是件容易的事。而且可能在100行代码中有2个错误,1000行代码中有8个错误,甚至更多。还有可能在修复1个错误时产生了新的错误,等等,面对几千万行代码的操作系统,可能会让你疯掉的。
降低代码行数是个好主意,可是用5行代码去写个功能完善的操作系统是不可能的。于是人们把操作系统分为很多层,每个层又分为多个模块,这样每个分层里的每个模块的代码规模就小了很多。人们还把最重要的功能和一些机制放在一个独立的模块中,这个模块就是操作系统内核。有些功能模块在需要的时候才去装载,这样一个小而精致的内核最后配合那些独立的功能模块就能实现一个功能相当完善的操作系统。
既然操作系统内核是运行在这个硬件平台上的第一层软件,那么它是肯定要或多或少地了解一些这个平台上的硬件的。它究竟要知道多少,与它设计的规模有关,上面说了那么多就是为了证明一点:小而精致的内核更加稳定可靠。除非有必要,我们应该尽可能减少内核的功能,而把那些功能以独立模块的形式存在。
我们用的是mini2440这个平台。那么内核要关注这个平台的哪些硬件呢,后面再介绍内核的设计,先在此想象性地归纳一下:
1)CPU。内核也是程序要CPU去运行的,当然要知道它的细节,我们平台的CPU在S3C2440A那个黑盒子里叫ARM920T。
2)MMU。内核是放在内存中的,CPU要访问内存首先得经过MMU内存管理单元,我们平台的MMU在S3C2440A那个黑盒子里的一个叫CP15的黑盒子里。
3)内存。内核本身和其他程序都是放在内存里面的,我们平台的内存是用两片32MBSDRAM芯片并接在一起做成的64MB的内存。
4)RTC。实时时间,内核当然要知道现在是什么时间了。
5)定时器。内核中有很多功能的实现都依赖于定时器,如进程调度器的实现。
6)UART,串口。在调试内核时能够输出一些信息,表示内核是否工作正常。
7)中断控制器。设备有时要通知CPU,或者表示它的任务已经完成,而平台中那么多设备,这就必须要有专门的控制逻辑来控制它们,这就是中断控制器。内核要管理这些设备硬件,当然要知道它们什么时候需要CPU的关注,什么时候已经完成它们的任务。
对于一个小而精致的内核来说,知道这么多硬件已经够了。你可能会说,我们都还没设计内核呢,这只是想象中的。是的,万一后面不行了,再加入一些不就行了吗,没必要一步到位。
对上面这些硬件的介绍,除了CPU和MMU外,其他的都会在本章中以小节的形式先概述它们功能和用途,先让大家有个印象,做个铺垫。等到后面写操作系统内核真正用到它们时,再详细讨论。CPU和MMU,这两个有点复杂,完成的功能很多,而且在开始之前又必须认真地了解它们。所以后面用专用的章节详细讨论。