linux内核源代码查看及分析_linux内核源代码

avatar shenyifan 2023-10-28 10:49 430次浏览 评论已关闭

查看Linux核源代码和分析方法1. Linux 查看内核源代码Linux的核源代码可以通过多种方式获得。一般来说,在安装的linux系统下,/usr/src/linux目录中的内核源代码。

要想顺利阅读源代码,最好提前对源代码的知识背景有一定的了解对于linux核源代码,我认为基本要求是:1、操作系统的基本知识;2、熟悉C语言,最好有汇编语言和GNU的知识 了解标准C的扩展知识此外,在阅读之前,还应了解Linux内核源代码的整体分布情况。

我们知道,现代操作系统一般由过程管理、内存管理、文件系统、驱动程序、网络等组成从Linux内核源代码可以看出,每个目录大致对应这些方面Linux内核源代码的组成如下(假设与Linux目录相比):arch

该子目录包含了与此核心源代码支持的硬件系统结构相关的核心代码例如,X86平台是i386include该目录包括大多数核心include文件此外,每个支持的系统结构都有一个子目录init该目录包含核心启动代码。

mm本目录包含所有内存管理代码与特定硬件系统结构相关的内存管理代码位于arch/*/mm目录下,如arch/i386/mm/fault.c drivers系统中的所有设备驱动程序都位于此目录中它进一步分为几种设备驱动程序,每种设备都有相应的子目录,例如声卡驱动程序对应于drivers/sound。

Ipc该目录包含核心进程间通信代码modules该目录包括已建成的可动态加载模块fs Linux支持文件系统代码不同的文件系统对应不同的子目录,例如ext2文件系统对应的是ext2子目录Kernel主要核心代码。

同时,arch/*/kernel目录下放置与处理器结构相关的代码Net网络部分的核心代码每个子目录对应于网络的一个方面Lib该目录包含核心库代码与处理器结构相关的库代码放置在arch/*/lib/目录下。

Scripts该目录包含用于配置核心脚本文件Documentation本目录是一些起参考作用的文档【Linux内核内存管理专题训练营】热门开营!!最新的Linux内核技术详细说明独家Linux内存管理干货共享。

两天持续技术输出:——————–第一天:1.物理内存映射和空间划分2.ARM32/64页表的映射过程3.分配物理页面和Slab分配器4.实战:VMA搜索/插入/合并——————–

第二天:5.实战:调用mallocap系统6.缺页中断处理/反向映射7.回收页/匿名页生命周期8.实现/KSM/Dirty COW内存漏洞原价“198”,现在“0.02”优惠!限时特价入场地址:Linux内核内存管理专项训练营-学习视频教程-腾讯课堂

立即抢购加入吧2. Linux 核源码分析方法2.1 清晰的核源代码如果你想透析Linux,深入操作系统的本质,阅读核源代码是最有效的方法众所周知,要成为一名优秀的程序员,需要大量的实践和编写代码编程很重要,但是只编程的人很容易把自己局限在自己的知识领域。

如果我们想扩大我们的知识,我们需要联系其他人编写的代码,特别是那些比我们更高水平的人编写的代码通过这种方式,我们可以跳出自己知识圈的束缚,进入别人的知识圈,了解更多我们通常在短时间内无法理解的信息Linux的核心是由无数开源社区的“大神”精心维护的,这些人可以称之为代码大师。

通过阅读Linux核心代码,我们学到的不仅仅是核心相关知识,更有价值的是学习和体验他们的编程技能和对计算机的理解我还通过一个项目联系了Linux内核源代码的分析我从源代码的分析中受益匪浅除了获得相关的内核知识外,它还改变了我过去对内核代码的理解:。

1.核源代码的分析并非“高不可攀”核源代码分析的难度不在于源代码本身,而在于如何使用更合适的分析代码的方法和手段内核的巨大使我们无法像分析一般的demo程序那样从主函数一步一步地分析我们需要一种从中间干预的手段来“打破”内核源代码。

这种“按需索取”的方式使我们能够把握源代码的主线,而不是过度纠结于具体细节2.内核的设计很漂亮核心的特殊性决定了核心的执行效率必须足够高,以满足当前计算机应用程序的实时要求因此,Linux核心使用C语言和汇编的混合编程。

但我们都知道,软件执行效率和软件可维护性在很多情况下都是相反的如何在保证内核高效的前提下提高内核的可维护性,取决于内核中的“美”设计3.神奇的编程技巧在一般应用软件设计领域,编码的地位可能不会被过度重视,因为开发者更注重软件的良好设计,而编码只是一个实现手段的问题——就像用斧头劈柴一样,不需要太多思考。

然而,这并不是在核心中建立起来的良好的编码设计不仅提高了可维护性,而且提高了代码性能每个人对核心的理解都会有所不同随着我们对核心理解的加深,我们将对其设计和实现的思想有更多的思考和经验因此,本文希望引导更多在Linux内核大门外徘徊的人进入Linux的世界,亲身体验内核的魔力和伟大。

我不是核源代码专家,这样做只是想分享我自己的经验和经验分析源代码,为那些需要提供参考和帮助,说“宏伟”,也是计算机行业,特别是在操作系统核心贡献自己的微薄力量闲话少叙(已经罗嗦了很多,尴尬~),下面我就来分享一下我的Linix核源码分析方法。

2.2 内核源码难吗?本质上分析Linux内核代码和看别人的代码没什么区别,因为你面前的代码一般不是你自己写的让我们举一个简单的例子,一个陌生人给你一个程序,让你解释程序的功能设计,我认为很多人觉得编程能力必须认为这没什么,只要我耐心地从头到尾阅读他的代码,肯定会找到答案,事实是真的。

所以现在换个假设,如果这个人是Linus,给你的是Linux内核的模块代码,你还会觉得这么容易吗?许多人可能会犹豫也是陌生人(如果Linus认识你,当然不算,呵呵~)给你的代码,为什么给我们的感觉很不一样?我认为有以下原因:。

1.在“外界”看来,Linux内核代码有些神秘,而且很大,突然摆在面前可能会觉得无法下手例如,它可能来自一个非常小的原因——找不到main函数对于简单的demo程序,我们可以从头到尾分析代码的含义,但是核心代码的分析完全失败了,因为没有人能从头到尾看到Linux代码(因为真的没必要,用的时候可以看)。

2.许多人也接触过大型软件的代码,但大多数都是应用程序项目,代码的形式和意义与他们经常接触的业务逻辑有关与核心代码不同,其处理的大多数信息与计算机底部密切相关例如,缺乏操作系统、编译器、汇编、系统结构等相关知识也会使核心代码的阅读出现许多障碍。

3.分析核心代码的方法是不合理的面对大量复杂的核心代码,如果不从全局的角度出发,很容易陷入代码细节的泥潭虽然核心代码很大,但它也有它的设计原则和结构,否则维护它对任何人来说都是一场噩梦!如果我们澄清代码模块的整体设计理念,然后分析代码的实现,分析源代码可能是一件容易和快乐的事情。

我个人就是这样理解这些问题的如果您没有接触过大型软件项目,分析Linux核心代码可能是积累大型项目经验的好机会(事实上,Linux代码是我目前接触到的最大的项目!)假如你对计算机底层了解不够透彻,那么我们可以选择边分析边学习的方式来积累底层知识。

代码分析的进展可能会稍微慢一些,但随着知识的不断积累,我们对Linux核心的“业务逻辑”会逐渐清晰起来最后,如何从全局的角度把握分析的源代码,也是我想和大家分享的经验2.3 核源码分析方法2.3.1 资料搜集

从人们理解新事物的角度来看,在探索事物的本质之前,我们必须有一个理解新事物的过程,这个过程是我们对新事物有一个初步的概念例如,如果我们想学习钢琴,我们需要首先了解弹钢琴需要学习基本的音乐理论、简单的乐谱、五行乐谱和其他基本知识,然后学习弹钢琴的技能和指导,最后真正开始练习钢琴。

内核代码的分析也是如此首先,我们需要定位要分析的代码所涉及的内容是进程同步和调度的代码,是内存管理的代码,是设备管理的代码,还是系统启动的代码等巨大的核心决定了我们不能一次分析所有的核心代码,所以我们需要给自己一个合理的分工。

算法设计告诉我们,要解决一个大问题,首先要解决它所涉及的子问题为了定位要分析的代码范围,我们可以使用手头的所有资源,尽可能全面地了解代码的整体结构和一般功能这里提到的所有资源都是指Baidu、谷歌大型网络搜索引擎,或操作系统原理教科书和专业书籍,或他人提供的经验和信息,甚至Linux源代码提供的文档、注释和源代码识别符的名称(不要低估代码中识别符的名称,有时他们可以提供关键信息)。

总之,这里所有的资源都是指你能想到的所有可用资源当然,我们不太可能通过这种形式的信息收集获得我们想要的所有信息我们只想尽可能全面因为信息收集越全面,分析代码过程中可以使用的信息就越多,分析过程的难度就越小。

假设我们想分析Linux变频机制实现的代码,这里有一个简单的例子到目前为止,我们只知道这个术语通过字面意思,我们可以大致猜测它应该与CPU的频率调整有关通过信息收集,我们应该能够获得以下相关信息:1.CPUFreq机制。

2.performance、powersave、userspace、ondemand、conservative调频策略3./driver/cpufreq/4./documention/cpufreq5.P state和C state。

如果Linux内核代码的分析能够收集到这些信息,应该说是非常“幸运”的毕竟关于Linux内核的信息确实不如.NET和JQuery如此丰富,但与十多年前相比,没有强大的搜索引擎和相关研究数据的时期应该被称为“大丰收”时代!我们甚至通过简单的“搜索”找到了这部分代码所在的源代码文件目录(可能需要一两天)。

不得不说,这样的信息简直就是“价值连城”!2.3.2 源码定位从数据收集中,我们“幸运”找到了源代码相关的源代码目录但这并不意味着我们确实分析了这个目录下的源代码有时候我们发现的目录可能是分散的,有时候我们发现的目录下有很多与特定机器相关的代码,我们更关心的是待分析代码的主要机制,而不是与机器相关的特定代码(这对我们理解核心的本质更有帮助)。

因此,我们需要仔细选择数据中涉及代码文件的数据当然,这一步不太可能一次完成没有人能保证一次可以选择所有需要分析的源代码文件,而且没有遗漏但我们不必担心,只要我们能掌握与大多数模块相关的核心源文件,通过后期对代码的具体分析,我们自然会找到它们。

回到上面的例子,我们仔细阅读/documention/cpufreq下的文档说明目前,Linux源代码将在源代码目录的documention文件夹中保存与模块相关的文档描述如果待分析的模块没有文档描述,这将增加定位关键源代码文件的难度,但不会导致我们找不到我们想要分析的源代码。

通过阅读文档描述,我们至少可以关注/driver/cpufreq/cpufreq.c源文件通过对源文件的文档描述,结合之前收集到的调频策略,我们可以很容易地关注cpufreq_performance.c、cpufreq_powersave.c、cpufr。

来源:深易凡软件库

发表评论
请先登录后再评论~