对Linux的内核学习和研究的越多,越觉得其乐无穷。因为Linux内核的代码是由这二三十年来,世界上顶尖聪明的一群人编写的,为提高效率而做的各种设计和算法,充满着智慧的光芒。有时,在理解这些设计和算法的过程中,就像在做思维体操。
Linux操作系统是一个世界,去探索这个世界,知道它为何要这么设计,能满足人的好奇心、求知欲。有时看到一个精妙的设计,真的很想让更多的人也领略到,就像你看到了一处绝美的风景,也想让身边的人都能一睹。
有很多长跑爱好者,以跑步为快乐,以参加各种马拉松赛事为目标,这可能不被一部分人所理解。跑步多累啊,跑个一千米都那么累,别说十公里,更别说马拉松了。可是,据科学研究表明,在跑到一定的时间和距离后,人体内就会分泌内啡肽,让人镇静和愉悦。可是,如果你不经历前面那几千米相对难受的阶段,就没法体会到这种特殊的感觉。
这就像探索Linux内核一样,如果你不掌握hash表,workqueue等基础的数据结构和组件,你就无法理解众多的代码是如何实现的。一个模块的数据结构看起来枯燥,但往往是理解这个模块的入口。而当你掌握了一些基础的组件,你就可以理解一些简单的模块,在理解这些模块的过程中,又可以学会一些更综合的组件,进而理解更复杂的模块。
当你可以不借助别人的解释,仅仅通过代码和必要的注释,就能基本理解一个模块大概在做什么,为什么要这么做,就能感受到一些乐趣。稍微复杂一点的代码看多了,再去看一些相对简单的代码,就会觉得更轻松。就像那些跑过马拉松的,平时跑个三千米对他们来说只能算是热身。
读书也好,看代码也罢,真正感兴趣的东西,根本用不着坚持,常年的做下去,是很自然而然的。不给你钱你也愿意做的事,才能持久。除了日常的工作,人是需要一点长久的兴趣爱好的,在你闲下来的时候,才不会因为找不到事做而无聊空虚。
操作系统是软件,但它和硬件的联系是非常多的。如果你不了解CPU,那么你可能都分不清Linux的哪些模块其实是依托于硬件的。没有硬件的MMU,软件的page table就难以实施,虚拟地址就不易实现;不懂cache,就无法理解多核环境下的原子操作,以及spinlock等各种同步机制的原理……所以,对CPU基本的掌握对理解操作系统是很必要的。
目前主流的处理器架构主要是x86和ARM,提到x86的手册,一般会说到Intel的SDM(Software Developer’s Manual),SDM有2个版本提供,一种是有4个volumes的,一种是有10个volume的,其实它们的内容是一样的,4个volumes的是分1, 2, 3, 4,10个volume的是细分为1A, 1B, 2A, 2B, 2C,2D, 3A, 3B, 4A, 4B。
SDM全加起来好几千页,不可能都去读,也没必要都读。volume 1是概括性的描述,适合总览,volume 3是对各部分功能更detailed的描述,平时翻看频率最高。而volume 2是讲解指令的,就像字典一样,需要了解指令具体用法的时候才需要查阅。
还有一家做x86的公司AMD,它同样有一份针对x86-64的文档,叫AMD64 Architecture Programmer’s Manual ,分为两个volumes,volume 1是概述,volume2更详细。我个人的体会是,AMD的这份文档比Intel的SDM更容易理解,配图也更丰富。
至于ARM,以v8为例,基础的是Programmer’s Guide for ARMv8-A,更详细的就是ARM Architecture Reference Manual ,分别相当于Intel的volume 1的volume 3。描述指令的文档是ARM A64 Instruction Set Architecture,对应于Intel的volume 2。随着v8架构的演进,从v8.0到v8.5,还有相关的Reference Manual Supplement,介绍每个version新增的特性。