仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 749|回复: 12
打印 上一主题 下一主题

[其他Linux] Linux教程之Linux内核源码剖析办法仓酷云

[复制链接]
跳转到指定楼层
楼主
发表于 2015-1-18 11:26:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
系统安全相关命令:passwd、su、umask、chgrp、chmod、chown、chattr、sudo、pswho
1、内核源码之我见
Linux内核代码的复杂令很多人“望而却步”,也正由于云云,使得人们对Linux的懂得仅处于平常的条理。假如想透析Linux,深切操纵体系的实质,浏览内核源码是最无效的路子。我们都晓得,想成为优异的程序员,必要大批的理论和代码的编写。编程当然主要,可是常常只编程的人很简单把本人范围在本人的常识范畴内。假如要扩大本人常识的广度,我们必要多打仗其别人编写的代码,特别是程度比我们更高的人编写的代码。经由过程这类路子,我们能够跳出本人常识圈的束厄局促,进进别人的常识圈,懂得更多乃至我们一样平常短时间内没法懂得到的信息。Linux内核由有数开源社区的“年夜神们”经心保护,这些人都能够称得上一顶一的代码妙手。透过浏览Linux内核代码的体例,我们进修到的不但是内核相干的常识,在我看来更具代价的是进修和体味它们的编程技能和对盘算机的了解。
我也是经由过程一个项目打仗了Linux内核源码的剖析,从源码的剖析事情中,我受害颇多。除猎取相干的内核常识外,也改动了我对内核代码的过往认知:
1.内核源码的剖析并不是“高不成攀”。内核源码剖析的难度不在于源码自己,而在于怎样利用更符合的剖析代码的体例和手腕。内核的复杂以致我们不克不及依照剖析一样平常的demo程序那样从主函数入手下手墨守成规的剖析,我们必要一种从两头参与的手腕对内核源码“各个击破”。这类“按需讨取”的体例使得我们能够掌控源码的主线,而非过分纠结于详细的细节。
2.内核的计划是幽美的。内核的位置的特别性决意着内核的实行效力必需充足高才能够呼应今朝盘算机使用的及时性请求,为此Linux内核利用C言语和汇编的夹杂编程。可是我们都晓得软件实行效力和软件的可保护性良多情形下是南辕北辙的。怎样在包管内核高效的条件下进步内核的可保护性,这必要依附于内核中那些“幽美”的计划。
3.奇妙的编程技能。在一样平常的使用软件计划范畴,编码的位置大概不被过分的器重,由于开辟者更注意软件的优秀计划,而编码仅仅是完成手腕成绩——就像拿斧子劈柴一样,不必太多的思索。可是这在内核中其实不建立,好的编码计划带来的不但是可保护性的进步,乃至是代码功能的提拔。
每一个人对内核的了了解城市有所分歧,跟着我们对内核了解的不休加深,对其计划和完成的头脑会有更多的思索和体味。因而本文更希冀于引诱更多倘佯在Linux内核年夜门以外的人进进Linux的天下,往亲身体味内核的奇妙与巨大。而我也并不是内核源码方面的专家,这么做也只是但愿分享我本人的剖析源码的履历和心得,为那些必要的人供应参考和匡助,说的“堂而皇之”一点,也算是为盘算机这个行业,特别是在操纵体系内核方面奉献本人的一份微薄之力。闲话少叙(已罗嗦了良多了,~),上面我就来分享一下本人的Linix内核源码剖析办法。
2、内核源码难不难?
从实质上讲,剖析Linux内核代码和看他人的代码没有甚么两样,由于摆在你眼前的一样平常都不是你本人写出来的代码。我们先举一个复杂的例子,一个生疏人任意给你一个程序,并要你看完源码后解说一下程序的功效的计划,我想良多自我感到编程才能还能够的人一定以为这没甚么,只需我耐烦的把他的代码从头至尾看完,一定能找到谜底,而且现实的确是云云。那末如今换一个假定,假如这团体是Linus,给你的就是Linux内核的一个模块的代码,你还会以为仍然那末轻松吗?很多人大概会有所夷由。一样是生疏人(Linus如果熟悉你的话固然不算,呵呵~)给你的代码,为何给我们的感到天差地别呢?我以为有以下缘故原由:
1.Linux内核代码在“外界”看来几有些奥秘感,并且它很复杂,猛地摆在眼前大概感到没法动手。好比大概来历于一个很微小的缘故原由——找不到main函数。关于复杂的demo程序,我们能够从头到尾的剖析代码的寄义,可是剖析内核代码这招就完全生效了,由于没有人能把Linux代码从头至尾看上一遍(由于的确没有需要,用到时看就能够了)。
2.很多人也打仗过年夜型软件的代码,但多半属于使用型项目,代码的情势和寄义都和本人常打仗的营业逻辑相干。而内核代码分歧,它处置的信息多半和盘算机底层亲切相干。好比操纵体系、编译器、汇编、系统布局等相干的常识的完善,也会让浏览内核代码停滞重重。
3.剖析内核代码的办法不敷公道。面临大批的而且庞大的内核代码,假如不从全局的角度动手,很简单堕入代码细节的泥塘中。内核代码固然复杂,可是它也有它的计划准绳和架构,不然保护它对任何人来讲都是一个恶梦!假如我们理清朝码模块的全体计划思绪,再往剖析代码的完成,大概剖析源码就是一件轻松康乐的事变了。
针对这些成绩,我团体是如许了解的。假如没有打仗过年夜型软件项目,大概剖析Linux内核代码是一个很好的堆集年夜型项目履历的时机(的确,Linux代码是我今朝打仗到的最年夜的项目了!)。假如你对盘算机底层懂得的不敷透辟,那末我们能够选择边剖析边进修的体例往堆集底层的常识。大概刚入手下手剖析代码的进度会稍显缓慢,可是跟着常识的不休堆集,我们对Linux内核的“营业逻辑”会渐渐开阔爽朗起来。最初一点,怎样从全局的角度掌控剖析的源码,这也是我想与人人分享的履历。
3、内核源码剖析办法
第一步:材料汇集
从人熟悉新事物的角度来说,在探究事物实质之前,必需有一个懂得奇怪事物的历程,这个历程是的我们对奇怪事物发生一个开端的观点。好比我们想进修钢琴,那末我们必要先懂得弹奏钢琴必要我们进修基础的乐理、简谱、五线谱等基本常识,然后进修钢琴弹奏的技能和指法,最初才干真实的入手下手实习钢琴。
剖析内核代码也是云云,起首我们必要定位要剖析的代码触及的内容。是历程同步和调剂的代码,是内存办理的代码,仍是设备办理的代码,仍是体系启动的代码等等。内核的复杂决意着我们不克不及一次性将内核代码全体剖析完成,因而我们必要给本人一个公道的合作。正如算法计划告知我们的,要办理一个年夜成绩,起首要办理它所触及的子成绩。
定位好要剖析的代码局限,我们就能够动用手头的统统资本,尽量的周全懂得该部分代码的全体布局和大抵功效。


