主题 : Java开发者需要研究JDK,Linux开发者需要研究Kernel
千山同一月 万户尽皆春 千江有水千江月 万里无云万里天
级别: 总版主

UID: 998
精华: 0
发帖: 605034
威望: 529344 点
无痕币: 3 WHB
贡献值: 0 点
在线时间: 62259(时)
注册时间: 2008-12-25
最后登录: 2024-05-01

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

管理提醒: 本帖被 hexj9 从 『Windows 10 专区』 移动到本区(2020-01-06)
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,主要有哪些工作方向呢?又是哪些类型的公司、业务会主要需要这种能力?
级别: 八片秋叶

UID: 232159
精华: 0
发帖: 45263
威望: 40950 点
无痕币: 10005 WHB
贡献值: 0 点
在线时间: 805(时)
注册时间: 2014-06-03
最后登录: 2024-05-01

谢谢总版主辛苦分享,了解一下!
Total 0.064567(s) query 5, Time now is:05-01 14:35, Gzip enabled 粤ICP备07514325号-1
Powered by PHPWind v7.3.2 Certificate Code © 2003-13 秋无痕论坛