0
点赞
收藏
分享

微信扫一扫

Linux内核学习前言

船长_Kevin 2022-03-17 阅读 109

  学习Linux内核有几年了。时间虽然很多,但是,进步,其实是很慢的。在刚开始学习的时候,内核里面的一些个模块,我觉得学起来很吃力。像是驱动程序,我去学习的时候,总觉得,那些个端口操作太复杂。

  对于这个问题,我是觉得,大概是因为,我缺乏电子电路的基础,所以才觉得吃力的。所以呢,我就开始去学习电子学的知识了。谁知道,电子学的知识,学习起来,那也并不简单啊。

  像是电路原理,模拟电路,它们都需要有微积分的基础,需要线性代数等等的数学基础。

  大学毕业以后,数学,其实是不咋学了的。这会儿,又要来学习这些个数学知识,难度,其实是大了很多的。

  平时的时间有限,又要去学习很多的知识。心里头,会有些烦闷的。

  不过呢,学习,还得是去进行着的。

  本系列文章专栏,主讲的是 Linux 0.12 内核,也就是赵炯的那本《Linux内核完全剖析》所讲的内核版本。

  0.12内核,版本虽然低,可是,里面的东西,可并不简单啊。给我的感觉,虽然说《操作系统真象还原》,《30天自制操作系统》等等的书籍写了内核,但是这种流行的教材所写的内核,在复杂度,完善度方面,其实是不如0.12内核的。

  想要学习好Linux内核,我觉得,学习流行的内核代码是很重要的。因为,流行的内核,有教材,有讲解,你可以跟着里面的东西,去学习。然而,学习Linux内核源代码,也同样是重要的。并且呢,在你学习了《操作系统真象还原》,《30天自制操作系统》以后,你真正地想要在内核学习上入门,并逐渐地积累和提升编程能力,内核源代码的阅读,那就是很必要的了。

  在Linux内核源代码上,适合作为入门学习的代码,是0.11内核和0.12内核。因为,这两个版本的内核,赵炯先生都有写书去讲解它们。

  那么,在阅读我们这个系列的文章的时候,我也比较建议大家,手边要准备好赵炯先生的两本讲解内核的教材。它们分别是《Linux内核完全注释》,《Linux内核完全剖析》。

  大体上,我觉得,Linux 0.12 内核的学习,对于初学者来讲,它会是耗费你的很长的时间的一种学习了。因为,这里面,确实是涉及了好多的知识。很多知识,我第一次学习的时候,我是觉得很蒙圈的。就算是现在好了,好多的东西,我依然是觉得很蒙圈。

  好在,虽说知识很蒙圈,但是落实到代码上,很多的东西,也算是还可以。

  Linux 内核代码,给我的感觉,它就是啥呢?

  第一种,函数调用。调用这个函数,调用那个函数。

  第二种,注册机制。所谓的注册,那就是说啊,你呢,你得是设置一些个数据结构,比如说,申请一个数组,申请一个结构体,然后呢,将一些个数据,填入结构体的相应字段,填入数组里面。

  当我在学习 Linux 内核的时候,很多时候,我所感受到的,都是这两种机制。所以呢,对于那些个暂时没有学懂的部分,我就简单地理解为,这就是在进行着一种注册,然后就过去了。

  我觉得,初始学习的时候,对于难点,暂时有一个简单的理解,有一个印象,也就可以了。然后呢,接下来,我们可以在很漫长的时间里,在漫长的积累里面,逐渐地,去积累知识。经过反复的学习,长期的学习,逐渐地,好多的知识,你会理解的。

  对于 Linux 内核,我目前是看完了一遍。也并不是都看了,比如说,作者的Makefile文件,我就没有都看完。我觉得,里面涉及的一些个高级的命令,有点难,目前的我,一时还学不了。所以,就没有全面地去学习。数学协处理器的部分,我也没有去看。我觉得,这部分的知识,可以在我的内核知识有了更多的积累之后,再去看。最后呢,build.c,我也没有细看。

  这样的话,对于 0.12 内核,我也是有很多的不明白的地方。之所以暂时不去管这些个不明白的地方,那是因为,我觉得,这些个东西,是需要我有了更多的积累的时候,再去看,会好一些。

  在本系列文章里面,我会将我的所学,将我所会的东西,尽量地,讲解出来。

  我会尽量地向着深入浅出的方向去努力着。然而,说是深入浅出,但是呢,其实这个目标并不容易达到。本系列文章,其实还是需要大家有着一些个基础知识的。

  某些个地方,我会讲解一些个基础。但是呢,这些个基础,其实并不是说,你第一次学习,看我的讲解,就可以。这些个讲解基础知识的部分,很多地方,只是复习,只是捡一捡。

  也会有一些个地方,它算是对大家的原本的知识的一种巩固与提升。

  比如说啊,位操作,这个是汇编语言和C语言里面都会有的一种知识了。位操作,我当初在学习C语言的时候,其实是没咋细研究的。只是在学习了汇编语言以后,才开始接触的。

  位操作,在 Linux 内核里面,其实是有很多的。有的位操作,显得简单一些,有的呢,显得复杂一些。这个呢,其实是需要有专门的一些个章节,来予以讲解的。

  在我这里,我估计,初次讲解的时候,还做不到整理好所有的位操作。到时候遇到了再说吧。

  Linux 内核的学习,对大家的C语言,对大家的汇编语言的学习,那都会是一种很重要的提升的。当初我们学习C语言,它还只是在屏幕上打印一行字符串,以及给数组排序啥的。而到了这里,我们算是真正地在学习着C语言了。

  既然是学习 C 语言,我也建议大家,从这里开始,大家需要有个准备,那就是要在以后的时间里,慢慢地,去提升着 C 语言的能力了。一些个优秀的国外教材,一些个讲解 C 语言的高级的知识的书,以后,你是需要去研究的了。

  在这个学习里面,我们还需要去了解许多的硬件的知识。相关的学科,像是电子学的基础,电路原理,模拟电路,数字电路,你是需要慢慢地来补齐这个基础的。最为直接的,其实就是微机原理。微机原理的知识,讲的就是各种接口芯片的知识。像是 8259A,8253, 8251, 这些个知识,在微机原理课程里面,似乎看不到什么用处。但是呢,在 Linux 内核里面,是需要用到这些个知识的。

  我的学习,是在学习了C语言之后,直接去学习着赵炯的 0.12 内核教材。当时也不知道什么微机原理,只是知道,涉及8259, 8253 的时候,里面有一系列的外设操作。此时,程序里面,会有很多的,用汇编语言来进行的 in 和 out 指令。当时看到了这些个东西,觉得是有些蒙圈,不懂这些个东西究竟是在干什么。但是呢,这些个代码本身倒是不难理解。

  in 指令,无非就是从端口读取数据。out 指令,无非就是将数据写入端口。

  所以呢,某些个知识,当时想要理解,还做不到。但是呢,想要理解说,这就是端口操作,这个,还是能够做到的。

  大家在学习的时候,遇到相关的问题,难点,我觉得,也是可以暂时采取着简化的处理与理解的。

  刚开始接触端口操作的时候,我也不知道,这些是微机原理所讲的知识。后来,才知道,有微机原理课程,专门地在讲这些个知识。所以,我就又买来微机原理教材,去学习了。学习的时候,发现,好多的知识,跟 0.12 内核里面所讲的,那是差不多啊。只是呢,作为专门地讲解微机原理的书籍,它讲的东西,是更为详细的。

  这个详细,有好有坏吧。像我目前的情形里,模拟电路,我只是学完了清华大学华成英教授的第五版教材的第二章,学完了晶体管与场效应管的放大电路。但是呢,后面的继承放大的知识,我还没有学。数字电路的知识,我也还没有学。这种情况下,我去看微机原理的知识,其实也是觉得蒙。

  在这种情况下,我去看的时候,主要地,其实就是拼学习的次数了。就是说,本来不熟悉的东西,重复的次数多了,慢慢地,会了解和熟悉一些个东西。

  外设芯片啥的,这是我们需要在 Linux 内核的学习里面,去接触的一种东西。然后呢,在这种学习里面,其实呢,你需要去接触的东西,会更多的。这就要求,我们得做好准备,需要的时候,随时查阅资料,不能懒。

  另外呢,你还得做好学习英语的准备了。有的时候,我们也需要去查阅英文网站,查阅英文手册。

  个人觉得,Linux 内核的学习,是一个挑战很大,综合性很强的一种学习了。

  在这里呢,我是会将我所会的一些个东西,讲解出来,和大家一起来分享。

  我个人是打算,边学习,边讲解,边交流。在这种动态的学习与交流中,慢慢地来提升自己的编程能力。

  然后啊,在这里,我的这个系列,其实还会有一个特色,那就是,我会将自己改编的一些个代码,贴出来,供大家下载和使用。

  改编 0.12 内核,算是我的一个梦想了。因为,我觉得,只有将 0.12那个时代的内核代码,改编为当前的编译器所支持的语法,才更加地方便去学习的。

  对于 0.12 内核,我尝试着去改编了。改编出来以后,算是有许多的bug。这令我觉得很遗憾。但是呢,对于初学来讲,应该还是可以用的。

  在这里,我将自己的改编 0.12 内核的成果给贴出来,同时,其实也将自己的未能够做好的部分,给展现出来了。

  对此,若是有能够指点一二的地方,也欢迎大家提出来。

  祝大家学习学习愉快,也希望自己能够学习进步。

举报

相关推荐

0 条评论