linux中可以以module的形式向linux 内核注入模块,本文举例说明实现的具体方法:
经典的HelloWorld
/*
helloworld.c Kernel module practice.
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_ALERT "I bear a charmed life. \n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Out,out,brief candle! \n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("CHENQIANG");
MODULE_DESCRIPTION("A Hello World linux module test.");
Makefile
MODULE_NAME := helloworld
obj-m := $(MODULE_NAME).o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
@echo "MAKEFLAGS: $(MAKEFLAGS)"
@echo "Makefile target: $(MAKECMDGOALS)"
@echo "CFLAGS: $(CFLAGS)"
$(MAKE) -C $(KERNELDIR) M=$(PWD)
clean:
rm all *.o
意思就是首先将make 的工作目录切换到KERNELDIR,然后执行make,M指定了module 所在的路径。
编译完成后生成hello.ko
在具有root权限的linux服务器上,输入insmod hello.ko,lsmod就能看到hello.ko了。
输入dmesg|tail 就能看到printk 的kernel log:I bear a charmed life.
rmmod hello.ko 就可以移除hello.ko模块了。
modinfo module_name 查看指定的module 相关信息, modprobe module_name 查找插入指定的module.