×

深入分析linux内核源代码 语言 代码

深入分析linux内核源代码(Linux是如何记录进程资源的你能从C语言源代码层面分析下吗)

admin admin 发表于2023-02-13 19:54:03 浏览34 评论0

抢沙发发表评论

本文目录

Linux是如何记录进程资源的你能从C语言源代码层面分析下吗

谢邀。

其实简单来说,进程无非就是处于运行期的程序及其相关资源的总和。这里读者应该注意“相关资源”一词,Linux 在内核中是如何记录进程的资源的呢?

Linux内核如何记录进程的资源?

首先应该明白,Linux 内核大都是采用C语言编写的,因此要弄清楚内核如何记录进程资源,只需要查看相关的C语言代码就可以了。事实上,Linux 内核是使用 task_struct 结构体描述进程的资源的,它的C语言部分代码如下,请看:

task_struct 结构体很长,在我手中的 Linux 内核C语言源代码中,它占用了280行。当然了,这其中包含很多条件编译部分,在 32 位机器上,task_struct 大约要占用 1.7 KB 的内存空间,不过考虑到它可以管理完整的进程,1.7kB 其实并不算大了。

鉴于 task_struct 结构体过长,这里不可能将其成员一一介绍清楚。如果读者和我一样好奇,粗略的浏览 task_struct 结构体,应该能够发现一些比较令人熟悉的成员,例如:

通过C语言注释以及成员的变量名,能够看到 task_struct 结构体包含了文件系统,线程结构体,以及进程打开的文件等信息,这就与上一节文章的内容对应上了。其他成员在我之后的文章中会涉及到,这里暂不赘述。

在创建进程时,Linux 通过 slab 分配器分配 task_struct 结构,这样可以避免动态分配和释放带来的开销,提高内存的使用效率。

那么创建 task_struct 结构后,内核如何访问它呢?

根据我手上的内核C语言源代码,Linux 中还有一个结构体 thread_info,它的其中一个成员 task 指针正好适合用于索引 task_struct 结构体,在X86_64平台上,thread_info 的相关C语言代码如下,请看:Linux 通常会在内核栈底或者栈顶保留 thread_info 结构,而内核栈通常大小都是可知的,因此每个进程都能方便的从自己的栈中找到 thread_info 结构,进而找到 task_struct 结构。

查找当前进程的 thread_info 结构,可以调用 current_thread_info() 函数,它的C语言代码如下,请看:

可见,current_thread_info() 函数其实就是通过进程栈计算的,因此它的实现与平台架构有关,上述C语言代码其实只是 arm 平台的实现方法,其他平台的实现方法,读者可自行查阅。

此时,要获取当前进程的资源,可以通过 current_thread_info()-》task 索引。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

需要多久才能看完linux内核源码

linux 0.11的内核源码,结合下面这本书,我花了大概一个寒假(1个半月),看了一遍。

然而,现在的内核已经膨胀的不成样子了,以还不算最新的linux-4.9.229为例:

整个内核源码一共约 801M:

驱动代码占了大概一半,大约407M:

体系相关的代码大约164M:

网路子系统相关的代码29M:

文件系统相关的代码38M:

linux内核核心代码大约7.7M:

但是就这7.7M,其实你要完全看完看懂也不容易。linux内核代码涉及c语言、硬件组成原理、操作系统、数据结构和算法等,这些基础知道你都具备了吗?如果没有具备,即使看完linux内核源码,你也看不懂liux内核的精髓。

linux内核源码大而全,一个人,即使再聪明、再有精力,也不可能完全看完、看懂所有的linux内核源码。你得选择一个主线进行深入研究,这些主线可以是:

  • linux内核启动过程研究
  • linux驱动架构的学习和研究
  • linux网络子系统的研究
  • linux内存管理机制的研究
  • linux调度器的学习和研究
  • linux进程管理的学习和研究
  • linux虚拟机制(kvm)的学习和研究
  • linux内核实时化技术的研究

沿着某一个主线,深入进去,在研究清楚这个主线的同时,向其他的主线扩展、渗透和学习。由点到线、由线到面、由面到体,层层深入、不断精进,是学习linux内核源码的一个有效的方法。

关注”技术简说“,带你由浅入深学习linux内核源码。linux内核开发100讲免费教程,每周二、周四晚上9点更新视频,每周一、周三晚9点更新文章,敬请收看。进我主页点”视频“栏目即可观看。

看linux内核源码对初期学习C语言有多大帮助推荐一个版本的内核源码

老实说对于初期学习c语言还是别看linux内核源码了,因为内核非常庞大,涉及到相当多c语言以外的知识,比如汇编,音频,视频,计算机系统,数据结构等等。c语言初学者看源码会觉得很艰难,因为基础还很薄弱,对于c语言提升的帮助十分有限。如果你以后有志于参与内核开发或者对内核感兴趣,推荐你看一看《linux内核设计与实现》,这本书介绍了内核基本设计思想,又不涉及过多的源码分析,看完能够大概的了解linux内核。内核版本的话还是推荐2.6,内核更新非常快,但资料更新跟不上,现在市面上大部分内核分析的书都是基于2.6的。不过内核最重要的是理解设计思想,弄明白2.6就能很快的熟悉4.x的内核了。

我一般还是工作中需要才会才会分析相关的内核源代码,因为看起来真的是枯燥:)