<br>
这里所说的统统资本是指不管是Baidu、Google年夜型收集搜刮引擎,仍是操纵体系道理课本和专业书本,亦或是别人供应的履历和材料,乃至是Linux源码供应的文档、正文和源码标识符的称号(不要小视代码中的标识符的定名,偶然它们能供应关头的信息)。总之这里的统统资本指的就是你能想到的统统可用资本。固然,我们不太大概经由过程这类情势的信息汇集取得一切的我们想要的信息,我们只求尽量周全便可。由于信息汇集的越周全,以后剖析代码的历程能利用的信息就更多,剖析历程的坚苦就会越小。
这里举一个复杂的例子,假定我们要剖析Linux的变频机制完成的代码。今朝为止我们仅仅是晓得这个名词罢了,透过字面寄义我们能够大抵推测它应当和CPU的频次调治相干。经由过程信息汇集,我们应当能失掉以下的相干的信息:
1.CPUFreq机制。
2.performance、powersave、userspace、ondemand、conservative调频战略。
3./driver/cpufreq/。
4./documention/cpufreq。
5.Pstate和Cstate。
……
剖析Linux内核代码假如能汇集到这些信息,应当说长短常“侥幸”了。究竟有关Linux内核的材料的确不如.NET和JQuery那末丰厚,不外这比拟于十数年前,没有壮大的搜刮引擎,没有相干的研讨材料的时代应当称得上是“年夜丰产”时期了!我们经由过程复杂的“搜刮”(大概会消费一到两天的工夫吧),乃至找到了这部分代码地点的源码文件目次,不能不说如许的信息几乎是“价值千金”!
第二步:源码定位
从材料汇集中,我们“有幸”找到了源码相干的源码目次。可是这并不是意味着我们切实其实就是剖析这个目次下的源代码。偶然我们找到的目次有多是分离的,也偶然我们找到的目次下有良多和详细呆板相干的代码,而我们更体贴的是待剖析代码的次要机制,而非与呆板相干的特化代码(如许更有助于我们了解内核的实质)。因而,我们必要对材料中触及代码文件的材料举行细心甄选。固然,这一步也不太大概一次性完成,谁也不克不及包管一次就可以选择出一切待剖析的源码文件并且一个不漏。可是我们也不用忧虑,只需我们能捉住年夜多半模块相干的中心源文件,经由过程前期对代码的详细剖析,就很天然的把它们全体找出来。
回到上述的例子中,我们仔细的浏览/documention/cpufreq下的文档申明。今朝的Linux源码会把模块相干的文档申明保留在源码目次的documention的文件夹下,假如待剖析的模块没有文档申明,这几会增添定位关头源码文件的难度,可是不会招致我们找不到我们要剖析的源码。经由过程浏览文档申明,我们最少能存眷到/driver/cpufreq/cpufreq.c这个源文件。经由过程这个对源文件的文档申明,分离之前网罗到的调频战略,我们很简单存眷到cpufreq_performance.c、cpufreq_powersave.c、cpufreq_userspace.c、cpufreq_ondemand、cpufreq_conservative.c这五个源文件。一切触及的文件都找完了吗?不必忧虑,从它们入手下手剖析,早晚能找到其他的源文件。假如在windows下利用sourceinsight浏览内核源码的话,我们经由过程函数的挪用和查找标记援用等功效,分离代码的剖析能够很便利的找到别的的文件freq_table.c、cpufreq_stats.c和/include/linux/cpufreq.h。

