当前位置: 首页 > Linux

Java开发者要研究JDK,Linux开发者要研究Kernel

时间:2023-04-06 02:57:47 Linux

本文转载自:开源中国2019是Linux内核诞生的第28个年头。1991年8月26日,当时还是大学生的LinusTorvalds在提交给comp.os.minix新闻组的成员中透露,他们将从事操作系统工作作为一种“爱好”。LinuxKernel是全球最大的开源项目,几乎所有知名科技公司都参与其中,包括微软、谷歌、红帽、SUSE、英特尔、Facebook、百度、阿里、华为、甲骨文、腾讯等。同时,基于Kernel的release版本和各种周边项目也使其生态丰富多彩。另一方面,在如今这个云原生快速发展的时代,其底层大部分是基于LinuxKernel的,甚至连微软都说Linux运行了Azure50%以上的工作负载。LinuxKernel短期内不会过时,反而会进一步影响更多的开发者,但是LinuxKernel的入门和实践难度很大,让很多初学者望而却步。任何一个开发者说自己是LinuxKernel领域的,那其他人肯定是敬畏的。最近得知有一本相关的书《精通 Linux 内核——智能设备开发核心技术》值得初学者学习。我们就如何学习LinuxKernel、2019年LinuxKernel的发展及相关应用领域采访了作者姜亚华。内核开发者的一些灵感。以下为谈话内容。2019年,LinuxKernel进入5.x时代。虽然Linus自己说从4.20到5.x的变化只是因为他的手指不够,但实际上,按照你的理解,这对于项目生命周期管理、功能合并或社区文档构建来说是非常重要的。其他方面是否有重大影响?江亚华:5.x其实更新很多,补丁文件40多M,涉及1万多个文件。这是一个主要的版本更新。从用户认知度来看,4.x已经老了,就像iPhone更新一样。苹果保持着每两年一次重大更新的节奏。买了iphone,明年小更新没什么感觉,第二年大更新后,感觉自己的手机不是最流行的。新项目、文档等必须与5.x保持一致。从代码上看,我们可以从内核更新过程中学到很多优化思路。开始写《精通 Linux 内核——智能设备开发核心技术》时,内核还是3.x,特意在书中保留了一些3.x的讨论(sysfs、approachswitching等),只是通过对比总结一下这方面的经验。书上讲了文件系统,但是没有微软最近出的exFAT。我想这是因为你以前写过这本书。您是否继续研究与exFAT相关的内容?目前5.4也支持exFAT,对它的能力有什么影响?江亚华:对,接下来我打算深入一些模块,exFAT就是其中之一。很难说它的未来会怎样。Linux已经有很多优秀的文件系统。都验证了很多年,可能bug比较少。exFAT在Linux上还需要经过时间的考验。另一个新的内核特性最近也引起了广泛的讨论,那就是内核锁定。这个特性已经被讨论了很多年,它的表现形式到最后似乎还颇为费解。这个特性限制了root角色的权限,但是root是最高级别的系统权限,不能访问。这对root来说是一件奇怪的事情。在开发、运维或者日常使用中会发生什么?影响比较大?姜亚华:内核锁定的主要目的是防止root账户篡改内核代码,从而在用户态进程和代码之间划清界限。启用锁定模块后,各种内核功能将受到限制。这些包括限制对内核功能的访问;阻止对/dev/mem的读取和写入;限制CPUMSR访问;并防止系统进入睡眠状态等。这对于root来说并不奇怪,它仍然是超级用户并且可以访问所有普通的门。只是内核锁定去掉了一些“后门”,这些“后门”通常是关闭的或者不存在的。引入内核锁定(CONFIG_SECURITY)后,root权限被限制,开发、运维等使用的脚本或序列可能无法正常工作。例如root可以通过/dev/mem文件访问内存,引入内核锁后可能会受到限制。题外话,root是个很危险的东西,慎用。记得在我负责管理部门服务器的时候,有一次供应商帮我移植了驱动,安装软件时不小心删除了一些文件,断电后服务器无法启动。我花了好几天时间才把它“救”回实验室,无数的服务器伴随着我咆哮。相信很多开发者,或者大学刚学计算机的人,在了解了LinuxKernel的源码后,都会想去读一读,但大多会无所适从,最终放弃。如何阅读Linux内核源代码?有哪些工具、方法等经验可以分享?江亚华:代码我是一行一行看的,这里有一些建议,供大家参考。首先,先粗略了解原理,再仔细研究代码,事半功倍。对于成熟的模块,可以先借助书籍和博客,大致了解其基本信息。其次,边看代码边做笔记,防止看完忘记前面。笔记软件挺多的(比如微软的OneNote),选择自己习惯的就可以了。最后,自我激励,坚持到底,有兴趣最好。幸运的是,您不需要从头开始。我把看到的代码截图放在了附带的资料里,也算是捷径了。在这些截图中,一个函数和它所调用的函数之间的函数调用关系用红线标出(如下图),内容包括三个模块:内存管理、文件系统和进程管理。有问题也可以联系我一起讨论,OSC站内信(always_first_meet)或者邮件(linux_kernel_os@163.com)都可以。Linux内核非常大。阅读源码时,哪些部分是开头必须的,哪些部分可以作为后续的针对性补充?姜亚华:内核代码量巨大,模块之间的关系也错综复杂。建议初学者从比较简单、独立的模块入手,比如简单的设备驱动。先了解驱动本身的逻辑,再了解其上下游,再扩展到相关模块,最后发挥自如。比如drivers/input/keyboard下的文件是键盘驱动,我们选择一个文件。第一阶段看xxx_probe等函数,梳理控制流和数据流,了解驱动需要做什么。第二阶段,适当展开,代码中调用的函数是如何实现的,驱动中断、定时器、输入子系统所涉及的机制原理。这些机制相对独立,文档也很多。只是花更多的时间。第三阶段,追根溯源研究xxx_probe是如何调用的,i2c总线的驱动(假设键盘接在i2c总线上),device/device_driver/bus的关系(驱动架构)。阶段2和阶段3可以同时进行。第四阶段,自由发挥,根据工作需要和兴趣,进入内存管理、文件系统、进程管理等模块。就算能读懂源码,又会出现一个问题,就是读完源码,理解了它的逻辑,有什么用呢?最简单的就是增长自己的见识,但实际上就像是看了一本书却没有输出自己的理解和观点,作用不大。您怎么看以及如何解决这个问题?姜亚华:研究内核有什么用?这是一个值得深思的问题。这个时候,中国真的很需要能安下心来把玩底层系统的人。长期以来,中国一直渴望拥有自己的操作系统,尤其是在这个多事之秋。但如果没有这一领域大量工程师的积累,操作系统无疑是一句空话。不管未来的国产操作系统是否一定要基于Linux内核,研究Linux内核本身也是一种积累技术的好方法。单从个人的职业生涯来看,研核对个人技术的成长有很大的帮助,可以从多个层面来看。第一层次,初识,对内核有一个大概的了解,需要花时间深入工作相关的模块。研究内核可能会花费很多时间,而且输出并不明显。Level2,入门,熟悉工作相关的模块,了解内核模块之间的关系。研究内核会让你豁然开朗,常常会有“原来xxx是这样实现的”这样的感叹。第三层次,熟悉或精通,??对内核的常用模块有一定的研究,熟悉代码。即使是新模块,也能快速理清脉络。除了在level1上“浪费”时间,花时间研究内核反而可以提高我们的效率。研究到一定程度后,就可以进入良性循环。研究的越多,效率越高,节省的时间就越多,可以做的研究也就越多。此外,您阅读的代码越多,您解决复杂问题的能力就越强。金先生还说“重剑无锋,大招不灵”。绝对实力才是硬道理。还是xxx_probe的例子,如果没有调用我们的probe,新手可能会检查device和device_driver的名字是否匹配。研究过驱动架构的工程师可能会检查三个部分:device、device_driver和match。如果这三个部分看起来都没有问题,但是仍然没有调用probe怎么办?研究过代码的工程师可能会怀疑device是否已经匹配了另一个device_driver。经验可以帮助我们看到问题的关键部分,只有真正研究代码才能看到问题的本质。炮丁看到的不是牛,而是纹理结构。这个级别换成羊也是一样的。最近经常听到一句话,“工作xx年就是把一年的工作经验重复xx年”。如果只要求“知识”层面,一年确实够用,但工程师在这种情况下迟早会失去核心竞争力。力量。有些人倾向于使用结论,但应该做的是总结和解释结论。现在学习LinuxKernel,主要的工作方向有哪些?哪些类型的公司和业务主要需要这种能力?江亚华:驱动工程师、嵌入式工程师、系统工程师、Linux程序开发工程师,甚至运维工程师都需要了解内核,就像从事Java开发的工程师需要学习JDK一样,不仅仅是从事内核相关工作的工程师研究内核是很有必要的,懂内核的人向上发展也很容易。有半导体相关业务的公司需要这样的人才。过去,传统半导体公司有更大的需求,但近年来,互联网公司也开始涉足半导体领域,其中就包括BAT。在美国的一系列动作之后,中国最近进入了芯片和操作系统研发的热潮。一大批芯片公司成立,如随缘、平头哥、寒武纪、商汤科技等,也都需要核心相关人才。你的书谈到了智能设备的发展。LinuxKernel和AI有什么关系?蒋亚华:其实这个问题我在我这次写的书中已经说明了。如上图,“硬件厂商负责硬件,原语库一般由他们维护,比如AMD的MIOpen,Intel的MKL,Nvidia的cuDNN。大部分程序员不会接触这部分内容,而是利用现有的Framework。Framework的选择也是多样化,谷歌的TensorFlow,Facebook的PyTorch,微软的CNDK,亚马逊的MXN??et,Theano和Keras。显然还是百花齐放的局面,但技术的发展只能是“三部分”oftheworld”,甚至是“unityoftheworld”。目前有支持这些框架的工具,比如Tensorboard,可以用来查看TensorFlow的训练状态。由于深度学习中计算量大,并行计算技术也会涉及到,比如MPI(MessagePassingInterface)通信协议,NVIDIA的NCCL(NVIDIACollectiveCommunicationsLibrary)数据对于深度学习来说非常重要,大数据必不可少。数据作为输入,模型作为输出,用于数据中心和个人电脑、机器人、自动驾驶汽车等。看整个过程,没有提到Linux的链接,但实际上大部分链接与Linux有关。虽然这些关系可能只涉及少数程序员,但随着技术的成熟,新的智能设备,甚至新的操作系统,都会切换回熟悉的内核。在研究Linux内核的过程中,有没有觉得Linux内核其实也可以用其他语言来实现,这样对于入门来说会好很多,比如使用像Python这样通俗易懂的语言。这样的想法可行吗?你会遇到什么技术问题?姜亚华:内核中很多代码采用了面向对象的思想。例如,VFS更多地采用了面向对象的程序设计模式,如命令和模板方法。用其他语言,尤其是面向对象的语言来实现Linux内核是可行的。是的,但是不得不说其他语言(比如Python)很难有C语言的执行效率。2019年是Linux内核诞生28周年,分享你对Linux内核印象最深刻的事情。姜亚华:Linux内核是开源的,与微软(更准确地说是Windows)是天敌。微软早期对Linux的敌意,以及近几年的转型,都是很有意思的事情。敌对时期就不多说了。近年来,微软宣布“热爱Linux”,并做了很多实事。Azure、SQLServer和VisualStudioCode等都有Linux的身影。先不说这对Linux是好是坏。这至少说明了Linux的强大。这是LinuxKernel印象最深的一件事情,还有一件值得一提的,就是我今年写了一本关于LinuxKernel的书《精通 Linux 内核——智能设备开发核心技术》,来宣传一下,希望通过这本书提供一个对道士帮助不大。本书基于Linux5.x。花了五年时间研究了数百万行代码。它分为五个部分,按照易、难的顺序对内核进行分析。首先介绍基础知识,包括数据结构、中断处理、内核同步和时间计算等,这些是理解后续章节的前提。在此基础上,对内存管理、文件管理和进程管理三个核心模块进行了详细的讨论。最后一部分是sublimation整合前面的模块。重点难点一律配图、代码或实验,力求深入浅出。此外,书中列举了大量实例,分析了Android操作系统的核心技术,使读者能够深入理解理论知识。本书的读者需要熟悉C语言,最好对内核有一定的了解。建议初学者按照本书既定的顺序阅读,熟悉内核的读者可以直接阅读三大核心模块。当然,通过这个平台,我也希望能和道友们有更多的交流(包括但不限于本书的内容),欢迎大家与我交流,共同推广。另外,本书是机械工业出版社《Linux 技术与应用丛书》的开篇之作,以后还会有系列丛书出版,大家也可以关注一下。采访嘉宾介绍了一直从事Linux内核和Linux编程相关工作的姜亚华。他研究了十多年的内核代码,对大部分模块的细节了如指掌。曾负责华为手机Touch和Sensor(包括Mate、Honor等系列)的驱动和软件优化,以及IntelAndroid平台Camera和Sensor(包括Baytrail、Cherrytrail、CherrytrailCR、Sofia、ETC。)。现负责DMA、Interrupt、Semaphore等模块(包括Vega、Navi系列及多个APU产品)的优化和验证。