内核模块编写,编译,加载和卸载过程

1.编写hello.c内核模块

//hello.c

#include

#include

staticint hello_init(void){

printk(KERN_INFO"hello world enter\n");

return0;

}

staticvoid hello_exit(void){

printk(KERN_INFO"hello world exit\n");

}

module_init(hello_init);

module_exit(hello_exit);


MODULE_AUTHOR("MIAOHY");

MODULE_LICENSE("GPL");

MODULE_DESCRIPTION("Asimple hello world module");

MODULE_ALIAS("asimplest module");


2.编写Makefile

ifneq ($(KERNELRELEASE),)

#kbuildsyntax. dependency relationshsip of files and target modules arelisted here.

#mymodule-objs:= file1.o file2.o

obj-m:= hello.o

else

PWD := $(shell pwd)

KVER:= $(shell uname -r)

KDIR:= /lib/modules/$(KVER)/build

all:

$(MAKE) -C $(KDIR) M=$(PWD)

clean:

$(MAKE) -C $(KDIR) M=$(PWD) clean

endif


注意: ifneq后面一定要有一个空格;#(MAKE)之前一定要有TAB。


3.编译

(1)把hello.c和Makefile放入同一个目录。

(2)在命令行中进入hello.c和Makefile所在目录,输入命令:make

这样就编译成功了,在目录下会生成很多文件,其中一个就是*.ko, 这里就是hello.ko


4.加载模块

root下输入:insmod hello.ko

普通用户:sudo insmod hello.ko

这里hello.ko就是执行make后生成的内核模块。

可以通过dmesg命令查看加载后的输出内容。比如查看最后10行的方法是:dmesg | tail -n 10


5.卸载模块

root下输入: rmmod hello

普通用户: sudo rmmod hello


6.清理生成的文件

这步不是必须的,可以根据需要选择执行。如果想重现编译模块,删除上次生成的文件,可以输入命令:make clean

这样就可以执行Makefile中的clean标号后面的清理指令。




你可能感兴趣的:(Linux)