前言
操作系统一词的内涵比较丰富。当我们听说某人是操作系统高手时,可能指这个人是操作系统“系统管理”高手。也就是说,这个人可以快速架设Web服务,能把崩溃的文件系统修复,能设置复杂的网络绕过防火墙又不失安全,等等;又或者这个人是一个“系统编程”高手,能够编写复杂而高效的服务器程序,将多进程/多线程并发、通信与同步等各种技艺玩得炉火纯青;还可能这个人是一个“内核编程”的高手,不仅会编写实现不同文件系统的各种内核模块、还精通编写各种硬件的设备驱动程序。
无论上述哪种高手,都离不开对操作系统基本原理的认知,如果对操作系统的核心机制和编码实现有所认知,都将如虎添翼。操作系统的基本原理和算法层面的知识,我们在大学本科操作系统课程已经掌握得很好了,但对于操作系统的核心机制——特别是软硬件结合的机制,则明显不足,更别说编码实现了。因此上面提到的高手,大多是在职业生涯中自我修炼而成的。说是修炼,是因为没有系统的指导,也没有系统的训练教材,甚至没有人指出成长学习的路径和步骤。
系统软件系列丛书,为大家提供了明确的学习成长路径和充分的学习材料,尝试将原来刻苦的摸索和修炼,变成人人可以科学实施自学的系列课程。我们将该课程分解成四个步骤逐级推进,这四个步骤是:
(1) 打通C语言—可执行文件—进程映像的通路。
(2) 用观测手段将操作系统从黑盒变白盒。
(3) 掌握在“裸硬件”上设计和实现操作系统核心机制的能力。
(4) 钻研真实操作系统代码。《Linux GNU C程序观察》是第一块基石,将打通从C语言源程序一直到操作系统进程映像的通路。C语言编程和进程的概念,大家都很熟悉,但是如何从C语言到进程,这两者间的环节缺失太多。《Linux GNU C程序观察》自称为C语言的“下半部”基石,澄清了(1)C语言代码如何编译成汇编代码; (2)汇编代码(严格说是二进制机器码)如何通过链接形成可执行文件,链接过程中符号解析和静态/动态重定位过程,以及最终的ELF文件格式; (3)ELF格式如何将可执行文件创建进程映像; (4)如何跟踪和分析程序运行的行为。在解决了进程映像怎么来的问题后,就可以进入下一个问题——多个进程在操作系统中如何共存,如何被操作系统管理。
操作系统原型——xv6分析与实验前言《操作系统之编程观察》则是第二块基石,将原来被错作黑盒的操作系统,通过/proc文件系统等手段进行观测、测量,从而建立对操作系统功能和行为的直观认知。该书首先给读者介绍了一款必备工具——其类似于电路课程中的万用表和示波器。其次是将本科操作系统课程学习过的四大管理,通过系统编程知识逐一编写应用程序,调用或触发操作系统的相关功能,并用/proc及其他内核测量/统计信息,分析多个进程在操作系统发出各种请求时所发生的动作。例如,可观察或定量地给出了进程空间因分配、回收和文件映射等行为引起的堆、栈的动态变化;多进程/多线程的各种资源开销,因调度策略和优先级的差异而竞争CPU使用时间,因负载均衡而在多个CPU间迁移等;文件系统上的元数据格式及其在文件操作过程中呈现的变化等等。此时,可以说读者已经能将本科操作系统课程中的概念,与操作系统的具体行为建立起了全面的对应关系,能获得知识落地的感觉。
第三块基石是《操作系统原型——xv6分析与实验》,为读者提供操作系统编码实现的初步经验。xv6是操作系统实验的典型系统,被大家广泛学习。如果读者只是想零星地体验一下内核设计,比如看看进程管理、进程调度,会发现非常简单,甚至马上就能发现增强或优化的地方。但xv6本身并非只专注于解决四大管理的上层问题,而是更专注于解决如何在“裸硬件”上支撑分页、进程切换(映像切换和执行流切换)、中断与系统调用、系统启动等底层机制上的问题。虽然互联网上有各位高手对不同子系统的详尽分析,但也是上层分析居多,底层细节偏少,而且缺少独立详尽的材料能将所需的知识系统地有逻辑地呈现给读者。因为xv6本身麻雀虽小但面面俱到,所以《操作系统原型——xv6分析与实验》也将源代码的分析做到面面俱到——完整地分析了xv6的所有内容,包括C源文件、汇编S文件、Makefile,以及所需的x86处理器和核外的键盘、显示器和硬盘控制器等硬件知识。特别是关于x86的地址部件和进程执行流切换过程的细节,体现了精巧的设计思路和编程技巧,属于比较烧脑的部分。除此之外,本书还提供了初级、中级和高级三种实验及其示例代码,也设计了一些额外的练习题目,以供读者练手之用。当读者踏上第三块基石之时,已经对操作系统的设计和编码实现了然于胸,大多数人也可止步于此。
《Linux技术内幕》则是本系列的最后一块基石,也是系列丛书中最繁冗的一部。对于需要在Linux真实系统上进行开发实践的读者,可以将它作为备选材料之一,毕竟Linux内核的几部经典书籍大家都耳熟能详。但本书有自己的特色和优势,主要体现于开篇时给出了操作系统的多角度视图,拓展读者思考分析的视角,避免陷入盲人摸象的困境。读者借助于明确的功能模型、内存模型和时空模型这三个视角,能在阅读源码过程中将知识内化和自洽。其次在一些局部主题上也可能有一些优势,例如进程切换细节、文件系统各部件的联系等。
系统软件系列丛书共4本,其中前三本都是独具特色,各有建树,是系统软件学习环节不可或缺的知识材料,第四本也可圈可点。本系列丛书来源于深圳大学高性能计算所的教研实践,基于龙芯和Open Power8的国产高性能计算机研制,以及华为昆仑小型机、华为泰山/鲲鹏服务器系统软件开发,由积累的本科和研究生教学操作系统的经验汇集而成。
在操作系统的学习过程中,最难之处在于将知识内化和自洽。操作系统作为跨越软件和硬件的系统软件,所需背景知识极为庞杂。如果不能有效地从不同来源获取知识,并将这些知识系统性地综合起来,难度极大且效率极低。我们希望本系列丛书所汇聚和组织的知识能成为读者的攀登基石,协助读者一起推动系统软件的发展进步!
深圳大学计算机与软件学院高性能计算所系统技术组罗秋明2021年6月