Linux 内核简介
内核作用
从宏观角度来说, Linux 系统由 内核
和 根文件系统
组成。
其中 根文件系统
就不多说了,可参照《Linux 文件系统简介(FHS)》。
至于内核,有但不限于以下几种作用:
- 进程管理;
- 内存管理;
- 网络协议栈管理;
- 文件系统管理;
- 驱动程序管理;
- 安全功能管理;
- ...
设计流派
没错,内核也是有设计流派的,内核的设计流派分为 单内核设计
和 微内核设计
。
单内核设计
,就是把所有功能集成于同一个程序,比如 Linux 内核设计。
微内核设计
,即每种功能使用一个单独的子系统实现,比如 Windows 内核设计。
理论上来说,微内核设计是比较前卫而且先进的设计,它可以避免某一功能出问题时,不会影响其他功能的实现。然而这种设计当前面临着各子系统通信及调度的问题,并不是很稳定。
Linux 内核虽然采用单内核设计,但却有以下特点来避免单内核设计的缺陷:
- 支持模块化: .ko (kernel object);
- 支持模块运行时动态装载或卸载;
组成部分
内核的核心文件放置于 /boot
目录下,名称结构为: vmlinuz-VERSION-release
( vmlinuz-3.10.0-693.2.2.el7.x86_64
)。
内核一般都是压缩的,启动时它的首要任务是解压缩,但由于当时文件系统还不能使用,所以/boot
下面还有一种 ramdisk
文件,即基于内存的磁盘设备,就是在系统启动初期,临时将内存作为磁盘,解压出一个虚拟的文件系统,从而可以让内核正常解压及加载。
ramdisk
在 CentOS 5
中和 CentOS 6/7
中的命名规则略有不同。
CentOS 5
: initrd-VERSION-release.img
; CentOS 6/7
: initramfs-VERSION-release.img
;
ramdisk
如果内核把已知根文件系统所在的磁盘设备驱动程序编译进内核(一般自己编译内核含此驱动),此时就不需要这个 ramdisk
,所以发行商提供的安装系统文件不可能包含所有驱动在内核中。
这样,要想加载根文件系统,就要先加载根文件系统所在的磁盘设备驱动,而驱动就在根上因此,就不能依赖于根上的驱动程序来加载根文件系统;要借助于 ramdisk
临时根文件系统来加载根文件系统所在的磁盘设备驱动,从而加载根文件系统。
ramdisk
临时根文件系统不是操作系统发行商直接在光盘上自带的,而是在安装操作系统后临时生成的,它在安装操作系统后,能扫描当前主机硬盘设备的型号,并找到相关驱动做成一个临时根;所以这个临时根是为每个用户安装过程生成以后动态创建的。
ramdisk
临时根是把内存某段空间当做磁盘使用,而 Linux 内核特性是使用缓冲和缓存来加速对磁盘上的文件访问,这就是为什么在 CentOS 5
上 使用 ramdisk( initrd )
,在后来的 CentOS 6/7
上使用的 ramfs
的原因,避免了在内存中的双缓冲和双缓存。
一旦内核借助于 ramdisk
提供的临时根完成加载真正的根文件系统所在的设备,下一步就装载根文件系统,内核会自动把根文件系统所在的设备挂载至根上,所以说根是在内核中就是这个原因所在。
modules
之前说到 Linux 内核支持模块化,其模块化文件存放路径为: /lib/modules/VERSION-release
。