本文转载自:开源中国linux
2019 年是 Linux 内核诞生的第 28 年,1991 年 8 月 26 日,当年仍是大学生的 Linus Torvalds 向 comp.os.minix 新闻组的成员透露了出于“业余爱好”而正在研究操做系统的消息。 程序员
Linux Kernel 是全球最大的开源项目,知名的科技公司几乎都参与其中,包括微软、谷歌、Red Hat、SUSE、Intel、Facebook、百度、阿里、华为、Oracle 与腾讯等。同时,基于 Kernel 衍生出的发行版与各类周边项目也让其生态多姿多彩。编程
另外一方面,在当今云原生高速发展的时代,其底层也大多基于 Linux Kernel,甚至连微软也表示 Linux 运行了 Azure 工做负载的 50% 以上。设计模式
Linux Kernel 短时间内不会过气,而是会进一步影响到更多开发者,可是 Linux Kernel 的入门和实践却很困难,这让许多初学者望而却步,哪一个开发者说本身是 Linux Kernel 领域的,那其余人一定会肃然起敬。服务器
最近了解到有一本值得初学者学习的相关书籍《精通 Linux 内核——智能设备开发核心技术》,咱们就如何学习 Linux Kernel、Linux Kernel 2019 年的发展与相关应用领域等问题采访了做者姜亚华,但愿能给到想要了解、研究 Linux Kernel 的开发者一些启发。如下是对话内容。数据结构
2019 年 Linux Kernel 进入了 5.x 时代,虽然 Linus 本身说从 4.20 到 5.x 只是由于本身手指不够用,可是实际上以您的理解,这对于项目的生命周期管理、特性合并或者社区文档建设等方面有没有比较大的影响呢?架构
姜亚华:运维
5.x 其实更新蛮多的,patch 文件 40 多 M,涉及 10000 多个文件。函数
这是一个大版本更新,从用户意识角度来说,4.x 已是旧的了,就好像 iPhone 更新,Apple 维持两年一个大更新的节奏,买了一款 iPhone,下一年的小更新不会有啥感受,可是第二年大更新后,才以为个人手机不是最流行的了。工具
新的项目,文档等确定都须要向 5.x 看齐了。
从代码角度来说,咱们能够从内核更新的过程当中学习到不少优化的思路。我开始写做《精通 Linux 内核——智能设备开发核心技术》的时候内核仍是 3.x,在书中也刻意保留了部分 3.x 的讨论(sysfs、进场切换等),就是为了经过对比总结这方面的经验。
书中讲到文件系统,可是没有关于最近微软件开放出来的 exFAT,猜测是由于您这书已经在此以前就写了,那目前您有没有继续研究 exFAT 相关的内容呢?目前 exFAT 也已经在 5.4 中支持,它的能力上会带来什么影响呢?
姜亚华:
是的,我接下来打算再深刻一些模块,exFAT 是其中之一。它的将来如何还很难说,Linux 已经有不少优秀的文件系统了,它们都通过了多年的验证,bug 可能也相对少一些,exFAT 还须要在 Linux 上通过时间的考验。
近期另外一个内核新特性也引发了普遍的讨论,那就是内核锁定,这个特性其实讨论了多年,最后它的表现形式彷佛也挺让人不解的。该特性限制了 root 角色的权限,可是 root 是系统的最高级权限都有不能访问的地方,这对于 root 来讲是挺奇怪的一件事情,在开发、运维或者平常使用上这会产生什么比较大的影响吗?
姜亚华:
内核锁定主要是为了防止 root 账户篡改内核代码,从而在用户态进程和代码之间划清界限。启用锁定模块后,各类内核功能都会受到限制。其中包括对内核功能的访问限制;对 /dev/mem 的读写操做的阻止;对 CPU MSR 访问的限制;以及防止系统进入睡眠状态等等。
这对 root 来讲其实并不奇怪,它依然是超级用户,能够访问全部正常的门。只不过内核锁定把一些“后门”去掉了,这些门常闭或者不存在了。
引入内核锁定(CONFIG_SECURITY)后,root 的访问受到限制,开发、运维等过程当中使用的脚本或者 sequence 可能就不能工做了。好比 root 能够经过 /dev/mem 文件访问内存,引入内核锁定后可能会受到限制。
说句题外话,root 是个挺危险的东西,慎用。记得我负责管理部门服务器的时候,有一次供应商帮我移植驱动的过程当中,安装软件的时候不当心删除了一些文件,服务器断电后就没法启动了。我带着光盘,在无数服务器轰鸣的实验室中,花了好几天才将它“抢救”回来。
相信不少开发者,或者刚在大学学计算机的人在了解了 Linux Kernel 以后都会想要去读它的源码,可是应该大部分都会不得其法,最终放弃。您是怎样阅读 Linux 内核源码的呢?有什么工具、方法与其它经验能够分享?
姜亚华:
我也是一行一行代码看下来的,几点建议供你们参考。
首先,先大概弄清原理,再仔细研究代码,事半功倍。对于已经成熟的模块,能够先借助书籍和博客大体理解它的基本信息。
其次,边读代码边作笔记,防止看了后面忘记前面。作笔记的软件蛮多的(好比微软的 OneNote),选择用的习惯的就好。
最后,自我激励,坚持到底,最好是兴趣使然。
好在你们不须要从头开始了,我已经把本身看过的代码的截图放在随书资料中了,算是一小段捷径吧。这些截图里面,某函数、它调用的函数等函数调用关系使用红线标示(以下图),内容包括内存管理、文件系统和进程管理三大模块。
你们遇到疑问也能够联系我,共同探讨,OSC 站内信(always_first_meet)或者邮件(linux_kernel_os@163.com)均可以。
Linux 内核十分庞大,阅读源码的时候哪些部分是最开始的时候必须的,而哪些部分能够做为后续针对性的补充?
姜亚华:
内核代码量庞大,模块间的关系也错综复杂,建议初学者能够从相对简单并且独立的模块入手,好比一个简单设备的驱动。
先了解驱动自己的逻辑,以后是它的上下游,而后扩展到相关模块,最后自由发挥。
举个例子,在 drivers/input/keyboard 下面的文件是键盘驱动,咱们选择一个文件。
第 1 阶段,查看 xxx_probe 等函数,梳理控制和数据流程,理解驱动须要作什么。
第 2 阶段,适当拓展,代码内调用的函数大概是如何实现的,驱动涉及的中断、定时器、input 子系统等机制的原理,这些机制相对独立,文档也多,多花些时间便可。
第 3 阶段,追根溯源,研究 xxx_probe 是如何被调用的,i2c 总线的驱动(假设键盘接 i2c 总线),device/device_driver/bus 的关系(驱动架构)。
阶段 2 与 3 能够同时进行。
第 4 阶段,自由发挥,按照工做须要和兴趣,进军内存管理、文件系统和进程管理等模块。
就算是可以阅读源码,另外一个问题也会出现,就是读了源码,理解了它的逻辑,可是有什么用呢?最简单的是增加了本身的见识,可是实际上这就像阅读了一本书可是不输出本身的理解与观点,没有太大的做用。您是怎么看待而且怎么解决这个问题的呢?
姜亚华:
研究内核有什么用,这是一个值得深思的问题。
中国如今这个时候的确须要沉下心玩底层系统的人,中国渴望自主操做系统已经好久了,尤为是如今这种多事之秋。可是若是没有大批工程师在这个领域积淀的话,操做系统无疑是一种空谈。
先不论将来的国产操做系统是否必定是 Linux 内核的,研究 Linux 内核自己也是很好的技术积累途径。
仅仅从我的职业生涯角度出发,研究内核对我的技术的成长有极大帮助,能够分多个层次看待。
第 1 层次,初识,对内核有大概的了解,须要花时间深刻工做相关的模块。研究内核会占用大量时间,产出并不明显。
第 2 层次,入门,熟悉工做相关的模块,理解内核模块间的关系。研究内核会让你豁然开朗,常常有“原来 xxx 是这么实现的”之类的感叹。
第 3 层次,熟悉或精通,对内核经常使用模块有必定研究,熟悉代码。即便是新模块,也能够快速厘清脉络。
除了第 1 层次“浪费”时间外,花时间研究内核能够反过来提升咱们的效率。研究到了必定程度后就能够进入一个良性循环,研究得越多,效率越高,节省的时间越多,能够研究的越多。
另外,看的代码越多,越有能力解决错综复杂的问题,金老爷子也说“重剑无锋,大巧不工”,绝对的实力才是硬道理。
仍是 xxx_probe 的例子,若是咱们的 probe 没有被调用,新手可能会检查 device 和 device_driver 的名字是否匹配,研究过驱动架构的工程师可能分 device、device_driver 和 match 三部分检查。
若是三部分看似都没有问题,可是 probe 依然没有调用呢?研究过代码的工程师可能会想到 device 是否是已经和另外一个 device_driver 匹配了。
经验能够帮助咱们看到问题的关键部分,真正研究过代码才能看到问题的本质。庖丁看到的不是牛,而是肌理结构,到了这种境界换成羊也是同样的。
最近常常听到一句话,“工做 xx 年,就是一年的工做经验重复 xx 年”,若是只是要求“会用”的层次,的确一年足够,但工程师在这种状况下迟早会失去核心竞争力。
有人倾向于使用结论,但要作的应该是总结和解释结论。
如今学习 Linux Kernel,主要有哪些工做方向呢?又是哪些类型的公司、业务会主要须要这种能力?
姜亚华:
驱动工程师、嵌入式工程师、系统工程师、Linux 程序开发工程师,甚至运维工程师这些岗位都须要了解内核,就像从事 Java 开发的工程师须要研究 JDK 同样,并非只有从事内核相关工做的工程师才须要研究内核,反过来懂内核的人向上发展也是很容易的。
有半导体相关业务的公司都须要这类人才,之前传统的半导体公司需求大一些,但近几年互联网公司也纷纷涉足半导体领域,BAT 都包括在内。美国一系列动做以后,近期中国进入了芯片和操做系统研发热潮,一大批芯片公司成立,燧原、平头哥、寒武纪与商汤科技等等,它们也都须要内核相关的人才。
您这本书讲到关于智能设备的开发,Linux Kernel 与 AI 有什么特别大的关系呢?
姜亚华:
其实这个问题我在此次写的书里有解释。
如上图,“硬件厂商负责硬件,原语(primitives)库通常也由他们维护,好比 AMD 的 MIOpen、Intel 的 MKL 和 Nvidia 的 cuDNN,多数程序员并不会接触这部份内容,而是使用已有的 Framework。
Framework 的选择也是多样化的,Google 的 TensorFlow,Facebook 的 PyTorch,微软的 CNDK,亚马逊的 MXNet、Theano 和 Keras。很明显,目前依然是百花齐放的局面,但技术的发展终归只能是“三分天下”,甚至是“一统天下”。目前已经存在与这些 Framework 配套的工具,好比 Tensorboard,能够用来查看 TensorFlow 的训练状态。
因为深度学习计算量太大,并行计算技术也会有所涉及,好比 MPI(Message Passing Interface)通讯协议、英伟达的 NCCL(NVIDIA Collective Communications Library)。
数据对深度学习十分重要,大数据是必不可少的。数据做为输入,模型做为输出,应用于数据中心、我的计算机、机器人和无人驾驶汽车等设备中。
纵观这整个过程,并无哪个环节提到了 Linux,但实际上多数环节都与 Linux 有关。虽然这些关系可能只有少数程序员关注,但随着技术的成熟,新的智能设备,甚至新的操做系统,又会转回到咱们熟悉的内核。
在您研究 Linux 内核的过程当中,有没有以为 Linux 内核其实还能够用其它语言实现一次,这样对于入门学习会好不少,好比用 Python 这种简单理解的语言。这样的想法可行吗?会遇到什么技术问题?
姜亚华:
内核里面有不少代码采用的都是面向对象的思想,好比 VFS 采用了较多面向对象程序的设计模式,像 command 与 template method 等,使用其它语言尤为是面向对象语言来实现 Linux 内核是可行的,可是不得不说的是其它语言(好比 Python)很难有 C 语言的执行效率。
2019 年是 Linux Kernel 28 周年,分享一下您在这其中关于 Linux Kernel 印象最深的事情吧。
姜亚华:
Linux 内核是开源的,天生与微软(更确切的说是 Windows)就是宿敌。微软对 Linux 前期的敌对和近些年的转变是件颇有趣的事情,敌对时期就很少说了,近几年微软宣布“爱 Linux”,也作了不少实事,Azure、SQL Server 和 Visual Studio Code 等都有了 Linux 的身影。
这对 Linux 是好是坏先不说,这起码说明了 Linux 的强大,有种“东方教主,千秋万代,一统江湖”的感受哈哈。
这是一件关于 Linux Kernel 印象比较深的事情,还有另外一件也值得一提,那就是我今年写了一本 Linux Kernel 相关的书籍《精通 Linux 内核——智能设备开发核心技术》,借此也宣传宣传,同时但愿可以经过这本书为道友们提供些许帮助。
这本书基于 Linux 5.x,历时五年,研究数百万行代码总结而成,共分为五个部分,按照先易后难的顺序剖析内核。首先介绍基础知识,包括数据结构、中断处理、内核同步和时间计算等,它们是理解后续章节的前提,在此基础上详细讨论内存管理、文件管理和进程管理三个核心模块,最后一部分升华篇融合了前面多个模块。重点和难点部分均配以图表、代码或实验,力求深刻浅出。
除此以外,本书列举了大量实例,分析了安卓操做系统的核心技术,使读者可以深入的理解理论知识。本书的读者须要熟悉 C 语言,可以对内核有必定了解更好。推荐初学者按照本书的既定顺序阅读,熟悉内核的读者能够直接阅读三个核心模块。
固然了,借这个平台,也但愿与道友们多多交流(包括但不限于本书的内容),欢迎你们跟我交流共同促进。另外本书是机械工业出版社《Linux 技术与应用丛书》的开篇之做,后续还会有一系列书籍出版,你们也能够关注关注。
姜亚华,一直从事与 Linux 内核和 Linux 编程相关的工做,研究内核代码十多年,对多数模块的细节如数家珍。曾负责华为手机 Touch、Sensor 的驱动和软件优化(包括 Mate、荣耀等系列),以及 Intel 安卓平台 Camera 和 Sensor 的驱动开发(包括 Baytrail、Cherrytrail、Cherrytrail CR、Sofia 等)。现负责 DMA、Interrupt、Semaphore 等模块的优化与验证(包括 Vega、Navi 系列和多款 APU 产品)。