linux提供了module机制,能够动态的加载内核模块。本实验在centOS7下执行。
hello kernel代码
hello.c
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
static int __init hello_init(void)
{
printk("<1>Hello Kernel!\n"); /*立即输出信息*/
return 0;
}
static void __exit hello_cleanup(void)
{
printk("<1>See you,Kernel!\n");
}
module_init(hello_init); /*进入内核的时候,调用hello_init */
module_exit(hello_cleanup); /*离开内核的时候,调用hello_cleanup */
MODULE_LICENSE("GPL"); /*协议*/
Makefile
obj-m += hello.o #由此目标文件生成模块
CURRENT_PATH := $(shell pwd) #当前所在的路径
LINUX_KERNEL := $(shell uname -r) #内核的版本号
#内核代码所在的路径
LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL)
#编译
all:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
#清除编译生成的文件
clean:
make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
执行make
[root@controller hello]# make
make -C /usr/src/kernels/3.10.0-514.10.2.el7.x86_64 M=/usr/src/kernels/3.10.0-514.10.2.el7.x86_64/hello modules
make[1]: Entering directory `/usr/src/kernels/3.10.0-514.10.2.el7.x86_64'
CC [M] /usr/src/kernels/3.10.0-514.10.2.el7.x86_64/hello/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC /usr/src/kernels/3.10.0-514.10.2.el7.x86_64/hello/hello.mod.o
LD [M] /usr/src/kernels/3.10.0-514.10.2.el7.x86_64/hello/hello.ko
make[1]: Leaving directory `/usr/src/kernels/3.10.0-514.10.2.el7.x86_64'
执行insmod加载内核模块
sudo insmod hello.ko
lsmod 可以查看到自己的模块
lsmod | grep hello
dmesg可以看到打印的log
[root@controller hello]# dmesg | tail -1
[88012.521835] <1>Hello Kernel!
执行rmmod卸载内核模块
sudo rmmod hello.ko
dmesg可以看到打印的log
[root@controller hello]# dmesg | tail -1
[88108.264491] <1>See you,Kernel!