首页 - 设备 - Java开发者需要学习JDK,Linux开发者需要学习Kernel

Java开发者需要学习JDK,Linux开发者需要学习Kernel

2023-10-06 12:49

2019年是Linux内核诞生的第28年。 1991 年 8 月 26 日,当时还是一名大学生的 Linus Torvalds 向 comp.os.minix 新闻组的一名成员透露,他正在将操作系统作为一种“爱好”。

Linux Kernel是全球最大的开源项目,几乎所有知名科技公司都参与其中,包括微软、谷歌、红帽、SUSE、英特尔、Facebook、百度、阿里巴巴、华为、甲骨文和腾讯。同时,基于Kernel的发行版和各种周边项目也使其生态系统变得丰富多彩。

另一方面,在当今云原生快速发展的时代,其底层大多基于Linux Kernel。就连微软也表示,Linux 运行着超过 50% 的 Azure 工作负载。

Linux内核短期内不会过时,但会进一步影响更多的开发者。然而Linux Kernel的入门和练习比较困难,这让很多初学者望而却步。哪位开发者说自己是Linux Kernel领域的?是的,其他人肯定会敬畏。

最近了解到有一本相关书籍值得初学者学习《精通 Linux 内核——智能设备开发核心技术》。我们就如何学习Linux Kernel、2019年Linux Kernel的发展以及相关应用领域等话题采访了作者蒋亚华,希望能给您带来您想了解的内容。 ,给研究Linux Kernel的开发者一些启发。以下为谈话内容。姜老师将选出三位留言的读者赠送书籍

2019年Linux Kernel进入5.对社区文档建设等方面有比较大的影响吗?

蒋雅华:

5.x其实有很多更新,补丁文件超过40MB,涉及10000多个文件。

这是一个重大版本更新。从用户认知度来看,4、小更新我没啥感觉,但第二年大更新后,我感觉我的手机不再是最受欢迎的了。

新项目、文档等必须符合5.x。

从代码角度来看,我们可以从内核更新过程中学到很多优化思想。当我开始写《精通 Linux 内核——智能设备开发核心技术》时,内核还是3。

书上讲了文件系统,但是没有关于微软最近发布的exFAT的信息。我想这是因为你以前写过这本书。那么你有继续研究exFAT相关的内容吗?目前 5.4 也支持 exFAT。会对能力产生什么影响?

蒋雅华:

是的,接下来我计划进入更多模块,exFAT 就是其中之一。很难说它的未来会怎样。 Linux已经有很多优秀的文件系统,经过多年的验证,可能bug相对较少。 exFAT 在 Linux 上仍然需要通过时间的考验。

另外一个新的内核特性最近也引起了广泛的讨论,那就是内核锁定。这个特性其实已经被讨论了很多年,其最终的表达方式似乎也颇为令人费解。该功能限制了root角色的权限,但root是系统中的最高权限,有不可访问的地方。这对于 root 来说是一件很奇怪的事情。开发、运维、或者日常使用中会发生什么?影响比较大吗?

蒋雅华:

内核锁定主要是为了防止root账号篡改内核代码,从而在用户态进程和代码之间划清界限。当lock模块使能时,各种内核功能都会受到限制。其中包括对内核函数访问的限制;阻止对 /dev/mem 的读写操作; CPU MSR 访问限制;以及阻止系统进入睡眠状态等

这对于root来说其实并不奇怪,因为root仍然是超级用户并且可以访问所有普通的门。只是内核锁定去除了一些“后门”,而这些门通常是关闭的或者不再存在。

引入内核锁(CONFIG_SECURITY)后,root访问受到限制,开发、运维等使用的脚本或序列可能无法工作。例如,root可以通过/dev/mem文件访问内存,引入内核锁后可能会受到限制。

顺便说明一下,root 是一个非常危险的东西,所以要谨慎使用。记得我负责管理部门的服务器时,有一次我的供应商帮我移植驱动程序时,我在安装软件时不小心删除了一些文件,导致服务器停电后无法启动。我带着这张CD在无数服务器轰鸣的实验室里,花了好几天的时间才“拯救”它。

相信很多开发者,或者是刚在大学学习计算机专业的人,在了解了Linux Kernel之后,都会想阅读它的源代码,但大多数都会感到困惑,最终放弃。如何阅读Linux内核源代码?有哪些工具、方法和其他经验可以分享?

蒋雅华:

我也逐行查看了代码,这里有一些建议供大家参考。

首先,先大致了解原理,然后仔细研究代码,才能事半功倍。对于成熟的模块,可以先通过书籍、博客来大致了解其基本信息。

