大家好,今天小编关注到一个比较有意思的话题,就是关于linux内核源码如何学习的问题,于是小编就整理了2个相关介绍Linux内核源码如何学习的解答,让我们一起看看吧。
LINUX是如何记录进程***的?你能从C语言源代码层面分析下吗?
谢邀。
其实简单来说,进程无非就是处于运行期的程序及其相关***的总和。这里读者应该注意“相关***”一词,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 结构,这样可以避免动态分配和释放带来的开销,提高内存的使用效率。
根据我手上的内核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 平台的实现,其他平台的实现方法,读者可自行查阅。
需要多久才能看完linux内核源码?
我觉得一个人穷其一生也看不完整个内核的源码,Linux内核全世界的程序员在维护,现在已经变得无比庞大,连Linus本人也未必能读完。现实一点,找几个自己感兴趣的框架阅读一下就可以了,比如网络框架、多媒体框架等等。更深入一点阅读内存管理文件管理也是可以的,但意义不大,除非自己想搞一套操作系统,并且要有一定的硬件基础。
如果你的目标仅仅是看完,内核源码2000+万行,你给自己你个目标每天看多少行吧!而如果不要完全看懂这二千万行代码,恐怕要花掉你这一辈子光阴,都不一定能达成目标。
究竟要多久才能看完Linux内核源码,这取决于你是否是计算机大类专业的毕业生(或者说你学过操作系统原理、计算机网络、计算机组成原理、汇编语言程序设计、数据结构等基础课程),也需要根据你学习的目的来确定:
第一、如果你只是希望大致了解一下Linux操作系统的设计原理等基础知识,那么对照Linux 2.4的内核源码,结合操作系统原理(普通教科书,比如汤子瀛编著的)、LINUX操作系统原理与应用(陈莉君编著)等书籍,大约半年就能够有个大概了解。
第二、如果你希望将来做Linux系统上面的应用开发,那么对照Linux 较新的内核源码,结合LINUX操作系统原理与应用(陈莉君编著)、Linux程序设计(第4版)、Unix环境高级编程等书籍,大约一年左右就能够上手。
第三、如果你希望将来做Linux系统的内核开发,那么对照Linux 较新的内核源码,结合Linux内核设计与实现、Linux Device Drivers等书籍,大约一年以上就能够上手。
到此,以上就是小编对于linux内核源码如何学习的问题就介绍到这了,希望介绍关于linux内核源码如何学习的2点解答对大家有用。