1,源代码如下所示:
1 /* 2 * a simple kernel module: hello 3 * 4 * Copyright (C) 2014 Barry Song (baohua@kernel.org) 5 * 6 * Licensed under GPLv2 or later. 7 */ 8 9 #include <linux/init.h> 10 #include <linux/module.h> 11 12 static int __init hello_init(void) 13 { 14 printk(KERN_INFO "Hello World enter\n"); 15 return 0; 16 } 17 module_init(hello_init); 18 19 static void __exit hello_exit(void) 20 { 21 printk(KERN_INFO "Hello World exit\n"); 22 } 23 module_exit(hello_exit); 24 25 MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); 26 MODULE_LICENSE("GPL v2"); 27 MODULE_DESCRIPTION("A simple Hello World Module"); 28 MODULE_ALIAS("a simplest module");
1.1 MODULE_LICENSE----(16条消息) linux 内核模块声明 MODULE_LICENSE_whatday的博客-CSDN博客
编写模块必须先包含下面两句:
//这个头文件包含了许多符号与函数的定义,这些符号与函数多与加载模块有关 #include <linux/module.h> //这个头文件包含了你的模块初始化与清除的函数 #include <linux/init.h>
另外,如果你的模块需要用到参数传递,那么你可能就要包含 moduleparam.h 这个头文件了。
再者,模块里常包含一些描述性声明,如:
1 MODULE_LICENSE("GPL"); // "GPL" 是指明了 这是GNU General Public License的任意版本 2 // “GPL v2” 是指明 这仅声明为GPL的第二版本 3 // "GPL and addtional" 4 // "Dual BSD/GPL" 5 // "Dual MPL/GPL" 6 // "Proprietary" 私有的 7 // 除非你的模块显式地声明一个开源版本,否则内核会默认你这是一个私有的模块(Proprietary)。 8 9 MODULE_AUTHOR // 声明作者 10 MODULE_DESCRIPTION // 对这个模块作一个简单的描述,这个描述是"human-readable"的 11 MODULE_VERSION // 这个模块的版本 12 MODULE_ALIAS // 这个模块的别名 13 MODULE_DEVICE_TABLE // 告诉用户空间这个模块支持什么样的设备
1.2 makefile---执行生成hello.ko
KVERS = $(shell uname -r) # Kernel modules obj-m += hello.o # Specify flags for the module compilation. #EXTRA_CFLAGS=-g -O0 build: kernel_modules kernel_modules: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules clean: make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
会在 /lib/modules/4.0.0-040000-generic/build 目录下执行该目录下的makefile,如下图所示:
2,装载驱动
2.1 insmod ./hello.ko
2.2 modprobe ./hello.ko
modprobe在加载时会将其依赖module也加载;
3,查看驱动
3.1 lsmod | grep hello
3.2 cat /proc/modules | grep hello ,结果如下所示:
hello 16384 0 - Live 0xf86ce000 (OE)
3.3 加载modle之后,会在 /sys/module/ 目录下生成相应的module文件夹;这里生成的是 /sys/module/hello ,如下所示:
baohua@baohua-VirtualBox:/sys/module/hello$ tree -a . ├── coresize ├── holders ├── initsize ├── initstate ├── notes │ └── .note.gnu.build-id ├── refcnt ├── sections │ ├── .exit.text │ ├── .gnu.linkonce.this_module │ ├── .init.text │ ├── .note.gnu.build-id │ ├── .rodata.str1.1 │ ├── .strtab │ └── .symtab ├── srcversion ├── taint └── uevent 3 directories, 15 files
3.4 modinfo hello.ko 查看模块的信息,如下所示:
root@baohua-VirtualBox:/home/baohua/develop/training/kernel/drivers/hello# modinfo hello.ko filename: /home/baohua/develop/training/kernel/drivers/hello/hello.ko alias: a simplest module description: A simple Hello World Module license: GPL v2 author: Barry Song <21cnbao@gmail.com> srcversion: 56C45B019D5D953B115F1D4 depends: vermagic: 4.0.0-040000-generic SMP mod_unload modversions 686
4,卸载驱动
4.1 rmmod hello
4.2 modprobe -r filename 将依赖文件同时卸载掉