(1)内核模块实现的几个步骤:
新建模块目录
用编辑器 (vi) 编辑源文件
用编辑器编辑 Makefile
编译模块
内核模块的加载
#insmod module_name
内核模块的卸载
#rmmod module_name
或者
#modprobe -r module_name
查看系统已经加载的模块
#lsmod
查看系统已经加载的模块信息
- #modinfo
- 1 //hello.c 2 #include // for module_init() 3 #include // must be include 4 #include // for printk() 5 6 static int hello_init(void) {
- // 模块入口函数 7 printk("Hello world\n"); 8 return 0; 9
- } 10 11 static void hello_exit(void) {
- // 模块退出函数 12 printk("Hello module exit\n"); 13
- } 14 15 module_init(hello_init); 16 module_exit(hello_exit); 17 MODULE_LICENSE("GPL"); 18 MODULE_AUTHOR("kuy"); 19 MODULE_DESCRIPTION("hello");
说明:
模块入口函数为 hello_init(), 由 module_init()宏指定, 在模块被加载的时候被调用向系统注册.
入口函数的返回值: 0 表示成功, 非 0 表示失败.
模块的退出函数为 hello_exit(), 由 module_exit()宏指定, 在模块被卸载时被调用向系统注销, 主要来完成资源的清理工作. 它被调用完毕后, 就模块就被内核清除了.
一个模块最少需要有入口和退出函数.
printk( )函数
printk 函数在 Linux 内核中定义并且对模块可用, 为内核提供日志功能, 记录内核信息或用来给出警告. 与标准 C 库函数 printf 的行为相似.
每个 printk()声明都会带一个优先级. 内核总共定义了八个优先级的宏, 在 Linux/kernel.h 中定义. 若不指明优先级, DEFAULT_MESSAGE_LOGLEVEL 这个默认优先级将被采用.
信息添加到文件 / var/log/kern.log, 可直接查看, 或者用命令 dmesg 查看. 在 X-Windows 下的终端 insmod 一个模块, 日志信息只会记录在日志文件中, 而不在终端打印.
内核模块的 Makefile
- obj-m := hello.o
- KERNELDIR := /lib/modules/$(shell uname -r)/build
- PWD := $(shell pwd)
- modules:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
- modules_install:
- $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
- clean:
- rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
- (2)
来源: http://www.bubuko.com/infodetail-3108736.html