内核是一个很复杂的东西,也很有学习和研究的意义。内核是一个操作系统中最为基础的模块,同样它也是操作系统最核心的东西。内核主要负责系统的管理、设备驱动程序、内存相关、网络系统以及一些文件等等,这些都决定了一个系统的性能好坏以及它的稳定运行。以下是在百度百科中找到的一张图片,是 Linux 操作系统内核的体系结构,分享给大家:
首先内核在 Linux 中的任务,从技术层面来说的话,硬件与软件之间也就是中间层就算是内核。它的作用就是把应用层程序的请求传递转发给到硬件设备,并且也可以充当底层的驱动程序,还可以对系统中的一些设备进行寻址。第二就是从应用程序层面来说,其实硬件跟应用程序没有联系,应用程序它只跟内核有联系。其实内核可以说是一个资源管理程序,主要是用来负责将可用的资源进行共享,比如说系统磁盘空间或者网络连接的分配,将它们分配到系统中的各个进程。内核其实就像一个库一样,它面向系统提供了一组命令。大家肯定都知道函数调用吧,其实系统调用对于应用程序来说,就跟普通的函数调用一样。
关于内核的分类:
-
微内核。微内核它最基本的功能都是由中央内核实现的。它会把所有的功能都给一些独立的进程,然后这些进程通过中心内核与通信接口进行通信。 -
宏内核。宏内核是指将内核的所有代码都打包到一个文件中,其中包括子系统,子系统指的是文件管理系统、内存管理系统、设备驱动程序,会将这些都打包到一个文件中。然后内核中的函数都可以访问内核中所有其他部分的内容。需要注意的是现在内核都是支持模块的动态装卸的。
关于内核学习方面,给大家以下几点建议:
-
首先需要学习操作系统基本概念。这里推荐大家 《操作系统:设计与实现》 这本书,作者是 Andrew S.Tanenbaum,这本书它是以 MINIX 为例进行操作系统的相关概念讲解。 -
满足第一个条件对操作系统有了概念之后,就可以开始学习 Linux 的机制了。这里给大家推荐 《 Linux 内核设计与实现》 ,这本书的作者是 Robert Love。主要将的就是一些概念,Linux 都包含什么,Linux 是怎么运行的等等的相关概念。 -
如果对 Linux 的内核有了相关了解之后,我们还需要进一步的学习和研究 Linux 内核的源码相关。这里有一本很经典的书籍推荐给大家 《深入理解 Linux 内核》,是 Daniel P. Bovet 写的。在看这本书的时候建议对着内核的代码结合起来看着慢慢学。但其实这本书学起来并不容易,代码比较多比较难啃。但如果这本书可以学明白,那么就可以说明 Linux 内核你已经算是比较熟悉了,恭喜你呀。 -
如果你想学习设备驱动开发方面的内容,那么可以了解了解 《Linux 设备驱动程序》这本书,关于驱动学习,这是一本相当不错的入门资料。除此之外,还有另外一本很不错的教材 《精通 Linux 驱动程序开发 》,如果有精力的话建议也可以学习学习的。 -
网络管理部分,网络也是系统中很重要的组成部分。学习 Linux 网络管理相关的话建议大家可以了解这本书 《深入理解 Linux 网络技术内幕》。这本书将 Linux 操作系统的网络部分讲解的非常透彻非常清晰,如果感兴趣,可以去看看这本书。 -
从目前的职位来看,现在关于 Linux 方面的工作,大多数都是集中在了嵌入式开发这块,如果想要了解 CPU 的涉及和它的工作方式,建议大家可以学习一些关于架构相关的资料。
关于 Linux 系统的内核,大家不要觉得很难学,很可怕,虽然它可能比较复杂。但其实任何东西只要坚持只要有足够的耐心和毅力,就一定会有收获的。Linux 系统的内核是世界上最大的开源项目之一,它拥有超过 1300 万行的代码。以下是 Linux 系统的内核架构图:
其实关于内核的学习,每个人肯定都有自己的学习方法。在最开始学习 Linux 内核的时候,建议大家不要执着于某一个方面也就是上面提到的不要专注于一个子系统,因为这样,涉及到的面会比较广,也就意味着遇到不懂得东西也就会更多,学习一个全新的东西最难得就是坚持,所以在最开始如果遇到得错误比较多,那么就会产生挫败感,这样也会加速我们对内核的放弃学习。所以建议大家先了解下各个子系统然后再回头细看某些不太明白的内容,这样会相对容易一点,思路可能也会较之前更清晰一些。
拿我学习内核的经验来说,我觉得首先就是需要在脑海中建立一个大体的框架,先去了解各个子系统的构建理念和设计思想。 一旦我们理解了各个子的系统的设计思想,那么这些理念和思想会从宏观上给你呈现出一个清晰的脉络。有这么一句古话,大家都知道:“纸上得来终觉浅,绝知此事要躬行”。如果想要学习内核,只看书是绝对不行,最好是可以结合教材自己也练习以下敲代码。虽然可能比较难推进,但是确可以看到程序的执行过程,会比书上讲的来的更加直观。所以如果有条件和精力,一定要动手实际操作。