应该说是把linux内核这部分知识提前了,因为坐公交需要点视频来打发一下时间,感觉linux内核的视频就不错,就顺便把linux内核提前了。这一次也是打算视频和书一起看,然后总结。书的话还是推荐《深入linux内核架构》。不吹水了,开始进入正题。
1.1 内核简介
1.1.1 内核的任务
在纯技术层面,内核是硬件与软件之间的一个中间层。其作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
尽管如此,仍然可以从其他一些有趣的视角对内核进行研究
- 从应用程序的视角:内核可以被认为是一台增强的计算机,将计算机抽象到一个高层次上。会把硬件上的各种细节屏蔽,然后应用层,只需要调用内核的API,就能使用各种功能。
- 当若干程序在同一系统中并发运行时,也可以将内核视为资源管理程序。内核负责将可用的共享资源(包括CPU时间、磁盘空间、网络连接等)分配到各个系统进程,同时还需要保证系统的完整性。
- 另一种研究内核的视角是将内核视为库,其提供了一组面向系统的命令。
1.1.2 实现策略
当前,在操作系统实现方面,有以下两种主要的范型。
-
微内核,只有最基本的功能直接由中央内核实现。所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。例如:独立进程可能负责实现各种文件系统,内存管理等。(当然,与系统本身的通信需要用到最基本的内存管理功能,这是微内核实现。)
好处:动态可扩展性和运行时切换重要组件,
缺点:由于各个组件之间支持复杂通信需要额外的CPU时间。
-
宏内核,与微内核相反,宏内核是构建系统内核的传统方法。在这种方法中,内核的全部代码,包括所有子系统(如内存管理、文件系统、设备驱动程序)都打包到一个文件中。
宏内核的性能仍然强于微内核,linux仍然是依据这种范型实现的。但其中已经引进了一个重要的革新。在系统运行中,模块可以插入到内核代码中,也可以移除,这使得可以向内核动态添加功能。
1.2 为什么内核是特别的
内核很神奇,但归根结底它只是一个大的C程序,带有一些汇编代码(不时出现很少量的“黑巫术”)。
是什么使得内核如此吸引人?原因有几个。
- 内核是由世界上最好的程序员编写的,源代码可以证实这一点。
- 结构良好,细节一丝不苟,巧妙的解决方案在代码中处处可见。
- 内核采用了设计得非常干净的抽闲,以保持代码的模块化和易管理性,与内核其他方面混合起来,使得代码非常有趣和独特。
- 内核会以上下文相关的重用比特位置,多次重载结构成员,还有很多其他东西。
还有许多不同于用户程序的严肃问题需要说明:
- 调试内核通常要比调试用户层程序困难。应用层有大量的调试器可用。
- 内核提供了许多辅助函数,类似于用户空间的C语言库,但内核领域中的东西总是朴素得多。
- 用户层应用程序的错误可能会导致段错误(segmentation fault)或内存转储(core dump),但内核错误会导致整个系统故障。
- 必须考虑到内核运行的许多体系结构上根本不支持非对齐的内存访问。
- 所有的内核代码都必须是并发安全的。由于对多处理器计算机的支持,linux内核代码必须是可重入和线程安全的。
- 内核代码必须在小端序计算机上能够工作。
- 大多数的体系结构根本不允许在内核中执行浮点计算,因此计算需要想办法用整形来替代。
1.3 内核的组成部分
我们来看下完整的linux系统的各个层次:
linux内核下接计算机硬件,对计算机硬件统一管理,然后提供系统调用接口(API)给用户进程调用(前面也讲过了)。
第二张图,是linux内核中的一些子系统之间的关系,包括我们之后要学习的进程调度,内存管理,进程通信,虚拟文件系统,网络模块等内核子模块,这里就先看看吧,反正初学者也知识知道这些,并不清楚里面的知识。
linux系统中比较重要的数据结构:
task_struct:代表一个进程数据结构指针形成一个task数组
mm_struct:代表进程的虚拟内存
inode:代表虚拟文件系统中的文件、目录等对应的索引节点
1.4 linux内核源码组织
1.4.1 内核版本说明
linux内核版本号由3组数字组成
第一组:目前发布的内核主版本
第二组:偶数表示稳定版本,奇数表示开发中版本
第三组:错误修补次数
1.4.2 源码组织
比较偷懒,直接赋值一个图片即可。