Linux 驱动程序:实现Hello World模块 gaunthan Posted on Jul 11 2016 ? Linux Driver ? > 本文将介绍如何实现一个最简单的Linux驱动程序Hello World。 ## 编译内核模块的条件 正确的编译内核模块,需要满足以下条件: 1. 使用正确版本的编译工具、模块工具和其他必要的工具。不同版本的内核需要不同版本的编译工具。 2. 有一份与系统目前内核版本相同的内核源码。 3. 该内核源码至少编译过一次,也就是执行过`make`命令。 ## 编写Hello World模块 一个简单的模块源代码如下,该模块将在加载时输出"Hello, world",在卸载时输出"GoodBye, cruel world!"。 ```c /* hello.c */ #include <linux/init.h> /* 定义了一些相关的宏 */ #include <linux/module.h> /* 定义了模块需要的 */ static int hello_init(void) { printk(KERN_ALERT "Hello, world!\n"); /* 打印 Hello, world! */ return 0; } static void hello_exit(void) { printk(KERN_ALERT "GoodBye, cruel world!\n"); /* 打印 GoodBye, cruel world! */ } module_init(hello_init); /* 指定模块加载函数 */ module_exit(hello_exit); /* 指定模块卸载函数 */ MODULE_LECENSE("Dual BSD/GPL"); /* 指定许可证为 Dual BSD/GPL */ MODULE_AUTHOR("newbie"); MODULE_DESCRIPTION("A Hellom, world Module"); ``` ## 编写Makefile 编译Hello World模块需要编写一个Makefile文件,内容如下: ```makefile # 如果已定义KERNELRELEASE,则说明是从内核构造系统调用的, # 因此可利用其内建语句 ifneq ($(KERNELRELEASE), ) obj-m := hello.o # module-objs := file1.o file2.o 如果模块依赖多个源文件,请添加这一句并相应地修改目标文件列表 # 否则,是直接从命令行调用的, # 这时要调用内核构造系统 else 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 endif ``` ## 编译Hello World模块 在模块路径下,执行命令`make`即可。 ## 运行模块 ### 加载模块 执行命令`insmod hello.ko`加载模块。注意`insmod`命令不会自动加载依赖项,如果你编写的驱动模块依赖了其他模块,则可以使用`modprobe`命令自动加载依赖项。 ### 卸载模块 执行命令`rmmod hello`卸载模块。 ### 验证输出 若执行`insmod`或`rmmod`命令时,控制台无消息输出,则可能是因为当从一个终端模拟器或者窗口系统运行`insmod`和`rmmod`,消息输出到了某个系统日志文件中。例如`/var/log/messages`。在Ubuntu下为`/var/log/syslog`。 **CentOS 6.7 虚拟机实测运行结果** 执行命令`tail /var/log/messages`,可见下文:  赏 Wechat Pay Alipay Linux 驱动模块的组成 Linux 软件安装依赖关系解决