Linux 内核简介

内核作用

从宏观角度来说, Linux 系统由 内核根文件系统 组成。

其中 根文件系统 就不多说了,可参照《Linux 文件系统简介(FHS)》。

至于内核,有但不限于以下几种作用:

  1. 进程管理;
  2. 内存管理;
  3. 网络协议栈管理;
  4. 文件系统管理;
  5. 驱动程序管理;
  6. 安全功能管理;

设计流派

没错,内核也是有设计流派的,内核的设计流派分为 单内核设计微内核设计

单内核设计 ,就是把所有功能集成于同一个程序,比如 Linux 内核设计。

微内核设计,即每种功能使用一个单独的子系统实现,比如 Windows 内核设计。

理论上来说,微内核设计是比较前卫而且先进的设计,它可以避免某一功能出问题时,不会影响其他功能的实现。然而这种设计当前面临着各子系统通信及调度的问题,并不是很稳定。

Linux 内核虽然采用单内核设计,但却有以下特点来避免单内核设计的缺陷:

  1. 支持模块化: .ko (kernel object);
  2. 支持模块运行时动态装载或卸载;

组成部分

内核的核心文件放置于 /boot 目录下,名称结构为: vmlinuz-VERSION-releasevmlinuz-3.10.0-693.2.2.el7.x86_64 )。

内核一般都是压缩的,启动时它的首要任务是解压缩,但由于当时文件系统还不能使用,所以/boot 下面还有一种 ramdisk 文件,即基于内存的磁盘设备,就是在系统启动初期,临时将内存作为磁盘,解压出一个虚拟的文件系统,从而可以让内核正常解压及加载。

ramdiskCentOS 5 中和 CentOS 6/7 中的命名规则略有不同。

CentOS 5initrd-VERSION-release.img
CentOS 6/7initramfs-VERSION-release.img

ramdisk

如果内核把已知根文件系统所在的磁盘设备驱动程序编译进内核(一般自己编译内核含此驱动),此时就不需要这个 ramdisk ,所以发行商提供的安装系统文件不可能包含所有驱动在内核中。

这样,要想加载根文件系统,就要先加载根文件系统所在的磁盘设备驱动,而驱动就在根上因此,就不能依赖于根上的驱动程序来加载根文件系统;要借助于 ramdisk 临时根文件系统来加载根文件系统所在的磁盘设备驱动,从而加载根文件系统。

ramdisk 临时根文件系统不是操作系统发行商直接在光盘上自带的,而是在安装操作系统后临时生成的,它在安装操作系统后,能扫描当前主机硬盘设备的型号,并找到相关驱动做成一个临时根;所以这个临时根是为每个用户安装过程生成以后动态创建的。

ramdisk 临时根是把内存某段空间当做磁盘使用,而 Linux 内核特性是使用缓冲和缓存来加速对磁盘上的文件访问,这就是为什么在 CentOS 5 上 使用 ramdisk( initrd ) ,在后来的 CentOS 6/7 上使用的 ramfs 的原因,避免了在内存中的双缓冲和双缓存。

一旦内核借助于 ramdisk 提供的临时根完成加载真正的根文件系统所在的设备,下一步就装载根文件系统,内核会自动把根文件系统所在的设备挂载至根上,所以说根是在内核中就是这个原因所在。

modules

之前说到 Linux 内核支持模块化,其模块化文件存放路径为: /lib/modules/VERSION-release