深入了解Linux内核:类型、模块操作与内核重建
立即解锁
发布时间: 2025-08-25 00:10:36 阅读量: 1 订阅数: 9 

# 深入了解 Linux 内核:类型、模块操作与内核重建
## 1. Linux 内核概述
内核是操作系统的核心,负责为硬件和软件分配和管理系统资源。它就像人类的大脑控制肌肉系统一样,向操作系统的其他部分发出命令,使其正常运行。内核通过跟踪设备驱动程序与硬件进行通信,同时也为用户软件分配计算机资源。
## 2. Linux 内核的发展历程
Linux 内核的开发始于 1991 年,由芬兰赫尔辛基大学的研究生 Linus Torvalds 发起。最初,这只是他的一个爱好,他想要一个类似于 Minix(类 Unix 系统)的操作系统。后来,他决定让自己的软件不仅具备与 Minix 相同的功能,还要更胜一筹。当内核版本达到 0.02 时,他使用 GNU 公共许可证将源代码发布到 Minix 社区(comp.os.minix)。由于源代码是免费提供的,社区开始为内核源代码添加功能和代码,这也吸引了各种用户组织和商业组织的支持,推动了内核的进一步发展。你可以在 http://www.kernel.org 轻松获取 Linux 内核源代码。
## 3. Linux 内核的类型
内核实际上是一个小的二进制文件,位于 /boot 目录中。你可以在 /boot 目录中拥有多个内核,并根据每个内核使用库和处理进程的方式选择要使用的内核。Linux 中使用的两种内核类型是模块化内核和整体式内核,它们的特点对比如下:
| 内核类型 | 特点 | 适用场景 |
| ---- | ---- | ---- |
| 模块化内核(微内核) | 使用称为模块的软件库,这些库可以在运行时加载和卸载。库位于指定目录,内核在需要时可以引用。内核二进制文件较小,初学者更容易构建和维护。 | 需要图形、多媒体和办公软件等,需要使用不能同时全部装入内存的库时。 |
| 整体式内核 | 不使用模块,经过精心构建,运行时比模块化内核更快。因为省略了模块化内核必需的加载和卸载模块步骤。也可以根据需要加载模块,但通常只将所需库组合在一起。 | 专注于核心服务,如仅提供名称服务时。 |
## 4. 内核模块
大多数安装的 Linux 系统使用模块化内核,例如 CentOS。你可以通过查看 /lib/modules 目录来验证是否使用了模块,该目录中会有一个与加载的 Linux 内核同名的目录,如 2.6.18 - 92.el5,该目录包含 Linux 内核可以使用的所有附加库,其中一些在系统启动时已经加载。
另外,你可以使用 shell 命令 `lsmod`(“list modules”的缩写)查看内存中的模块,该命令会显示系统中所有已加载的模块,且不需要任何参数。`lsmod` 命令的输出分为三列:
- **Module**:显示已加载模块的名称。
- **Size**:显示模块的大小(以字节为单位)。
- **Used By**:显示哪些其他模块使用了该模块以及使用该模块的模块数量。如果内核本身直接使用某个模块,则该模块不会包含在输出中。
例如,蓝牙模块被五个模块使用,其中一些是 hidp、rfcomm 和 l2cap 模块。当你要重新编译内核时,需要使用 `lsmod` 命令生成的列表,因为你需要知道新内核需要加载哪些模块。
## 5. 加载内核模块
在运行的 Linux 系统中,有三种方法可以加载内核模块:
### 5.1 insmod 命令
`insmod` 命令用于在运行的内核中加载 Linux 模块,其语法如下:
```bash
insmod filename
```
其中,`filename` 是模块的文件名。加载到内存中的模块来自运行内核的 /lib/modules 目录中的物理文件,这些文件的扩展名始终为 .ko。例如,要加载 ide - cd 模块,可以使用以下命令:
```bash
insmod /lib/modules/2.6.18-92.el5/kernel/drivers/ide/ide-cd.ko
```
使用 `insmod` 加载模块时,如果模块文件不在当前目录中,则必须包含模块文件的路径。如果尝试使用 `insmod` 加载依赖于其他模块的模块,系统会提示你先加载其他模块。如果要加载的模块数量较少,这可能没问题,但如果数量较多(例如超过五个),就会比较麻烦。这时可以使用 `modprobe` 命令。
### 5.2 modprobe 命令
`modprobe` 命令可以自动加载你要加载的模块的依赖模块,它会在当前运行的 Linux 内核模块目录中查找模块及其依赖模块。其语法如下:
```bash
modprobe options modulename
```
其中,`modulename` 是你要加载的模块的名称。与 `insmod` 命令不同,`modprobe` 不需要指定模块的文件名。你可以为 `modprobe` 命令添加选项,例如 `-v` 标志,它会在命令运行时显示消息。例如,要使用 `modprobe` 加载 ide - cd 模块,可以输入以下命令:
```bash
modprobe ide-cd
```
### 5.3 modprobe.conf 文件
`modprobe.conf` 文件是 `modprobe` 命令的配置文件,位于 /etc 目录中。通过该文件,你可以为要加载的模块添加选项,甚至为要加载的模块提供别名,以便更方便地访问。文件的每一行使用一个命令来加载你想要的模块,无论是为模块提供别名还是在加载时添加选项。以井号(#)开头的行被视为注释,`modprobe` 会忽略这些行。
除了 `modprobe.conf` 文件,`modprobe` 命令在加载模块时还会读取 /etc/modprobe.d 目录中的文件。该目录中的每个文件都与相应的模块同名,包含在加载或卸载该模块时要运行的 `modprobe` 命令。例如,在我的设置中,floppy - pnp 文件包含在 `modprobe` 加载或卸载 floppy -
0
0
复制全文
相关推荐









