#include <linux/init.h> #include <linux/module.h> static int __init hello_init(void) { printk(KERN_EMERG "ha"); return 0; } static void hello_exit(void) { printk("le"); } module_init(hello_init); module_exit(hello_exit);
__init 表示初始化程序段 ,運行完後,系統就會回收內存空間linux
Makefile 文件shell
ifneq ($(KERNELRELEASE),) obj-m := hello.o else KDIR := /lib/modules/2.6.31-14-generic/build all : make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.c *.symvers endif
編譯模塊 #make 函數
產生hell0.koui
添加hello 模塊 # insmod hello.kospa
查看hello 模塊 #lsmod 調試
刪除hello 模塊 #rmmod hellocode
注意:模塊操做以root身份運行事件
MODULE_PARAM(name(名稱),type(類型),perm(訪問權限))內存
type常見值:bool int charp(字符串)字符串
如int a = 1;
char *st;
module_param(a,int,S_IRUGO);
module_param(st,charp,S_IRUGO);
#include <linux/init.h> #include <linux/module.h> static char *name = "chen"; static int age = 30; module_param(age, int, S_IRUGO); module_param(name, charp, S_IRUGO); static int hello_init(void) { printk(KERN_EMERG "name:%s\n",name); printk(KERN_EMERG "age:%d\n",age); return 0; } static void hello_exit(void) { printk("le"); } module_init(hello_init); module_exit(hello_exit);
控制檯優先級 決定模塊裏的printk()可否打印出來
vi /proc/sys/kernel/printk 能夠查看 級別 控制檯 默認級別 最小級別
#define KERN_EMERG 0/*緊急事件消息,系統崩潰以前提示,表示系統不可用*/ #define KERN_ALERT 1/*報告消息,表示必須當即採起措施*/ #define KERN_CRIT 2/*臨界條件,一般涉及嚴重的硬件或軟件操做失敗*/ #define KERN_ERR 3/*錯誤條件,驅動程序經常使用KERN_ERR來報告硬件的錯誤*/ #define KERN_WARNING 4/*警告條件,對可能出現問題的狀況進行警告*/ #define KERN_NOTICE 5/*正常但又重要的條件,用於提醒*/ #define KERN_INFO 6/*提示信息,如驅動程序啓動時,打印硬件信息*/ #define KERN_DEBUG 7/*調試級別的消息*/
默認級別與printk級別決定 是否能夠顯示出來(純字符模式等級低,能夠到純字符模式,查看打印效果,或者修改上面的問件)
ifneq ($(KERNELRELEASE),) obj-m := hello.o hello-objs := main.o add.o else KDIR := /lib/modules/2.6.31-14-generic/build all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.c *.symvers endif
// main.c #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("chen"); MODULE_DESCRIPTION("a simple module"); extern int add(int a,int b); static int hello_init() { printk(KERN_EMERG "hello \n"); add(1,2); return 0; } static void hello_exit() { printk(KERN_EMERG "ok\n"); } module_init(hello_init); module_exit(hello_exit);
// add.c int add(int a,int b) { return a+b; }
// 模塊 add.ko #include <linux/init.h> #include <linux/module.h> int add(int a,int b) { return a+b; } static int __init sym_init() { return 0; } static void __exit sym_exit() { } EXPORT_SYMBOL(add); //模塊之間傳遞函數 module_init(sym_init); module_exit(sym_exit);
// 模塊 hello.ko #include <linux/module.h> #include <linux/init.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("chen"); MODULE_DESCRIPTION("a simple module"); extern int add(int a,int b); static int __init hello_init() { printk(KERN_EMERG "hello \n"); int sum = add(1,2); return 0; } static void __exit hello_exit() { printk(KERN_EMERG "ok\n"); } module_init(hello_init); module_exit(hello_exit);
ifneq ($(KERNELRELEASE),) obj-m := hello.o ;這裏分別寫add.o和hello.o編譯兩個模塊 else KDIR := /lib/modules/2.6.31-14-generic/build all: make -C $(KDIR) M=$(PWD) modules clean: rm -f *.ko *.o *.mod.c *.symvers endif