<br>
依照搜刮出的信息活动偏向,我们完整能够定位到必要剖析的源码文件。源码定位这一步并不是非常关头,由于我们不必要找出一切源码文件,我们能够把部合作作推延到剖析代码的过程当中。源码定位也对照关头,找到一部分源码文件是剖析源码的基本。
第三步:复杂正文
在已定位好的源码文件中,剖析每一个变量、宏、函数、布局体等代码元素的大抵寄义和功效。之以是称此为复杂正文,并不是指这部分的正文事情很复杂,而是指这部分的正文能够不用太过细化,只需大抵形貌出相干代码元素的寄义便可。相反,这里的事情实际上是全部剖析流程中最坚苦的一步。由于这是第一次深切到内核代码的外部,特别是关于初次剖析内核源码的人来讲,大批的陌生GNU的C语法和漫山遍野的宏界说会使人很失望。此时只需沉下心来,弄清每一个关头的难点,才干包管今后碰着相似的难点不会再被困住。并且,我们对内核相干的其他常识会不休的像树一样扩大开来。
好比在cpufreq.c文件入手下手就会呈现“DEFINE_PER_CPU”宏的利用,我们经由过程查阅材料能够基础弄清这个宏的寄义和功效。这里利用的手腕和之前汇集材料利用的办法基础分歧,别的我们也能够利用sourceinsight供应的转到界说等功效检察它的界说,大概利用LKML(LinuxKernelMailList)查阅,其实不可我们还能够到www.stackoverflow.com发问追求解答(想懂得甚么是LKML和stackoverflow?汇集材料吧!)。总之使用一切大概的手腕,我们总能失掉这个宏的寄义——为每一个CPU界说一个自力利用的变量。
我们也不要强求一次就可以把正文形貌的很正确(我们乃至都没需要弄清每一个函数的详细完成流程,只需弄清大抵功效寄义便可),我们分离汇集到的材料和后边代码的剖析不休的完美正文的寄义(源码华夏有的正文和标识符定名在此很有益用代价)。经由过程不休的正文,不休的查阅材料,不休的修正正文的寄义。

