返回

提问 添加收藏

开源访谈 | Linux 内核爱好者笨叔叔:爱奔跑 爱 Linux Kernel

本页包含1张图片,默认未加载,显示所有图片

局长 发布于 2017年09月20日 (共有8个回帖)

Linux Kernel 在计算机世界的地位有目共睹,称它为计算机世界的基石也不为过。如此繁复庞大的 Linux 内核,开发者应如何面对?本期开源访谈邀请到了一位认真钻研技术的 Linux 内核爱好者,笨叔叔 —— “笨氏吊打法”发明人,专注 Linux 内核十余年的他和我们分享了关于他的学习经历、对 Linux 内核的看法、开源和商业的结合等话题。

本期嘉宾

笨叔叔,Linux 内核爱好者,从事 Linux 内核和驱动开发十余年,曾在多家芯片公司从事过手机芯片底层软件开发和客户支持工作。内心 90 后的憨豆中年男子,沪上紫竹某小公司的小 FAE。虽笨手笨脚,每日坚持奔跑,Linux 社区吃瓜叔叔,但热爱开源技术,闲暇之余写点 Linux 小段子。

点击加载图片

访谈实录

1. 老师先介绍一下您自己吧

大家好,我是《奔跑吧Linux内核》一书的作者,我的笔名叫笨叔叔。现在在上海一家芯片公司工作,主要做手机平板方面的技术支持工作,简单来说就是解决客户在使用我们公司芯片过程中遇到的问题。

我自己比较感兴趣的 Linux 内核相关模块是内存管理和进程调度。内存管理是最庞大,最错综复杂的一个模块,同时也吸引了很多社区的大牛投身其中。另外进程调度也是一个比较有意思的模块,内核中的进程调度器在内核的发展历史中经历过很多变化,从最早的进程调度器到 Linux 2.6 的 O(1) 调度器,再到现在的 CFS 调度器,有不少传奇人物投身其中。

最近 ARM 和 Android 社区里热门的大小核调度算法 – EAS 绿色节能调度器,也比较有意思,对于性能和功耗是一个比较完美的解决方案。虽然它现在还没有进入主线,但我相信它在不久的将来会进入到 Linux 内核的主线。

2. 之前做的工作也是跟 Linux 内核相关吗,您是在什么样的契机之下发现自己对于 Linux 内核的兴趣?

我 2004 年大学毕业,学习的专业是机电工程,与 Linux 内核结缘应该是在念大学时做毕业设计的时候,当时做的是单片机方面的项目。那时候看着毛德操老师那本厚厚的《Linux内核源代码情景分析》,心里嘀咕,不知道什么时候能看完。自此就对 Linux 内核产生了浓厚的兴趣。

毕业之后的第一份工作是 ARM 开发板的相关技术支持工作,从那之后就开始了我的 Linux 之旅。此后的工作都和 Linux 相关,做得比较多的工作是 Linux 驱动。

3. Linux 内核对于绝大多数开发者的意义是什么?

Linux 内核作为一个操作系统的核心,了解 Linux 内核对于大多数开发者都有意义。

比如说 Linux 驱动开发工程师必须要了解 Linux 内核运作的原理;而应用程序开发工程师也需要深入了解 Linux 内核才能写出高效的程序。应用程序开发者都比较熟悉 malloc() 或者 mmap() 这些常用 libc 的 API 函数,但如果不了解它们内部的运作机制,当面对莫名其妙的 bug 时就会一头雾水,找不到方向。

再比如 Linux 运维工程师,他们也需要深入了解 Linux 内核,仅仅懂得安装和敲几个命令是远远不够的。

4. 似乎和底层开发打交道的程序员会比较关注内核,那就您所了解的,关注内核的人群主要是那些?

据我了解,不仅仅和底层开发打交道的程序员会关注内核,还有很多其他方向的程序员都会关注内核,比如运维人员、上层应用开发人员、Android 程序设计人员等等。

因此,不管是做底层还是做上层开发的开发者都有必要了解 Linux 内核的工作原理。

5. Linux 内核是 Linux 最为核心的东西,那么学习 Linux,是否一定要去研究 Linux 内核?

学习 Linux 有一个学习曲线,从最开始学习 Linux 的命令操作和 Linux 的安装,到编写简单的应用程序,比如基于 GTK 或者 QT 进行开发,再到编写驱动模块,然后深入到 Linux 内核。我觉得真正喜欢 Linux 的爱好者都会有强烈的深入了解 Linux 内核的欲望。

这里我想分享一下自己的学习经历,我的学习经历可以总结为下面几个阶段:

  1. 毕业设计阶段。正如上面提到的,从做毕业设计开始就对 Linux 内核产生了浓厚的兴趣。
  2. 初入职场。第一份工作是在一家做 ARM 开发板的公司工作,有点类似 FAE。可正是这份工作,让我从单片机过渡到了 ARM 处理器和 Linux 内核。从移植成熟的开发板开始玩起,从简单的字符设备读取做起,慢慢深入到驱动开发中。
  3. 独立开发驱动。离开第一家公司后,在其他公司陆续独立开发了几个驱动程序,比如基于 V4L1 和 V4L2 的视频数据采集卡。独立开发驱动程序很锻炼人,首先需要对所写的硬件规范要很熟悉,其次对需要采用的内核接口和框架也要有所了解,然后才能开始写驱动程序,在调试过程中你会遇到很多问题,带着这些问题在深入思考。
  4. ARM 芯片系统移植。后来到了一家芯片公司,做基于 ARM 的手机芯片。从基于 ARM9 开始,一直做到双核 Cortex-A9 以及四核 Cortex-A7。做新芯片的系统移植比第一份工作的开发板移植要有意思得多,开发板移植的大部分工作芯片原厂已完成。做芯片,自己就是芯片原厂。需要和 ARM core 以及芯片内部的很多 IP 打交道。这段经历让我对 ARM core 和 SoC 内部实现有更深入的了解。
  5. 参与 UKSM 项目。有幸参与了和内存管理相关的一个项目,并且得到夏老师的悉心指导和点拨,让我对内存管理有了更深入的理解。
  6. 到某家芯片公司的手机部门做客户支持。我又回到 FAE 的岗位,可能有人瞧不起 FAE,可是 FAE 可以让我从多方面了解 Linux 内核,而不局限于某一个技术点。比如说,有客户问,你们家芯片是怎么支持多 CPU 调度的?怎么支持大小核调度的?有时候从研发的角度思考问题会有一些技术的局限性,多接触一些不同的观点也是好事,同时被客户吊打也是一种人生体验。我依然觉得技术是为产品服务的,多了解一下技术以外的事情也不是坏事。
  7. 撰写《奔跑吧Linux内核》。因为有了上述研发和 FAE 的经验,加上《情景分析》十多年来一直没人更新,我一直在等毛老师更新最新版本或者国内大牛来做这件事。可是十多年来一直了无音讯,因此我就自告奋勇,冒着被天下读者吊打的风险来撰写一本基于《情景分析》的最新版本的内核书籍。《奔跑吧Linux内核》基于情景分析,但增加了一些新的构思,比如说基于实际问题来分析代码,以奔跑卷为开篇。书中尽可能的多配上图片,每章之前有思考题,每章之后有总结等。总来的说就是“毛氏情景分析”+“笨氏吊打法”。

6. Linux 内核十分庞大,如果希望研究内核,您认为该从哪些方面入手?

研究内核可以从简单的驱动开发开始,我在十几年前刚接触 Linux 时,学习了简单的 Linux 字符设备驱动,那时候看的是一本叫做《Linux设备驱动程序》(第二版)的经典书籍,那本书几乎被我翻烂。这本书讲述 Linux 驱动开发的常用 API 和使用规则等,但并没有深入到讲解这些 API 是如何实现的,因此我建议有意愿研究 Linux 内核的初学者可以从阅读这本书开始,即从字符设备驱动开始。

另外,可以选择一个自己感兴趣的 subsystem 开始研究,比如内存管理、进程调度或者文件系统等。举个例子,可以从用户空间的 API 开始,我们都知道用户空间分配内存的 API 函数是 malloc(),那么可以围绕 malloc() 由上而下的去了解这个接口是如何实现的,malloc() 是如何分配物理内存的。顺着这条线索可以一直深挖到 Linux 内核内存管理的核心,比如系统调用brk、VMA管理、缺页中断、匿名页面、页表管理和反向映射等等。从一个大家熟悉的 C 语言 API 函数去挖掘内存管理最核心的精髓。这也是我在《奔跑吧Linux内核》中倡导的“笨氏吊打法”,一定要带着疑问去阅读内核代码,有一种打破砂锅问到底的精神。

最后,我建议读者可以在自己的电脑搭建一个可以单步调试内核的环境,有兴趣的朋友可以对自己感兴趣的子系统做一些代码级别的 trace 调试,这样可以加深对 Linux 内核的理解。

7. 有一种说法,认为内核编程是面向硬件的,您对此是怎么看的?

内核服务的对象的确是硬件,它相当于是硬件资源的一个总管。Linux 内核的整个设计框架和层次结构划分得非常好,和硬件相关的层通常都是单独划分出来的,比如 arch 目录,这里面都是和各个处理器体系结构相关的代码,而像 mm, kernel 这些核心的目录都已经和硬件分离。