其次,阅读代码时做笔记,防止读完后忘记前面的部分。做笔记的软件有很多(比如微软的OneNote),选择你习惯使用的一款即可。

最后,要有上进心并坚持下去,最好是出于兴趣。

幸运的是,您不需要从头开始。我已将我在随附材料中看到的代码的屏幕截图放在其中。这是一条捷径。在这些截图中,某个函数和它所调用的函数之间的函数调用关系用红线标注出来(如下图),其中包括内存管理、文件系统和进程管理三大模块。

有任何疑问也可以联系我,一起讨论。 OSC 现场消息 (always_first_meet) 或电子邮件 (support@www.gsm-guard.net) 都可以。

Linux内核非常大。在阅读源码的时候,哪些部分是一开始就需要的,哪些部分可以作为后续有针对性的补充?

蒋雅华:

内核代码量巨大,模块之间的关系也复杂。建议初学者从相对简单且独立的模块开始,例如简单的设备驱动程序。

先了解驱动本身的逻辑,然后了解其上下游,再拓展到相关模块,最后就可以自由发挥了。

例如drivers/input/keyboard下的文件就是键盘驱动程序。我们选择一个文件。

第一阶段,看xxx_probe等函数,梳理控制和数据流程,了解驱动需要做什么。

第二阶段,适当扩展,大致代码中调用的函数是如何实现的,驱动中断、定时器、输入子系统等涉及到的机制的原理,这些机制相对独立,文档也比较多,所以花更多的时间就这样了。

第3阶段,追本溯源,研究xxx_probe是如何调用的,i2c总线的驱动(假设键盘连接到i2c总线),以及device/device_driver/bus的关系(驱动架构)。

第 2 阶段和第 3 阶段可以同时执行。

第四阶段,你可以自由发挥,根据自己的工作需要和兴趣进入内存管理、文件系统、进程管理等模块。

即使你能读懂源码,也会出现另一个问题,就是你读了源码,理解了它的逻辑,但是有什么用呢?最简单的就是增长自己的知识,但其实就像看书没有输出自己的理解和观点一样,没有多大作用。您怎么看以及如何解决这个问题?

蒋雅华:

研究内核有什么用?这是一个值得深思的问题。

这个时候,中国确实需要认真玩弄底层系统的人。中国长期以来一直渴望拥有自己的操作系统,尤其是在这个多事之秋。但如果没有大量工程师在这一领域的积累,操作系统无疑将是一句空话。

不管未来国产操作系统是否一定要基于Linux内核,研究Linux内核本身也是一个积累技术的好方法。

仅从个人职业生涯的角度来说,研究核心对于个人技术的成长有很大帮助,可以从多个层面来看待。

1级,初次相识,对内核有一个大概的了解,需要花时间深入工作相关模块。研究内核耗费大量时间,而且产出不明显。

2级,入门级,熟悉工作相关模块,了解内核模块之间的关系。研究内核会让你恍然大悟,常常会感叹“原来xxx是这样实现的”。

3级,熟悉或精通,​​对常用内核模块有一定研究,熟悉代码。即使是新模块,也可以快速理清上下文。

除了在level 1“浪费”时间之外,花时间研究内核还可以提高我们的效率。研究达到一定程度后,就可以进入良性循环。研究得越多,效率就越高,节省的时间就越多,可以研究的东西也就越多。

此外,您阅读的代码越多,您就越能够更好地解决复杂的问题。金先生又说:重剑无锋,大技无工。绝对的实力才是硬道理。

依然是xxx_probe的例子。如果我们的探针没有被调用,新手可能会检查device和device_driver的名称是否匹配。研究过驱动架构的工程师可能会分三部分进行检查:device、device_driver、match。

如果三个部分看起来都很好,但探针仍然没有被调用怎么办?研究过代码的工程师可能想知道device是否已经与另一个device_driver匹配了。

经验可以帮助我们看到问题的关键部分。只有真正研究代码,才能看到问题的本质。丁丁看到的不是牛,而是纹理和结构。到了这个程度,就算是一只羊也一样。

最近经常听到一句话,“工作xx年,就是一年的工作经验重复xx年”。如果只要求“会用”的水平,一年确实够了,但这样的话,工程师迟早会失去核心竞争力。

有些人倾向于用结论,但应该做的是对结论进行总结和解释。

现在学习Linux Kernel,主要工作方向是什么?哪些类型的公司和企业主要需要这种能力?

蒋雅华:

驱动工程师、嵌入式工程师、系统工程师、Linux程序开发工程师、甚至运维工程师都需要了解内核。就像从事Java开发的工程师需要学习JDK一样,他们并不是唯一从事内核相关工作的工程师。只需要研究核心即可。另一方面,了解核心的人很容易向上发展。

