简单介绍一下什么是内核?
我们的应用是跑在服务器上的,不同的服务器的有不同的操作系统,最常见的是linux系统,windows系统,macOS系统,而操作系统最核心的功能就是内核提供的,内核就相当于服务器的心脏,没有了内核操作系统就工作不了了。
内核是操作系统的核心部分,负责管理计算机的硬件资源并提供基本的系统服务。
它是一个运行在特权模式下的软件,直接访问计算机的硬件,并提供了一个抽象层,使应用程序能够与硬件交互而不必关心底层硬件的具体细节。
以下是内核的主要职责和功能:
什么是内核模块?
内核模块是 Linux 内核的一部分,它是一种动态加载到运行中内核的代码。
这些模块允许系统管理员在不重新启动操作系统的情况下添加或移除功能。
内核模块可以提供新的设备驱动程序、文件系统支持、网络协议等。
比如你增加了一种设备的驱动,不需要重新编译内核,只要增加新的内核驱动模块即可。
内核模块允许在运行时动态加载和卸载,从而扩展或缩减操作系统的功能。
这样的设计使得 Linux 内核可以更加灵活和可配置,无需重新编译整个内核就能够引入新的功能或者去掉不需要的功能。
通过加载适当的内核模块,用户或者系统管理员可以:
这种模块化的设计使得 Linux 内核非常灵活,适应了各种硬件和应用场景的需求。
当你想要安装、卸载或使用一个内核模块时,通常需要编写相应的模块代码,并使用一些命令来进行操作。
下面是一个简单的示例,演示了如何创建、编译、安装、卸载和使用一个简单的内核模块。
1. 编写一个简单的内核模块:
创建一个名为 hello_module.c
的文件,内容如下:
// hello_module.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple kernel module");
static int __init hello_init(void) {
printk(KERN_INFO "Hello, this is your kernel module!n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye, kernel module!n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile文件
注意:在 Makefile
文件中,每个命令行都应该以一个制表符(Tab)作为开头,确保 Makefile
文件中的 all
和 clean
目标的命令行开头都是以 Tab 键开始的。
obj-m += hello_module.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
2. 编译内核模块:
使用以下命令编译内核模块:
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
3. 安装内核模块:
使用以下命令将模块安装到内核中:
sudo insmod hello_module.ko
4. 查看内核日志:
使用以下命令查看内核日志,确认模块已经加载:
dmesg | tail
$ sudo dmesg | tail
[3648038.384947] VFIO - User Level meta-driver version: 0.3
[4172445.177772] hello_module: loading out-of-tree module taints kernel.
[4172445.177883] hello_module: module verification failed: signature and/or required key missing - tainting kernel
[4172445.178629] Hello, this is your kernel module!
5. 卸载内核模块:
使用以下命令卸载已加载的模块:
sudo rmmod hello_module
6. 再次查看内核日志:
使用以下命令查看内核日志,确认模块已经卸载:
dmesg | tail
$ sudo dmesg | tail
[3648038.384947] VFIO - User Level meta-driver version: 0.3
[4172445.177772] hello_module: loading out-of-tree module taints kernel.
[4172445.177883] hello_module: module verification failed: signature and/or required key missing - tainting kernel
[4172445.178629] Hello, this is your kernel module!
[4172962.943603] Goodbye, kernel module!