还记得我们在
第十章的
BASH shell
提到过:计算机真正在工作的东西其实是『
硬件
』,
例如数值运
算要使用到
CPU
、数据储存要使用到硬盘、图形显示会用到显示适配器、音乐发声要有音效芯片、
连½
Internet
可能需要网络卡等等。那么如何控制这些硬件呢?那就是核心的工作了!也就是说,
你所希望计算机帮你达成的各项工作,
都需要透过『
核心
』的帮助才行!当然啰,如果你想要达成
的工作是核心所没有提供的,
那么你自然就没有办法透过核心来控制计算机使他工作啰!
举例来说,如果你想要有某个网络功能
(
例如核心防火墙机制
)
,但是你的核心偏偏忘记加½去这项
功能,
那么不论你如何『卖力』的设定该网络套件,很抱歉!不来电!换句话说,
你想要让计算机
½行的工作,都必须要『核心有支持』才可以
!这个标准不论在
Windows
Linux
这几个操作系
统上都相同!如果有一个人开发出来一个『全新的硬件』,目前的核心不论
Windows
Linux
不支持,那么不论你用什么系统,哈哈!这个硬件都是英雄无用武之地啦!
那么是否了½了『核心』
的重要了呢?所以我们才需要来了½一下如何编译我们的核心啦!
那么核心到底是什么啊?
其实核心就是系统上面的一个文件而已,
这个文件包含了驱动主机各项硬
件的侦测程序与驱动模块
。在
第十九章的开机流程分析
中,我们也提到这个文件被读入主存储器的时
机,
当系统读完
BIOS
并加载
MBR
内的开机管理程序后,就能够加载核心到内存当中。然后核心
开始侦测硬件,
挂载根目录并取得核心模块来驱动所有的硬件,之后呼½
systemd
就能够依序启动
所有系统所需要的服务了!
这个核心文件通常被放置成
/boot/vmlinuz-xxx
,不过也不见得,
因为一部主机上面可以拥有多个核
心文件,只是开机的时候½能选择一个来加载而已
甚至我们也可以在一个
distribution
上面放置
多个核心,然后以这些核心来做成多重引导呢!
.
核心模块
(kernel module)
的用途
既然核心文件都已经包含了硬件侦测与驱动模块,那么什么是核心模块啊?要注意的是,
现在的硬
件更新速度太快了,如果我的核心比½旧,但我换了新的硬件,那么,这个核心肯定无法支持!
么办?重新拿一个新的核心来处理吗?开玩笑~核心的编译过程可是很麻烦的~
所以啰,为了这个缘故,我们的
Linux
很早之前就已经开始使用所谓的模块化设定了!
亦即是½一
些不常用的类似驱动程序的咚咚独立出核心,编译成为模块,然后,
核心可以在系统正常运作的过
程当中加载这个模块到核心的支持。如此一来,
我在不需要更动核心的前提之下,只要编译出适当
的核心模块,并且加载他,呵呵!我的
Linux
就可以使用这个硬件啦!简单又方便!
那我的模块放在哪里啊?可恶!怎么会问这个傻问题呢?当然一定要知道的啦!就是
/lib/modules/$(uname -r)/kernel/
当中啦!
.
自制核心
-
核心编译
刚刚上面谈到的核心其实是一个文件,那么这个文件怎么来的?当然是透过原始码
(source code)
译而成的啊!因为核心是直½被读入到主存储器当中的,所以当然要½他编译成为系统可以认识的数
据才行!也就是说,
我们必须要取得核心的原始码,然后利用
第二十一章
Tarball
安装方式提到的
编译概念来达成核心的编译才行啊!
(
这也是本章的重点啊!
^_^)
.
关于驱动程序
-
是厂商的责任还是核心的责任?