放个编译上面模块的 Makefile
obj-m := hello.o all: make -C /lib/modules/$(shell uname -r )/build M=$(shell pwd) modules clean: make -C /lib/modules/$(shell uname -r )/build M=$(shell pwd) clean |
给 Makefile 放到上面 hello.c 的相同的目录中(如果上面写的模块代码叫 hello.c 的话)。然后使用 make 就能编译了。
insmod lsmod rmmod
调用 insmod 时会给需要的模块加载进内核,会给 ko 的文件以目标代码加载。装载时会调用 module_init 指定的函数。退出也调用相应的 module_exit.
lsmod 可以显示你写的模块,其实是读 /proc/modules 。接下来我写写怎么样自己通过内核来建 proc 文件。
模块加载参数
如果在模块加载时,想指定参数,也提供了相应的头文件
#include <linux/moduleparam.h> static int test; module_param(test, int , 0644); |
这样以后,直接在内核模块内使用 test 的变量就行了。
模块的信息
在程序中可以为模块加一些描述,发行版权声明,和作者。
MODULE_LICENSE( "GPL" ); MODULE_DESCRIPTION( "Test" ); MODULE_AUTHOR( "xxx" ); |
模块的符号导出
在 Perl 中,模块是可以导出变量和方法到其它的模块中的。在 Linux 内核中也有这样的方法。
EXPORT_SYMBOL(name); EXPORT_SYMBOL_GPL(name); |
这二个可以导出指定的全局变量,也可以是方法。这个要加载 的头文件,不要忘记了。
其它的模块要使用这个,直接使用 extern void name(void); 就可以使用了。这些导出的函数只能内核和内核模块使用。不能用户调用,可以由 /proc/kallsyms 来查看导出的变量和方法
实例
写个内核模块,通过 proc 可以见到一些信息,通过 proc 的读和写的功能。来实现设置和读取信息。
proc 介绍
proc 是一个非常方便的用来动态的向 Linux 内核加入和禁用代码的一个方法。
proc/sys 中是用来配置内核的参数,可以通过 sysctl -w key=value
象普通文件可以支持 open,read,write,close
原文转自:http://blogread.cn/it/article/4630