<br>
当我们把一切触及的源码文件复杂正文终了后我们能够到达以下效果:
1.基础弄清了源码中代码元素存在的寄义。
2.找出了该模块所触及的基础上全体的关头源码文件。
分离之前汇集到的信息和材料对该待剖析代码的全体大概架构形貌,我们能够将剖析的了局和材料对照,以断定和修改我们对代码的了解。如许,经由过程一遍的复杂正文,我们就能够从全体上掌控了源码模块的次要布局。这也到达了我们复杂正文的基础目标。
第四步:具体正文
完成代码的复杂正文后,能够以为对模块的剖析事情完成了一半了,剩下的内容就是对代码的深切剖析和完全了解。复杂正文老是不克不及将代码元素的详细寄义形貌的非常准确,因而具体正文是非常有需要的。这一步中,我们必要弄清以下内容:
1.变量界说在什么时候被利用。
2.宏界说的代码什么时候被利用。
3.函数的参数和前往值的寄义。
4.函数的实行流程和挪用干系。
5.布局体字段的详细寄义和利用前提。
我们乃至能够把这一步称为函数具体正文,由于函数以外的代码元素的寄义基础上在复杂正文中已对照明白了。而函数自己的实行流程、算法等是这部分正文和剖析的次要义务。
好比cpufreq_ondemand战略的完成算法(函数dbs_check_cpu中)是怎样完成的。我们必要慢慢剖析该函数利用的变量和挪用的函数等信息,弄整理法的前因后果。最好的了局,我们必要这些庞大函数的实行流程图和函数挪用干系图,这是最直不雅的表达体例。

<br>
经由过程这一步的正文,我们基础上能完整掌控待剖析代码全体的完成机制了。而一切的剖析事情能够以为完成了80%。这一步事情特别关头,我们必需只管让正文的信息充足的正确,才干更好的了解待剖析代码的外部模块的分别。固然Linux内核中利用了宏语法“module_init”和“module_exit”声明模块文件,可是对模块外部子功效的分别是创建在充实懂得模块的功效基本上的。只要准确分别好模块,我们才干弄清模块供应了哪些内部函数和变量(利用EXPORT_SYMBOL_GPL大概EXPORT_SYMBOL导出的标记)。才干持续下一步的模块内标识符依附干系剖析。
第五步:模块外部标识符依附干系
经由过程第四步对代码模块的分别,我们就能够很“轻松”地逐一对模块举行剖析。一样平常的,我们能够从文件底部的模块收支口函数入手下手(“module_init”和“module_exit”声明的函数,一样平常都在文件最初),依据它们挪用的函数(本人界说的大概其他模块的函数)和利用的关头变量(本文件内的全局变量大概其他模块的内部变量)画出“函数-变量-函数”依附干系图——我们称为标识符依附干系图。
固然,模块内标识符依附干系并不是是纯真的树形布局,良多情形是扑朔迷离的收集干系。这时候候,我们对代码的具体正文的感化就表现出来了。我们依据函数自己的寄义,将模块举行子功效分别,抽掏出每一个子功效的标识符依附树。

<br>
经由过程标识符依附干系剖析,能够很明晰的展现模块界说的函数挪用了那些函数,利用了哪些变量,和模块子功效之间的依附干系——公用了哪些函数和变量等。
第六步:模块间互相依附干系
一旦将一切的模块外部标识符依附干系图收拾终了,依据模块利用的其他模块的变量或函数,能够很简单失掉模块之间的依附干系。

<br>
cpufreq代码的模块依附干系能够暗示为以下干系。

<br>


