台湾開源人年会之Linux内核之旅(附演讲PPT及讲解)
今年是第一次参加COSCUP 开源人年会,到底与大家分享些什么,与社区大牛BOB沟通后,他建议我就分享自己这20年来的Linux内核之旅。
今年COSCUP 邀请各领域大伽,大打"你今天open source 了吗"活动口号,宣扬开源精神。印象深刻的是歌手与知名音乐人林强在座谈会上的分享:"2006 年正式与中华著作权协会解约,就是为了推动 CC (知识共享)授权,因此所有作品上网,都可以自由复制散布。"林强认为"你喜欢我的歌,跟我说要拿去用,是你的心意",取之于公,用之于公是他的核心价值。因为自己的作品被人喜欢,因此更应该与公众分享。
我的演讲安排在会议第二天(8月12日)的11点20分,第一天听了各路大伽的讲座后,看到大家上台后首先会介绍我是谁,‘我是谁?’, 这是一个很难参透的问题,回答什么似乎都不完全对,于是,转换思路,回答一下“我从哪里来”,自己的家乡法门寺和学校所在地大雁塔具有标志性,想必大家知道的。当这一想法出来后,整个演讲的大思路就理清楚了,
1. 我从哪里来?(通过家乡和学校所在位置勉强来回答,非究竟回答)
2. 我是谁?(通过自己20年所做开源相关事情来回答,也非究竟回答)
3. 我要到哪里去(通过“六祖坛经”中的“悟”给出究竟回答)
(为了让听众更容易理解内容,整个讲稿是繁体版的)
2018年COSCUP 开源人年会在台湾科技大学举办。
我从哪里来?
法门寺(Famen Temple),又名“真身宝塔”,位于炎帝故里、青铜器之乡——宝鸡市扶风县(我的家乡),2004年被联合国教科文组织评为“世界第九大奇迹”。
大雁塔是为保存玄奘由天竺经丝绸之路带回长安的经卷佛像而修建的塔,这是西安邮电大学所在地、
屈原的“天问” 问出了若干看似司空见惯的问题,在讲授操作系统的过程中有若干问题,其中最核心的问题是进程到底是什么?当fork()一个进程后,操作系统是如何生出一个孩子进程的?一个进程产生以后到底是怎么运行的?一个进程结束后,操作系统又做了哪些事情?
一个程序编译链接后形成怎样的地址空间?运行时是如何装入到内存的?一个虚拟地址到底是如何转换成物理地址的?硬件是如何参与的?操作系统是怎样配合的?
学界和业界对微内核和宏内核操作系统各有偏爱,我们曾阅读了《操作系统设计与实现》这本书,其原理的清晰性为后来深入分析Linux内核打下基础。在这里,特别强调的是,操作系统的原理相当于机制或者说面向对象中的基类,而各个具体的操作系统相当于策略或者对象,因此,把握原理的清晰脉搏,对深入某个具体的操作系统有很大的帮助。虽然业界偏好宏内核操作系统,但google最新操作系统Fuchsia是微内核。
操作系统本身是硬件和软件的桥梁,这一桥梁体现在何处?内存的寻址方式是突破口,我们曾阅读了《保护模式下的80386编程》,搞清楚虚拟内存管理的硬件支撑后,蓦然回首,OS只是在灯光阑珊处与硬件相会,谁也离不开谁。
内核版本不断的在变化,在那些变化的背后,一定有不变的东西。很幸运,我们在1999年的时候阅读了《Linux Kernel Architecture》这篇文档,从此,有了导航图,在以后多年的内核变化中,我们始终手上拿着这张图,使得进入内核这片茂密的森林后不至于迷失方向。
进入Linux内核上千万行源码的世界,就像走入迷宫,你手上必须有地图,首先,你得搞清楚内核源码的目录结构,知道每一部分源码它的归处何在,不仅如此,你还得知道哪些大大小小的源码文件它们之间的内在联系,好在,内核开发者知晓你的困惑,在每一个目录下都有两个文件,那就是Kconfig和Makefile,二者的配合,让你有了前进的灯塔。
1999年的那个春天,有7名学生加入分析内核源代码的兴趣小组,他们每人分析一个子系统(启动,内存,进程,文件,驱动,调度,IPC等),有的同学啃得动,飞速进步,有的同学退缩了,但最终,我们还是把2.0版的内核啃完了。并出版了第一本书《Linux操作系统内核分析》。
2002年,随着内核版本的变化,又出版了针对2.4内核的《深入分析Linux内核源代码》一书,2006年后这本书就不再出版了,但很多读者来邮件说希望看到这本书,于是在2007年,就在我们的“Linux内核之旅”网站全文发布了这本书的原文,从此,这本书就像插上自由的翅膀,不知道飞到哪去了。
撰写这些书时,是顺着知识和源码的结构来写的,都不太适合教学,为了把Linux内核引入课堂,于是编写了《Linux 操作系统原理与应用》这本书,第一章就让学生动手写Linux内核模块,在实践中掌握内核。
开源之门打开后,西邮Linux兴趣小组于2006年成立了,这是得力于王亚刚老师和王聪同学。小组的理念是“Free, Open&Share”
2008年Richard Stallman来到西邮兴趣小组与学生交流。
2008年内核核心成员Herbert.xu来到西邮,为学生们讲述Linux内核的开发过程以及如何参与。
LVS(Linux Virtual Server)的作者,开源界大牛章文嵩博士来到西邮与学生交流曾经开发LVS的过程。章博士09年去阿里后推动了阿里的开源,目前阿里有200多个(可能更多)款软件开源。目前,国内各大互联网企业都不同程度的加入开源的行列,开源软件在各大企业的应用形成一种强大的氛围了。
从2006年开始,西邮Linux兴趣小组参国际自由软件日 Software Freedom day活动,每年的9月份大概有500名左右的学生参加这项活动。
2018年第十三届开源中国开源世界高峰论坛在北京举行,本人有幸获得开源杰出贡献奖,本次大会,各大企(华为,腾讯,百度,阿里,小米,浪潮等企业)展示了其不仅大规模应用开源软件,还深度参与开源。
2002年,翻译《UnderStanding The Linux Kernel》这本书时的场景还历历在目。“曾经’我们拿到Linux内核代码开始研究时,可以说茫然无措。其规模之大,叫“覆压三百余里,隔离天日”似乎不为过;其关系错综复杂,叫“廊腰缦回,檐牙高啄,各抱地势,勾心斗角”也不言过其实;阿房宫在规模和结构上给人的震撼,可能与Linux有异曲同工之妙。“楚人一炬,可怜焦土”,可能正是因为它的结构和规模,阿房宫在中国两千多年盛极的封建历史中终于没有再现,只能叫后人扼腕叹息;但是,Linux却实实在在的矗立在我们面前,当我们徘徊在这宏伟宫殿之前时,或许,我们也需要火炬——不是用来毁灭,而是为了照亮勇者脚下的征途”
LinusTorvalds在我们面前展现的Linux魔法卷轴,让我们的视野进入一个自由而开放的新世界。自由意味着自我价值的实现,开放代表着团结协作的理想,这对于从没把握过操作系统的中国人来说,无疑点燃起了心中的梦想。于是,许多人毫不犹豫地走进来了,希望深入到那散发自由光彩、由众人团结协力搭造起的殿堂。但是很快,不少人退缩了。面对这样一个汪洋大海,有的人迷惑了,出海的航道在哪里?有的人倒下了,漫漫征途何时是尽头?我常常想,如果那时他们手中就有这本书的话…
P.Bovet和MarcoCesati携手,为我们打造了这本鸿篇巨著,自此我们有了火把,有了航海图,于是我们就有了彼岸,有了航道,也有了补给码头。不是吗,中断虽繁,但第四、六两章切中肯綮地剖析,肯定能让你神清气爽;存储器管理虽难,但多达三章细致入微的说理,一定会让你茅斯顿开。而内容的组织更是别具匠心,每章开始部分一般性原理的描述,打破知识的局限,将每个部分的全景展现在你面前。而针对每个知识点,落到实处的独到分析,又会使你沉迷于知识的融会贯通之中。第三版对Linux2.6的全面描述,会使你为2.4与2.6之间的沟壑而感叹,但请放心,你曾从Linux旧版本获取的点滴依然是你前进的基石。总之,你面对的不再是赤裸裸的代码,而是真正能雅俗共赏的艺术。
对整个Linux社区来说,这绝不是微末的贡献而已,连Andre Morton都已经指出:“内核的学习曲线变得越 越长,也越来越陡峭。系统规模不断扩大,复杂程度不断提高。长此以往,虽然现在这一拨内核开发者对内核的掌握越发炉火纯青,但却会造成新手无法跟上内核发展步伐,出现青黄不接的断层”。而这本书的目的,无疑于此吻合。按照这本书指明的道路,我们可以躲过暗礁,绕过险滩,穿过逆流,勇往直前。这也是为什么这本书总在Linux书籍排行榜中稳居前列的原因之一。
对整个Linux社区来说,这绝不是微末的贡献而已,连Andre Morton都已经指出:“内核的学习曲线变得越 越长,也越来越陡峭。系统规模不断扩大,复杂程度不断提高。长此以往,虽然现在这一拨内核开发者对内核的掌握越发炉火纯青,但却会造成新手无法跟上内核发展步伐,出现青黄不接的断层”。而这本书的目的,无疑于此吻合。按照这本书指明的道路,我们可以躲过暗礁,绕过险滩,穿过逆流,勇往直前。这也是为什么这本书总在Linux书籍排行榜中稳居前列的原因之一。--摘自译者序
Linux最为人称道的莫过于它的自由精神,所有原始程序码唾手可得。源码在前,了无秘密。是的,但是我们在面对它的时候,为什么却总是因为这种规模和层面所造就的陡峭学习曲线陷入困顿呢?很多朋友就此倒下,纵然Linux世界繁花似锦,纵然内核天空无边广阔。但是,眼前的迷雾重重,心中的阴霾又怎能被阳光驱散呢?纵有雄心壮志,拔剑四顾心茫然,脚下路在何方?
Linux内核入门是不容易,它之所以难学,在于庞大的规模和涉及的层面。规模一大,就不易现出本来面目,浑然一体,自然不容易找到着手之处;层面一多,就会让人眼花缭乱,盘根错节,怎能让人提纲挈领?
“如果有这样一本书,既能提纲挈领,为我理顺思绪,指引方向,同时又能照顾小节。阐述细微,帮助我们更好更快地理解STL源码,那该有多好”,这番话虽然针对的是C++,但道出的是研习源码的人们共同的心声。但Linux源码研究的方法却不大相同。这还是由于规模和层面决定的,比如说,在语言学习中,我们可以采取小步快跑的方法,通过一个个小程序和小尝试,就可以取得渐进的成果,就能从新技术中有所收获。而Linux呢?如果没有对整体的把握,即使你对某个局部的算法、技术或是代码再熟悉,也无法将其融入实用。其实,像内核这样的大规模的软件,正是程序设计技术施展身手的舞台(当然,目前的内核虽然包含了一些面向对象的思想,但还不能让C++一展身手。)
就我们的经验,内核初学者(不是编程初学者)可以从这本书着手,对内核各个核心子系统有个整体把握,包括它们提供什么样的服务,为什么要提供这样的服务,又是怎样实现的。而且,此书还包含了Linux内核开发者在开发时需要用到的很多信息,包括调试技术、编程风格、注意事项等等。--摘自译者序
《The Linux kernel primer》以Linux操作系统为基础,详细介绍了Linux内核子系统,并辅以大量内核源代码和示例程序进行演示,引领读者深入Linux内核。《Linux内核编程》的主要内容包括:Linux基础知识、内核探索工具集、进程的整个生命周期、存储器区、页面、Slab分配器、用于输入/输出的各种设备、文件系统、抢占、自旋锁、信号量、内核引导、构建Linux内核,以及向内核添加代码等。同时还简单介绍了一些应用工具和实用程序,从而可以获取理解内核内幕所需的信息。每章末尾都给出一些练习,涉及内核运行的操作及工作原理。
作为初学者,你可以先从《Linux操作系统原理与应用》入门,然后消化理解《The Linux Kernel Development》,在这本书的基础上,如果你侧重于内核的了解,可以进一步研究《Understand Linux Kernel》和源代码本身;如果你侧重于实际编程,可以研读《Linux Device Driver》,直接开始动手工作。
从源代码的结构,可以罗列出Linux内核的各个子系统,各个子系统代码量有怎样的变化,可以从SLOC(Source Linux Of Code)看出:
(1)Linux 的体系结构相对稳定
(2)系统结构和子系统数变化不大,平均每模块的圈复杂度呈下降趋势.但系统整体规模和复杂性分别呈超线性和接近线性增长趋势。
(3)drivers 和arch 等子系统的快速变化引起是引起系统复杂性增加的主因。
(4)Linux 演化的主要推动力是系统新特性新功能的增强,以适应系统资源的进化 。
Linux新功能的增加是以机制的形式提供的,表现在具体实现上就是内核提供了Linux内核模块(LKM)机制:
操作系统系统的设计原则:提供机制而不是策略
机制:提供什么样的功能。
策略:怎样实现这些功能。
OS是应用程序服务的提供者,与应用程序之间是C/S结构,应用的需求在不断变化,OS所提供的服务也随之要改变,但是一定要有一个不变的仲裁者,这就是相对稳定的系统调用
VFS机制之经典在于自从70年代从Unix系统中提出以后,就稳定不变,但又适应任何的变化,即使云存储的CEPH文件系统也不能逃出VFS的如来掌。
在Linux内核代码中,每一个新功能的出现,几乎都是以机制的形式呈现,当你发现这一规律,蓦然回首,会发现很多时候自己只不过是一个策略的跟随者,而不是机制的创新者,于是乎,谦虚和恭敬心油然而生。
讲座后,有位软件开发者来与我交流,说听了机制与策略分离的思想后豁然开朗,曾经迷惑的问题知道了头绪,我建议他自己再继续悟下去。
Linux内核过于庞大,代码量如此之多,不经然间,走进去了,迷失了,戚戚然谁能帮你?在知识和能力之间要有一个转身,非“悟”难以到达。
《六祖坛经》中,神秀大师说:“身是菩提树,心如明镜台,时时勤拂拭,莫使惹尘埃”,慧能大师说“菩提本无树,明镜亦非台。 本来无一物,何处有尘埃! ”,两位大师都是生命的悟者,对我们一般人来说,"时时勤拂拭,莫使惹尘埃"更适合些。
“祖相送直至九江驿。祖令上船,五祖把橹自摇。惠能言:请和尚坐,弟子合摇橹。祖云:合是吾渡汝。惠能曰:迷时师度,悟了自度;度名虽一,用处不同。惠能生在边方,语音不正。蒙师付法,今已得悟,只合自性自度。祖云:如是如是。以后佛法,由汝大行,汝去三年,吾方逝世。汝今好去,努力向南,不宜速说,佛法难起。” 摘自《六祖坛经》自序品第一。
我们平时所学所思都属于意识范围内的,还不具备把我们从此岸度到彼岸的力量,当把知识“悟”之后内化为智慧时,这条船就有了自己的发动机,可以自行航行了,也就是自度的力量才真正出来。
这位初中专税务专业的谢宝友同学,在自学计算机的道路上孜孜不倦,曾把《ULK》这本书通读并注释了所有代码,并调试了相关代码,成为对内核中出现的任何故障都能很快定位并解决掉的“老中医”,更值得称赞是他开始自己编写工业级操作系统了。
这次讲座后,台大有位同学来问我,说内核的书看了不少,代码也看了不少,但是依然觉得有一个陡度无法爬上去。我说这时候,你可能需要有一位具有一线工程经验的导师来手把手的带你。
基于师徒模式开源大学的想法由来已久,主要基于韩愈《师说》中“是故弟子不必不如师,师不必贤于弟子”,人人皆可为师,也可为弟子,当弟子贤于师时,他可以找到更厉害的师,如此循环,除非你达到六祖慧能大师的程度,否则,必然需要一个师的引领。
说一千道一万,你可能会问到底如何才能入门Linux内核,《Linux操作系统原理与应用》一书全程录制了讲课视频,目前放在腾讯视频上,你可以搜索,也可以加入蓝墨云班课开放分享班381045,有完整的资料可以观看和下载。
COSCUP给我的讲座时间是40分钟,讲完这些内容花了38分钟,随后有各种提问,甚至有听众问到了翻译的书是否在台湾出版,这个可以与出版社联系的。
这里要特别感谢的是,会议的主办方利用午饭间隙,还组织了1个小时关于“开源与教育”的专场讨论,台湾大学,台湾科技大学的教授,还有企业一线的工程师等20多人进行了自由而热烈讨论,讨论中谈及最多的是如何把开源文化和开源软件引入到教学,或许,每年会有这样的专场。希望我们内地更多的人参加 COSCUP大会,加深加大两岸的交流。
在次附上内地来参加这次会的部分人员的合影: