最简Linux驱动

• Linux头文件位置

– 类似#include <linux/module.h>的头文件,它们是在Linux源码目录下的 include/linux/module.h
• #include <linux/module.h>头文件

– 所有的Linux 代码必须遵循GPL 协议,如果不知道Linux 的GPL 协议,去查 一下资料

– 如果你不声明GPL 协议,你的模块将无法在Linux 中使用的

– MODULE_LICENSE(_license)添加遵循GPL协议,必须的!

– MODULE_AUTHOR(_author)代码作者

• #include <linux/init.h>

– 包含初始化宏定义的头文件,代码中的函数module_init和module_exit在此 文件中

– 入口函数module_init(x)

– 出口函数module_exit(x)
• 新建.c文件

– mini_linux_module.c

扫描二维码关注公众号,回复: 9633744 查看本文章

• module_init(hello_init); – /*初始化函数*/
• module_exit(hello_exit); – /*卸载函数*/

• 声明区

– MODULE_LICENSE("Dual BSD/GPL"); – /*声明是开源的,没有内核版本限制*/ – 必须有
– MODULE_AUTHOR("TOPEET"); – /*声明作者*/ – 可有可无

• static int hello_init(void){

• printk(KERN_EMERG "Hello World enter!\n");

• /*打印信息,KERN_EMERG表示紧急信息*/

• return 0;

• }

• static void hello_exit(void)

• {

• printk(KERN_EMERG "Hello world exit!\n");

• }

驱动模块的编译
• Linux的驱动可以和Linux源码放在一起编译,也可以单独拿出来编译。

– 为了理解整个Linux内核编译过程,可以从学习Linux模块的编译入手
• Makefile文件

– 单独编译驱动需要写一个Makefile文件
• 编写Makefile文件的最好方式是“依葫芦画瓢”

– 以后可能会碰到各种脚本,脚本的语法是学不完的

实验操作

——编译文件
• 拷贝两个文件到虚拟机,执行Make命令,编译生成KO文件

– 在window下写的Makefile文件拷贝到Linux中可能会有点小问题需要修改

– 主要是Tab问题

– all和clean参数后面的必须添加Tab键,否则会报错“*** missing separator. Stop”
• 编译会生成KO文件,KO就是驱动模块

——加载模块和卸载模块
• 开发板运行最小Linux系统

• 使用U盘(或者TF卡),将KO文件拷贝到Linux最小系统

– 最小系统给大家提供,直接烧写即可

• 加载U盘

– 参考使用手册

• 加载模块、查看模块、卸载模块

– insmod加载模块命令

– lsmod查看模块命令

– rmmod卸载模块命令

——无法卸载模块的解决办法
• 是用rmmod卸载模块的时候会弹出错误,如下

– rmmod: can't change directory to '/lib/modules': No such file or directory
• 提示没有'/lib/modules'目录

– 使用命令“#mkdir /lib/modules”,新建一个目录
• 是用rmmod命令仍然会出现如下错误:

– rmmod: can't change directory to '3.0.15': No such file or directory
• 提示没有目录'3.0.15'

– 使用命令“#mkdir /lib/modules/3.0.15”,继续建目录

小结
• linux代码中记得添加GPL协议
• 掌握驱动入口和出口函数的调用(也可以说是宏的调用)
• 对Makefile文件有简单的了解,会仿写
• 掌握加载、查看、卸载模块的命令

发布了37 篇原创文章 · 获赞 0 · 访问量 2384

猜你喜欢

转载自blog.csdn.net/Linux_zhicheng/article/details/100083353