linux驱动开发之Hello程序
- 2019 年 10 月 5 日
- 筆記
linux驱动开发之Hello程序
0.说在前面
1.HelloWord
驱动模块组成
驱动模块组成 |
---|
头文件(必选) |
模块参数(可选) |
模块功能函数(可选) |
其他(可选) |
模块加载函数(必选) |
模块卸载函数(必选) |
模块许可声明(必选) |
引入头文件
#include <linux/init.h> /* 定义了一些相关的宏 */ #include <linux/module.h> /* 定义了模块需要的 */
模块许可声明
MODULE_LICENSE("Dual BSD/GPL"); //BSD/GPL双重许可权 MODULE_LICENSE("Dual MPL/GPL"); //MPL/GPL双重许可权 MODULE_LICENSE("GPL"); //任一版本的GNU公共许可权 MODULE_LICENSE("GPL v2"); //GPL版本2许可权 MODULE_LICENSE("GPL and additional rights"); //GPL及其附加许可权 MODULE_LICENSE("Proprietary"); //专有许可权
helloworld模块编写
#include <linux/init.h> /* 定义了一些相关的宏 */ #include <linux/module.h> /* 定义了模块需要的 */ MODULE_LICENSE("Dual BSD/GPL"); /* 指定许可证为 Dual BSD/GPL */ 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); /* 指定模块卸载函数 */
2.Makefile
编写Makefile
# 利用其内建语句 ifneq ($(KERNELRELEASE), ) 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 else obj-m := hello.o endif
核心代码解释
解释下面这行代码:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
make的语法是Make -C 内核路径 M=模块路径 modules,该语句会执行内核模块的编译!
else后面语句是将hello.o编译为hello.ko模块!如果要编译为其他名字模块,只需要修改hello名字即可!
3.编译输出
命令执行
由于printk输出直接在message中,而不是终端直接输出,得查看信息,通过下面图片中命令查看!

