Windows内核原理与实现
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 学习操作系统之必备知识

前面提到,操作系统是直接建立在硬件层之上的软件。由于它需要直接跟硬件打交道,而且本身又为其他的软件提供了基本的执行环境,所以,仅仅掌握基本的软件开发技能还不足以理解和掌控一个完整的操作系统。为了便于读者更加有效地学习操作系统的基本知识,以及理解一个像Windows这样的复杂操作系统,本节将介绍一些笔者认为必不可少的基础知识,包括体系结构、汇编语言、编译原理和C/C++语言。如果读者缺乏这方面的背景,建议在阅读本书以前先了解或学习相关的内容。

首先,有关现代计算机处理器的体系结构知识,会帮助读者更好地理解操作系统中的各种机制为什么要这样设计而不是那样设计。例如,操作系统中对于多线程的支持需要考虑处理器体系结构的指令集和寄存器集,而内存管理部分更需要吻合处理器的内存寻址方案,像段式内存寻址或者页式内存管理,等等。另外,硬件上的优化对于系统软件并不一定是透明的,这意味着有些优化需要软件来支持,例如,有些快表机制(TLB)允许操作系统来填充快表中的表项。因此,为了充分发挥硬件的性能,系统软件也有必要做一些针对性的处理。

作为学习操作系统的先学知识,读者并不需要精通体系结构的方方面面。然而,基本的指令流执行过程和指令执行过程中的时序分析,以及内存寻址的实现方案,对于理解操作系统的底层实现是非常有帮助的。

现代操作系统几乎都是用C语言来编写的,使用C语言有两方面的原因:一是为了可移植性,因为几乎每一种硬件平台上都有C语言的开发支持;二是由于C语言和底层汇编指令之间有较好的对应性,所以,C代码的性能较容易控制,同时也易于理解。然而,对于在特定硬件体系结构上实现的一个具体操作系统,除了C代码以外,或多或少还会有一些汇编语言代码,也就是直接针对处理器来编写的代码。这些汇编代码,有的是为了优化而绕开了C编译器,有的则是为了处理一些C编译器和C运行库没有提供的、但又不可避免的任务,例如操作系统在处理内核模式和用户模式切换时需要用到特殊的指令,以及维护有关的状态寄存器。

汇编代码通常用于实现一些比较精巧的任务,很少用大量的人工汇编代码来实现复杂的功能,毕竟,编写汇编代码对于程序员的要求甚高,而且,生产效率相对低下,所以,汇编代码在操作系统中通常只用于实现某些特定的任务。但这些代码对于理解整个系统的运行又非常关键,它们常常出现在线程切换、中断处理例程等关键之处。因此,与硬件体系结构相关联的汇编语言知识对于学习和理解操作系统很有帮助。对于本书而言,基本的Intel x86汇编语言知识将有助于理解Windows操作系统中的一些关键点。本书在适当的地方会引用到Intel x86汇编指令。

除了硬件体系结构和汇编语言知识以外,有关编译的知识更是必不可少。操作系统需要负责从系统加电一直到等待接收用户输入这整个过程,它必须逐渐建立起系统执行环境;操作系统必须为应用软件提供完全的执行环境,它需要定义应用软件的二进制规范,需要解决从二进制映像文件到内存代码和数据之间的映射关系,甚至还需要针对二进制代码的一些特点进行适当的优化处理。然而,几乎所有的软件,包括系统模块和应用程序,都是用高级语言编写的,它们经过了编译器的代码生成过程,所以,掌握编译原理有助于理解操作系统是如何加载和运行各种二进制模块的。

最后,C语言是系统程序员之间进行交流的基本语言。Windows内核的绝大部分代码是以C语言来编写的,大多数其他的内核也如此。本书中列举的代码大多是C代码,而书中用到的很多工具则是用C++来编写的。你可以把C看做C++语言的一个简化,或者把C++看做C语言的面向对象扩展,但这种观点其实并不完全正确。C和C++是两种连设计思想都完全不同的语言,本书并不介绍这两种语言,但是很多地方会直接列示C代码来讲解一些细节知识,所以,基本的C语言知识是必不可少的,如果有C++的知识,则更有助于理解一些上层的C++代码。

简而言之,在学习本书以前,读者需要具备基本的硬件体系结构和汇编语言知识,而且对于二进制代码的规范和生成过程有基本的了解。当然,熟练的C语言技能更是必不可少的。