内核是操作系统中促进 硬件 和 软件 组件之间交互的部分。在大多数系统中,它在启动时被加载,位于 引导加载程序 之后,负责处理 I/O 请求以及键盘、显示器、网络适配器和扬声器等外围设备。通常,内核负责 内存管理、进程管理、设备管理、系统调用 和 安全。
应用程序使用 系统调用 机制来请求操作系统的服务,并且在大多数情况下,这个请求通过操作系统提供的库传递给内核,以调用相关内核函数。当内核执行这些低级任务时,它驻留在内存的一个单独部分,称为 受保护的内核空间,该空间不能被应用程序和系统的其他部分访问。相反,像浏览器、文本编辑器、窗口管理器或音频/视频播放器这样的应用程序使用内存的另一个独立区域,即 用户空间。这种分离防止了用户数据和内核数据相互干扰,导致不稳定和速度变慢,同时也防止了有故障的应用程序崩溃整个操作系统。
由于管理系统调用和资源的方式不同,存在不同的内核设计。例如,宏内核 将所有操作系统指令运行在相同的地址空间中 以追求速度,而 微内核 为用户和内核服务使用不同的空间 以实现模块化。除此之外,还有 混合内核、纳米内核 和 外核。混合内核架构基于结合微内核和宏内核的特点。
Linux 内核 是开源的、宏内核且类 Unix 的操作系统内核,用于 Linux 发行版、各种嵌入式系统(如路由器)以及所有基于 Android 的系统。林纳斯·托瓦兹 在 1991 年构思并创建了 Linux 内核,至今仍有成千上万的开发者在持续开发它。它是 自由及开源软件 的一个突出例子,也被用于其他自由软件项目,特别是 GNU 操作系统。 尽管基于 Linux 的操作系统主导了大部分计算领域,但它仍然带有一些设计缺陷,这些缺陷在 Linux 早期曾引发大量争论。例如,它拥有 最大的占用空间 和 最高的复杂性,超过了其他类型的内核。但这是宏内核固有的设计特性。这类设计问题促使开发者向 Linux 内核添加了其他内核所不具备的新功能和机制。
与标准的宏内核不同,Linux 内核也是 模块化的,接受 可加载内核模块 (LKM),通常用于支持新的 硬件(作为设备驱动程序)和/或 文件系统,或添加 系统调用。由于 LKM 可以在 运行时 加载和卸载到系统,它们具有无需重启和重新编译即可扩展内核的优势。因此,模块提供的内核功能不会在不被使用时驻留内存,相关的模块可以被卸载以释放内存和其他资源。
可加载内核模块位于 Linux 中的 /lib/modules,扩展名为 .ko(内核对象)。lsmod 命令可用于列出已加载的内核模块,而 modprobe 或 insmod/rmmod 用于加载或卸载内核模块。insmod/rmmod 用于独立于 modprobe 且无需安装到 /lib/modules/$(uname -r) 的模块。
下面是一个简单的 Linux 内核模块示例,它在加载和卸载时打印一条消息。使用 Makefile 构建和安装该 模块 的步骤如下所示。``` make # build sudo make install # install sudo modprobe lkm_example # load sudo modprobe -r lkm_example # unload
下面的 [dmesg](https://linux.die.net/man/8/dmesg) 命令用于获取内核的消息缓冲区。```
[16994.295552] [+] Example kernel module loaded.
[16996.325674] [-] Example kernel module unloaded.
kmon 提供了一个基于文本的用户界面,用于管理 Linux 内核模块并监控内核活动。所谓管理,是指加载、卸载、黑名单化以及显示模块信息。内核模块的这些更新、有关硬件的日志以及其他内核消息,可以通过 kmon 的实时活动监视器进行跟踪。由于在 Linux 中执行这些任务需要使用不同的工具,例如 dmesg 和 kmod,kmon 旨在将它们集中到一个终端窗口中,尽可能简化使用过程,同时保持功能完整。
kmon 使用 Rust 编写,并借助 Ratatui 和 termion 库来实现其基于文本的用户界面。
kmon 可以通过 Cargo 从 crates.io 安装,前提是已安装 Rust。``` cargo install kmon
最低支持的Rust版本(MSRV)为`1.74.1`。
### Arch Linux
**kmon**可以从Arch Linux的[官方仓库](https://www.archlinux.org/packages/extra/x86_64/kmon/)安装。```
pacman -S kmon
此外,还有一个开发包位于AUR上。使用你喜欢的AUR helper进行安装。例如,``` paru -S kmon-git
### Nixpkgs
**kmon** 可以使用 [Nix 包管理器](https://nixos.org/nix/) 从 `nixpkgs-unstable` 频道安装。```
nix-channel --add https://nixos.org/channels/nixpkgs-unstable
nix-channel --update nixpkgs
nix-env -iA nixpkgs.kmon
在 NixOS 上:``` nix-channel --add https://nixos.org/channels/nixos-unstable nix-channel --update nixos nix-env -iA nixos.kmon
### Alpine Linux
**kmon** 可用于 [Alpine Edge](https://pkgs.alpinelinux.org/packages?name=kmon&branch=edge)。在启用 [社区仓库](https://wiki.alpinelinux.org/wiki/Repositories) 后,可通过 [apk](https://wiki.alpinelinux.org/wiki/Alpine_Package_Keeper) 安装。```
apk add kmon
```
docker run -it --cap-add syslog orhunp/kmon:tagname
#### 构建```
docker build -t kmon .
docker run -it --cap-add syslog kmon
### 手册