内核除了管理硬件资源外,还有一个重要的作用是给用户空间的程序提供服务,比如说通过系统调用来为用户进程提供内核服务。

8. 还有人说,初学者不应接触内核,您怎么看待这种说法?

初学者可以提前开始接触内核,俗话说“一回生二回熟”,接触时间长了,对 Linux 内核的理解自然也会慢慢加深。

9. Linux 内核的大版本更新频率是比较稳定的,但我观察到大部分的更新内容主要还是优化内核,所以,您认为使用者有必要紧跟着官方的更新速度吗?

这个要看具体的用途。对于普通用户来说,跟随 Linux 发行版进行升级即可。

如果是底层硬件程序开发者,通常需要关注内核的变化。现在大部分产品开发采用的 Linux 内核都比较新。像 Android 的开发,Android 7.x 的内核版本已经使用 Linux 4.x 内核。

如果是服务器相关的开发者,通常是跟随 Red Hat 的企业版,Red Hat 的企业版采用的内核版本相对比较老,但 Red Hat 通常会把一些最新的特性 backport 到旧版本内核上。

因此对于大部分喜欢 Linux 内核或者从事和 Linux 内核相关工作的朋友,有必要去了解最新内核的发展变化。

10. 写《奔跑吧Linux内核》这本书的初衷是什么,期间有遇到什么阻力,如何规划时间来完成这项工作?

大概在 3 年多以前,我在翻毛德操老师的《Linux内核源代码情景分析》,毛老师的书虽然很经典,但它是基于 Linux 2.4.0 内核的,距今已经有 16 年的历史,那时候的内核和现在相比已经有了翻天覆地的变化。我在想,这十几年怎么就没有人更新这本书呢,或者写一本新版本的书呢?即便是老外写的书其实也已很老旧,跟当下的 Linux 内核有很大的差别。因此就萌生了要写一本基于最新内核的情景分析。

写一本 Linux 内核的书工作量很大。写过文档的朋友都知道,写文档是很累的一件事情,何况一本书要写好几百页,所以写书是一个脏累苦的活,估计这也是十几年来没人愿意写一本基于最新内核的书籍的原因。虽然国内精通 Linux 内核的大牛很多,比如 Intel 的 OTC、华为、阿里巴巴、南大富士通等公司里大牛辈出,但这个脏活没人愿意去做,因此我在想我是否可以做这件事。于是我就下定决心要利用业余时间来尝试做这件事,我相信这件事是有意义的。

写书最大的困难是坚持,坚持二字是人生中最难的两个字。因为平时的工作很繁忙,工作之余在写书,的确需要在精神上得到鼓励。每当自己快要放弃的时候,我会强迫自己去奔跑 5 公里,跑步的时候会听 Beyond、谭校长和哥哥的歌曲,从中得到一些坚持下去的信念。我喜欢哥哥的一首歌 - 《追》里面的一句歌词,“一追再追 只想追赶生命里 一分一秒”,这句歌词也是我的座右铭,人生需要有追求和信念。

我通常是晚上的时候写上一两段,周末会分配稍微多一点的时间,总体来说,写书断断续续的持续了快 3 年的时间。

11. Linux Kernel 应该算得上是世界上最大的开源项目了,您如何看待开源精神,开源与商业?

的确,Linux 内核是全球最大的开源项目,参与的人和公司都是最多的。几乎最知名的科技公司都参与其中,包括谷歌、Red Hat、SUSE、Intel、Facebook、甲骨文和华为等。当然还包括 Linux 的竞争对手 —— 微软。

套用一句经典的话,有人的地方就有江湖,有人的地方就有 Linux。现在 Linux 已经深入到人们生活的方方面面,从手机、穿戴设备、智能家居、汽车、监控、到服务器等领域都有 Linux 的身影。这些大公司投入到 Linux 内核的开发中,大部分都不是靠 Linux 本身来获取利润,真正靠 Linux 能盈利的公司很少,Red Hat 是最典型的代表,那为什么还有这么多公司不计成本地投入呢?

正因为 Linux 的无处不在,所以各大公司都希望把与自己产品或业务相关的功能加入到 Linux 内核中,比如硬件公司开发了新的硬件,他们会希望 Linux 内核能以最快的速度支持这些新硬件,比如谷歌开发的 Android 系统,也希望能把和 Android 相关的一些特殊优化的 patch 加入到 Linux 内核中,再比如服务器厂商,开发了新的功能和算法也希望能第一时间整合到 Linux 内核。

因此,Linux 内核的开发和传统意义的项目不一样,它没有开发计划,完全是依赖全球众多公司和开发者的贡献,这也是开源和商业的一个完美结合点吧。

Linux Kernel
文明上网,理性发言
客户端 Android iPhone WP7