第七步:模块架构图
透过模块间的依附干系图,能够很分明的表达模块在全部待剖析代码中的位置和功效。基于此,我们能够将模块分类,收拾出代码的架构干系。

<br>
如cpufreq的模块依附干系图所示,我们能够很分明的看到一切的调频战略模块都是依附于中心模块cpufreq、cpufreq_stats和freq_table的。假如我们把被依附的三个模块笼统为代码的中心框架的话,这些调频战略模块都是创建在这个框架之上的,它们卖力和用户层交互。而中心模块cpufreq供应了驱动等相干的接口卖力与体系底层交互。因而,我们能够失掉以下的模块架构图。

<br>
固然,架构图并不是模块的无机拼接,我们还必要分离查阅的材料往丰厚架构图的寄义。因而,这里的架构图的细节会跟着分歧的人的了解有所偏向。可是架构图主体的寄义很基础分歧的。至此,我们完成了待剖析的内核代码的一切剖析事情。
4、总结
正如文章入手下手所说,我们不成能对全体的内核代码举行剖析。因而,经由过程看待剖析的代码举行信息汇集,然后依照上述的流程剖析出代码的底本委曲是懂得内核实质的无效手腕。这类依照详细必要剖析内核代码的体例,为疾速进进Linux内核的天下供应了大概。经由过程这类体例,不休的对内核的其他模块剖析,最初综合失掉本人对Linux内核的了解,也就到达了我们进修Linux内核的目标。

当你经过一段时间的学习后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令。
小妖女 该用户已被删除
沙发
发表于 2015-1-19 06:40:53 | 只看该作者
工具书对于学习者而言是相当重要的。一本错误观念的工具书却会让新手整个误入歧途。目前国内关于Linux的书籍有很多不过精品的不多。
因胸联盟 该用户已被删除
板凳
发表于 2015-1-24 10:18:32 | 只看该作者
为了更好的学习这门课程,我不仅课上认真听讲,课下也努力学习,为此还在自己的电脑上安装了Ubuntu系统。
山那边是海 该用户已被删除
地板
发表于 2015-2-1 05:53:23 | 只看该作者
当然你不需搭建所有服务,可以慢慢来。自己多动手,不要非等着别人帮你解决问题。
再见西城 该用户已被删除
5#
发表于 2015-2-1 19:14:49 | 只看该作者
期间我阅读了不少关于Linux的相关资料,其中也不乏一些有趣的小故事,这既丰富了我的课余生活,也让我加深了对一些术语的理解,比玩游戏强多了。?
兰色精灵 该用户已被删除
6#
发表于 2015-2-7 13:53:11 | 只看该作者
选择一些适于初学者的Linux社区。
谁可相欹 该用户已被删除
7#
发表于 2015-2-22 03:03:05 | 只看该作者
未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。
变相怪杰 该用户已被删除
8#
发表于 2015-2-24 00:14:14 | 只看该作者
Linux简单,占内存少,特别是对于程序开发人员来说很方便,如果说windows的成功在于其方便用户的窗口管理界面。
乐观 该用户已被删除
9#
发表于 2015-3-5 17:28:27 | 只看该作者
首先Linux是开源的,这也是最主要的原因,想学windows,Unix,对不起我们没源代码。也正是因为这样,Linux才能够像滚雪球一样越滚越大,发展到现在这种规模。
飘飘悠悠 该用户已被删除
10#
发表于 2015-3-6 14:48:49 | 只看该作者
我感觉linux的学习,学习编程~!~!就去学习C语言编程!!
蒙在股里 该用户已被删除
11#
发表于 2015-3-6 17:32:31 | 只看该作者
甚至目前许多应用软件都是基于它的。可是没有哪一个系统是十分完美的。
金色的骷髅 该用户已被删除
12#
发表于 2015-3-7 04:54:58 | 只看该作者
未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。
飘灵儿 该用户已被删除
13#
发表于 2015-3-14 10:38:47 | 只看该作者
最好先搜寻一下论坛是否有您需要的文章。这样可以获得事半功倍的效果。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-18 09:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表