龙空技术网

看不懂Linux内核驱动源码?《很难吗》新手如何阅读Linux源码

Linux特训营 259

前言:

现时看官们对“linux源码怎么看”大致比较重视,大家都需要知道一些“linux源码怎么看”的相关文章。那么小编同时在网上汇集了一些有关“linux源码怎么看””的相关文章,希望你们能喜欢,同学们一起来了解一下吧!

学习嵌入式Linux驱动开发,最核心的技能就是能够编写Linux内核驱动、深入理解Linux内核。而做到这一步的基础,就是你要看得懂Linux内核源码,了解其基本的框架和具体实现,了解其内核API的使用方法,然后才能根据自己的需求写出高质量的内核驱动程序。

说易行难,很多新人、甚至工作1-2年的开发者刚接触Linux内核时,别说写了,看内核代码可能都是一脸懵逼:明明是C语言,但是就是看不懂是什么意思,除了根据函数名、函数参数、函数的返回值以及注释,了解整个函数的基本功能外,一旦分析其细节,你会发现,寸步难行,每一行代码似乎都深不可测,仿佛蕴含着极大的能量,于是你翻书、百度、Google,一步一步地向前推进。

这是很多初学者常用的学习方法,刚接触Linux内核驱动时,看到很多似曾相识,但仔细推敲起来又很陌生的内核代码,内心是崩溃的、心是虚的:乖乖,这是啥玩意,为什么看不懂,就我一个人看不懂吗?甚至工作后我曾请教过很多工作经验的同事,想请教一些关于阅读内核的经验和方法,你会发现,他们很多其实对内核也没深入研究,除了自己负责的模块比较熟悉外对于其它的模块也很少有时间和精力去关注,甚至关于本模块的框架也很少关注,工作量的需求要求你快速通过各种API完成任务。甚至有同事会说,看Linux内核就像隔雾看花,朦胧一点比较好,不能细看,越细看越不懂。推荐大家看这些:

要想编写高质量的程序,对Linux内核、模块的理解肯定要深入的,否则,你就永远停留在外围,缝缝补补。根据我的各种学习经历和经验总结,Linux内核并不是坚不可摧、攻不可破,掌握了正确的学习方法和知识基础,我们也可以在内核的代码里遨游,领略Linux内核中C语言的各种奇妙应用和强大技巧,对Linux内核各种复杂的框架、子系统也可以指点江山,胸有成竹。

那学习Linux驱动、分析Linux内核源码之前,到底需要哪些知识储备和技能呢?

1)C语言基础+数据结构

Linux内核,好不夸张地说,就是由各种结构体、函数指针、链表、队列堆彻而成的。所以在进军Linux内核之前,你的C语言基础一定要打牢固:什么函数指针、指针函数、数组指针、指针数组、以及各种指针作为函数参数、返回值等等都要搞清楚,因为Linux内核中大量使用这些。这些都是基础,现在犯迷糊,看内核更是晕。关于C指针进阶学习,可以关注视频教程:C语言嵌入式Linux高级编程第6期:数据存储与指针

除此之外,数据结构也是要掌握的,链表、队列在Linux内核中大量使用,所以必须要掌握。像其它的一些非线性数据结构:比如树、二叉树、红黑树等,对于做底层驱动的开发者来说,接触得很少,可以先不学,用到的时候再补也不迟。

2)C语言的语法扩展

在阅读Linux内核代码的过程中,你有没有感觉到,有些代码,看起来“怪怪的”,跟一般的C语言不太一样?看起来是C语言,仔细一分析,发现又看不懂了。

这些你看起来“怪怪的C语言代码”,其实都是GCC编译器对标准C语言的扩展语法:比如语句表达式、局部标签、__attribute__属性声明、可变参数宏等。这些GCC扩展的语法,在Linux内核、驱动源码中,广泛使用,尤其是涉及到底层启动、编译链接的一些设置。如果你不掌握这些扩展的C语言语法的使用,在阅读Linux内核源码、或驱动的过程中,可能就会遇到很多障碍,对我们理解代码造成各种干扰。

所以在打算阅读Linux源码之前,建议先学习下GNU C对标准C的常用扩展语法

学完了这个,扫除了阅读Linux源码的语法障碍,接下来可以选择一个自己感兴趣的小模块:先把这个模块留给用户的API玩熟,学会编程,再慢慢研究其内核内部的实现。从底层到上层,打通任督二脉,再去分析内核中,其它复杂的系统,也就触类旁通,比较容易上手了。

3)Linux内核中的面向对象思想

有了上面的基础,我们分析一个小的Linux内核模块,是没有问题的。当遇到一个大的复杂子系统,比如说USB子系统、内存管理、MTD、文件系统等,结构体里面嵌套多层结构体,各种device、bus、driver、各种层,是不是有点绕晕了?有种盲人摸象、在森林里迷路的感觉,把握不了“全局”。这时候,我们就不能使用C语言的面向过程思维了,Linux内核的设计其实大量使用了面向对象思想。因此,我们要学会用面向对象的思维去分析Linux内核,分析各个模块的复用,这样就很方便的在脑海中搭建出系统的框架和层次了。然后再使用面向过程思维去分析具体的功能实现、具体细节,多花点时间和精力,相信你会有不一样的收获的。关于Linux内核常用的数据结构和面向对象思想,推荐大家看这些:

常常有人问:我想学习内核,需要什么基础吗?Linus Torvalds本人是这样回答的:你必须使用过Linux。 这个……还是有点太泛了吧,我想下面几个基础可能还是需要的,尽管不一定必需: 新手呢我还是推荐大家先看这些:linux入门资源:

1, 关于操作系统理论的最初级的知识。不需要通读《操作系统概念》《现代操作系统》等巨著,但总要知道分时(time-shared)和实时(real-time)的区别是什么,进程是个什么东西,CPU和系统总线、内存的关系(很粗略即可),等等。

2, C语言。不需要很精通C语言,只要熟练编写C程序,能看懂链表、散列表等数据结构的C实现,用过gcc编译器,就可以了。如果已经精通C语言显然是大占便宜的。

3, 关于CPU的知识。这块儿可以在学习内核过程中补,但这样的话你就需要看讲解很详细的书,比方后面将会提到的《情景分析》。你是否熟悉 Intel 80386 CPU?尝试着回答这几个问题来判断一下:

1/说出80386的中断门和陷阱门的区别;

2/说出保护模式与实模式的区别;

3/多处理器机器上,普通的读-改-写回一块内存这样的动作,为什么需要特殊的手段来保护。等等。讲解基于其它CPU的Linux内核的书,目前好象只有一本《IA64Linux内核:设计与实现》──也还是Intel的,其它都是讲解基于IA32的。

以上算是知识方面吧,如果还要再补充一条,我想就是:动手编译过内核。

好多人装上Linux之后,第一件事找到内核源码所在的路径,打开一个C程序文件,开始哗哗哗翻页,看看大名鼎鼎的Linux内核代码到底长啥模样──然后关闭。这是可理解的,但不是学习的方法。

注:正在学习C/C++ linux的小伙伴需要学习资料的可以私信“资料”,免费分享全套学习资料哦

此外,你研究内核的目的是什么, 开发? 乐趣?对c++/LINUX 感兴趣的小伙伴可以私信我们一起讨论

标签: #linux源码怎么看