前言
这不是一本由几万行代码简单罗列成的书,也不是一本由各种技术文档堆砌成的书。当你在学习计算机操作系统原理时迷失了方向,它会为你点亮一盏灯,照亮前方的路。
计算机相关专业的读者们在大学时都学习过《操作系统》这门课程。对于什么是操作系统,老师们普遍以理论概念为主进行教授,比如,什么是进程,什么是线程,什么是文件系统等知识点。可是,像进程与线程的创建过程、空间换时间的应用场景等内容却鲜有提及。以上这些问题,我在学生时代的时候特别想弄清楚,但却无从着手,就算有些思路,也因为学艺不精,半途而废了。即使向老师们请教,也只得到理论性的解释,无法获得清晰、准确、具体的答案。我想,也许正在阅读本书的你们也难以将其缘由娓娓道来。不过,可能有些人觉得没有必要非常清楚这些问题,以前的我也曾有过此种想法。待到有幸从事几年Linux内核级的研发工作后,我才逐渐对上述问题有了比较直观、深刻的认知,并且慢慢体会到,如果不清楚操作系统原理,某些问题解决起来非常困难。
在计算机领域,中国的发展速度仍然落后于发达国家,师资力量不足是在所难免的。一些学校只是概括性地传授微机原理、汇编语言、计算机组成原理、编译原理、操作系统等基础知识,甚至还可能只将它们作为选修课程。当时作为学生的我觉得这些课程不重要,没有认真细致学习,但在工作多年的反思中才发现,它们是融会贯通计算机领域的必要知识,它们往往决定了一个人能在计算机行业走多远。而且,目前中国软件行业仍以外包为主,能够静下心来做技术储备、基础知识培训的自主研发型公司少之又少,这种局面使得我们想在工作中弥补基础知识依然十分困难。
现今,网络上已有不少关于操作系统实践类的文章和图书,这些文章和图书作为入门学习是很不错的选择。可是,这些文章和图书内容的一个通病是,操作系统普遍采用Intel 32位处理器的虚拟平台进行开发、研制。这个32位处理器的虚拟平台虽然学起来简单,但如果用到工作中举一反三的话,还是存在诸多差距与不足。比较典型的例子有,虚拟平台与物理平台在软硬件执行流程上的差异、多核处理器间的通信机制、高级中断控制器的配置、先进的64位处理器体系结构等,这些问题难以正确分析、推理及解决,会导致理论与实践脱节。
出于以上种种原因,作者想通过一系列图书把现代操作系统的真实面貌展现给读者,并希望借此寻找有兴趣和有能力的朋友们一起开发这款操作系统。考虑到对操作系统感兴趣的读者不在少数,基础知识的掌握水平势必参差不齐。为了照顾到各个方面,本书将尽量做到既适合在校学习理论知识的初学者,又适合在职工作的软件工程师或有一定基础的业余爱好者。
这是一个基于Intel处理器IA-32e体系结构编写的操作系统雏形。虽说它只是一个操作系统雏形,但为了使读者能够在学习Linux内核源代码时得到一些助力,本系统还将Linux内核的精髓(提炼自多版Linux内核)融入其中,并以物理平台作为主要运行环境、虚拟平台作为辅助运行环境。IA-32e体系结构可以通俗理解为“64位处理器”。阅读过Intel技术文档的读者应该知道,64位处理器是在原有32位处理器的基础上扩展而得的,其对32位处理器的运算速度、数据带宽乃至运行时的高效性、安全性都进行了全面升级与优化。因此,64位操作系统比32位操作系统“快”是有诸多理由的,这些理由很难用几句话解释清楚。
本书从计算机上电启动开始,循序渐进地实现了一个64位操作系统的雏形。先介绍一下本书操作系统的硬件运行环境。作者使用Lenovo ThinkPad X220T笔记本电脑作为操作系统的物理平台,其上搭载着一枚Intel (R) Core (TM) i7-2620 M CPU @ 2.70 GHz(这串字符将在正文里通过程序从处理器中取得)双核四线程处理器,并配有8 GB容量的物理内存。如果条件允许的话,读者还可以准备一台电脑作为编译环境,否则反复重启同一台电脑会严重影响开发效率。除此之外,还必须准备一个U盘,要在物理平台下运行操作系统,怎能少得了U盘引导呢!U盘的容量无需太大,16 MB或8 MB足矣。
时至今日,我依然能够清晰回忆起当初编写这个操作系统时遇到的各种困难,以及经历过的一次次挫败、煎熬与崩溃。此刻,当你们读到本书时,说明那些困难已经成为历史。“失败不可怕,害怕失败才真正可怕。当你意识到失败只不过是弯路时,你就已经走在成功的直道上了。”用这句话,希望可以与读者共勉。
结伴冒险即将开始,希望读者能和作者痛快走一回。
阅读指导
鉴于本书采用迭代方式循序渐进地去实现一个操作系统,而并非一次性构建起来,所以在开发的每个环节都会对之前的代码进行修改、调整和升级。为了节省篇幅,本书会附赠源码和运行效果图,而书中内容将主要针对有变动的重要信息进行讲解,请读者借助代码比较工具(如Beyond Compare)和运行效果图并行研习。
限于篇幅,本书只对研发期间所涉及的知识进行讲解。对于读者在实践过程中提出的疑问或困惑,本书会略过,还请读者查阅相关官方文档。
对于没有操作系统开发经验和缺乏设计思路的读者,强烈建议你们在阅读完本书后,再按照书中的描述去实践自己的操作系统,以免初次阅读本书时编写出运行效果不佳的程序。
本系统使用的编译器要求汇编代码使用小写字母书写,而Intel官方白皮书对汇编指令和寄存器的描述均采用大写字母书写。此种现象源于各个编译器对汇编指令的书写格式要求略有不同,有的编译器甚至会通过前/后缀符号对汇编指令做进一步修饰。为了区分正文中的汇编代码和汇编指令,本书统一使用小写字母表示汇编代码,而汇编指令和寄存器则统一使用大写字母表示。
保留英文缩写
为了做到原汁原味,对于页管理机制(32/64位处理器体系结构)中常用的专有名词,在不引起困惑的前提下,本书尽量使用英文缩写(更多英文缩写请见“术语表”)。
❏ PML4(Page Map Level 4):4级页表。
❏ PML4E(PML4-Entry):PML4页表项。
❏ PDPT(Page Directory Pointer Table):页目录指针表。
❏ PDPTE(PDPT-Entry):PDPT页表项。
❏ PDT(Page Directory Table):页目录表。
❏ PDE(PDT-Entry):PDT页表项。
❏ PT(Page Table):页表。
❏ PTE(PT-Entry):PT页表项。
鸣谢
本书历经近三年时间撰写而成。在写作期间,作者收获颇多,也沉淀许多。在此,由衷感谢人民邮电出版社图灵公司给予的出版机会,感谢策划编辑王军花、陈兴璐严谨、专注的工作使本书绽放出更加绚丽的光彩,感谢在幕后为本书辛勤付出的编辑们。同时也感谢宋玉鹏先生为本书提供的写作建议与部分插图。
我们在求知的道路上会遇到许多良师益友,前行的每一步都站在巨人的肩膀上,在此特别感谢他们曾经提供的技术帮助与支持。他们是符田、吴昊、王喆、王航、张轶伦、高乐乐、孙海鲛、康思为特、郜弘毅、郜弘睿、李海涛、张鹏、孙林、李麟、化松收、赵晓燕、崔鹏、乔国荣、姜峰、赵云云、周海龙、刘永康、崔永、毛振宇、苏立斌、张超、佘建伟、张松、刘昊、李庆松、曹美玲、王超、杨沐天、杨晗、赵兵、甄帅。
今天之所以不同于昨天,恰恰是因为昨天的感受依然在我们心中。