鸟哥的linux私房菜
核心与核心模块
谈完了整个启动的流程,您应该会知道,在整个启动的过程当中,是否能够成功的驱动我们主机的硬件配备, 是核心 (kernel) 的工作!而核心一般都是压缩档,因此在使用核心之前,就得要将他解压缩后, 才能加载主内存当中。 另外,为了应付日新月异的硬件,目前的核心都是具有『可读取模块化驱动程序』的功能, 亦即是所谓的『 modules (模块化)』的功能啦!所谓的模块化可以将他想成是一个『外挂程序』, 该外挂程序可能由硬件开发厂商提供,也有可能我们的核心本来就支持~不过,较新的硬件, 通常都需要硬件开发商提供驱动程序模块啦!
那么核心与核心模块放在哪?
- 核心: /boot/vmlinuz 或 /boot/vmlinuz-version;
- 核心解压缩所需 RAM Disk: /boot/initrd (/boot/initrd-version);
- 核心模块: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel;
- 核心原始码: /usr/src/linux 或 /usr/src/kernels/ (要安装才会有,默认不安装)
如果该核心被顺利的加载系统当中了,那么就会有几个资讯纪录下来:
- 核心版本: /proc/version
- 系统核心功能: /proc/sys/kernel
问题来啦,如果我有个新的硬件,偏偏我的操作系统不支持,该怎么办?很简单啊!
- 重新编译核心,并加入最新的硬件驱动程序原始码;
- 将该硬件的驱动程序编译成为模块,在启动时加载该模块
上面第一点还很好理解,反正就是重新编译核心就是了。不过,核心编译很不容易啊! 我们会在后续章节约略介绍核心编译的整个程序。比较有趣的则是将该硬件的驱动程序编译成为模块啦! 关於编译的方法,可以参考后续的第二十二章、原始码与 tarball的介绍。 我们这个章节仅是说明一下,如果想要加载一个已经存在的模块时,该如何是好?
核心编译要点
- 其实核心就是系统上面的一个文件而已,这个文件包含了驱动主机各项硬件的侦测程序与驱动模块;
- 上述的核心模块放置於:/lib/modules/$(uname -r)/kernel/
- 『驱动程序开发』的工作上面来说,应该是属於硬件发展厂商的问题
- 一般的使用者,由於系统已经将核心编译的相当的适合一般使用者使用了,因此一般入门的使用者,基本上,不太需要编译核心
- 编译核心的一般目的:新功能的需求、原本的核心太过臃肿、与硬件搭配的稳定性、其他需求(如嵌入式系统)
- 编译核心前,最好先了解到您主机的硬件,以及主机的用途,才能选择好核心功能;
- 编译前若想要保持核心原始码的干净,可使用 make mrproper 来清除缓存档与配置档;
- 挑选核心功能与模块可用 make 配合:menuconfig, oldconfig, xconfig, gconfig 等等
- 核心功能挑选完毕后,一般常见的编译过程为:make bzImage, make modules
- 模块编译成功后的安装方式为: make modules_install
- 核心的安装过程中,需要移动 bzImage 文件、创建 initrd 文件、编辑 /boot/grub/menu.lst 等动作;
- 我们可以自行由硬件开发商之官网下载驱动程序来自行编译核心模块!