从事半导体相关业务的公司需要此类人才。过去,传统半导体企业的需求较大,但近年来,互联网企业也纷纷进军半导体领域,其中就包括BAT。经过美国的一系列动作,中国最近进入了芯片和操作系统的研发热潮。一大批芯片公司成立,如绥远、平头哥、寒武纪、商汤等,也都需要内核相关人才。

您的书谈论了智能设备的发展。 Linux内核与AI有何特殊关系?

蒋雅华:

其实我在这次写的书中已经解释过这个问题了。

如上所示,“硬件厂商负责硬件,原语库一般由他们维护,比如AMD的MIOpen、Intel的MKL和Nvidia的cuDNN。大多数程序员不会接触到这部分内容,但是使用现有框架。

框架选择也多种多样,包括 Google 的 TensorFlow、Facebook 的 PyTorch、微软的 CNDK、亚马逊的 MXNet、Theano 和 Keras。显然,仍然是百花齐放的局面,但技术的发展只能“补三分天下”,甚至“一统天下”。已经有支持这些框架的工具了,比如Tensorboard,可以用来查看TensorFlow的训练状态。

由于深度学习需要太多的计算,因此也会涉及到并行计算技术,例如MPI(消息传递接口)通信协议和NVIDIA的NCCL(NVIDIA集体通信库)。

数据对于深度学习非常重要,大数据必不可少。数据作为输入,模型作为输出,用于数据中心、个人电脑、机器人、自动驾驶汽车等设备。

纵观整个流程,没有任何一个环节提到Linux,但实际上大部分链接都与Linux有关。虽然这些关系可能只有少数程序员注意到,但随着技术的成熟,新的智能设备,甚至新的操作系统,都会切换回熟悉的内核。

在学习Linux内核的过程中,有没有感觉Linux内核其实可以用其他语言来实现,这样对于入门学习来说会好很多,比如使用像这样简单易懂的语言Python。这样的想法可行吗?你会遇到什么技术问题?

蒋雅华:

内核中很多代码都采用了面向对象的思想。例如,VFS采用了许多面向对象的程序设计模式,如命令法、模板法等。使用其他语言,尤其是面向对象的语言来实现Linux内核是可行的,但不得不说,其他语言(例如Python)很难有C语言的执行效率。

2019 年是 Linux 内核诞生 28 周年。分享一下 Linux 内核给你印象最深的地方。

蒋雅华:

Linux 内核是开源的,这使其成为微软(更具体地说是 Windows)的天敌。微软早期对Linux的敌意以及近年来的变化非常有趣。我不会详细介绍敌对时期的情况。近年来,微软宣称“热爱Linux”,并做了很多实际的事情,包括Azure、SQL Server和Visual Studio。代码等都有Linux的存在。

不管这对于Linux是好是坏,至少显示了Linux的强大。感觉就是“东方领袖,一统天下万代”哈哈。

这是让我对Linux Kernel印象深刻的一点。还有一点值得一提,就是我今年写了一本与Linux Kernel相关的书《精通 Linux 内核——智能设备开发核心技术来宣传它。宣传一下,希望通过本书给道友们提供一些帮助。

本书基于Linux 5,首先介绍基础知识,包括数据结构、中断处理、内核同步和时间计算等,它们是理解后续章节的前提。在此基础上详细讨论了内存管理、文件管理和进程管理三个核心模块。最后一部分是升华。它结合了之前的多个模块。重点难点部分配有图表、代码或实验,力求深入浅出。

此外,本书列举了大量实例,剖析了Android操作系统的核心技术,使读者能够深入理解理论知识。本书的读者需要熟悉C语言,最好对内核有一定的了解。建议初学者按照既定的顺序阅读本书。熟悉核心的读者可以直接阅读三个核心模块。

当然,我也希望通过这个平台与道友们有更多的交流(包括但不限于本书的内容)。欢迎大家与我交流,共同推广。另外,本书是机械工业出版社《Linux 技术与应用丛书》出版的第一本著作,今后还将出版系列丛书。大家也可以关注一下。

受访者介绍

蒋亚华一直从事Linux内核和Linux编程相关工作。他研究内核代码十多年,了解大部分模块的细节。负责华为手机Touch和Sensor(包括Mate、Honor等系列)的驱动和软件优化,以及Intel Android平台Camera和Sensor(包括Baytrail、Cherrytrail、Cherrytrail CR、Sofia、 ETC。)。现负责DMA、Interrupt、Semaphore等模块(包括Vega、Navi系列及多款APU产品)的优化和验证。