linux驱动(一):linux驱动框架
来源:互联网 发布:数据科学专业课程 编辑:程序博客网 时间:2024/06/11 15:34
编写linux驱动先看一下驱动框架是什么样子的。
驱动编写和应用层编写有什么区别呢?
(一)首先 入口函数的问题。应用层编写我们的入口就是main函数,但在驱动编写时不是这样的,有两种情况,
1、缺省情况下
int __init init_module(void) 加载模块时的初始化函数,也就是驱动模块的入口函数
void __exit cleanup_module(void) 卸载模块时的函数,也就是卸载某个驱动时要执行的函数
2、
static int __init xxxx_init(void) 加载模块时的初始化函数,也就是驱动模块的入口函数
static void __exit xxxx_exit(void) 卸载模块时的函数,也就是卸载某个驱动时要执行的函数
上述两种情况相比,我们一般用第二种,因为第一种的名称是固定的,我们不能做更改,第二种我们可以改写xxxx为我们自己模块的名字。可以达到见文知义。
在用第二种模式时,我们要首先用固定格式声明一下:
module_init(xxxx_init);
module_exit(xxxx_exit);
来表明加载初始化函数和卸载函数。
(二)c语言的标准函数库不能使用
驱动属于内核的一部分,我们此时还无法使用类似像printf这样的c库,但是内核会提供自己的c库,在内核中我们用printk代替printf函数。
(三)添加LICENSE声明
linux是开源的系统,那就要我们遵守一定的规范,我们一般用GPL规范,所以在驱动编写时都要声明一下
MODULE_LICENSE(“GPL”);
基本的区别就是这些,我们来看一个简单的驱动框架
#include <linux/init.h>#include <linux/module.h>#include <linux/kernel.h>MODULE_LICENSE("GPL");static int __init demo_init(void){printk("%s,%d\n", __func__, __LINE__);printk("val:%d\n", obj.val);obj.func();return 0;}static void __exit demo_exit(void){printk("%s,%d\n", __func__, __LINE__);}module_init(demo_init);module_exit(demo_exit);完成驱动编写后,如何才能加载到内核呢?我们需要通过Makefile生成.ko文件,一个简单的Makefile如下,这是在ubutnu下的Makefile,如果换为ARM平台下的linux需要更换源文件目录。具体解释可以看内核模块编译makefile入门。执行make即可生成模块.ko文件
$(warning KERNELRELEASE = $(KERNELRELEASE))ifeq ($(KERNELRELEASE),)#内核的源码路径, ?= 条件赋值, uname -r 得到内核的版本号KERNELDIR ?= /lib/modules/$(shell uname -r)/build # := 立即赋值, 得到当前的绝对路径PWD := $(shell pwd)# -C 切换工作路径, make -cmodules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean:rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*.PHONY: modules cleanelse # 生成模块 obj-m := used.o endif
下面我们来看几个驱动中常用的命令
1、加载驱动模块insmod
将生成驱动模块.ko文件加载,
insmod xxx.ko
加载后就会执行xxxx_init函数
2、卸载驱动模块rmmod
对应的卸载驱动的命令
rmmod xxxx 注意不用带.ko
3、查看内核中的模块信息
lsmod
4、查看模块的描述信息
modinfo xxxx.ko
我们可以在驱动程序添加一些辅助信息,例如作者 ,驱动描述等。
5、查看模块打印信息
dmesg
printk是内核打印函数,默认模式下在中断下无法显示(当然,可以设置成打印到终端),用dmesg可以查看一下打印到内核的信息。
上述几个比较常用,有其他的我们可以以后再看。
我们把上述几个熟悉一下
insmod /rmmod/dmesg
加载模块后执行初始化函数,打印函数名和行号
卸载模块后执行卸载函数,打印函数名和行号
打印模块信息 modinfo
查看内核中模块信息lsmod
module为模块名称 size为模块打下 usedby 表明有几个其他文件使用
- linux驱动(一):linux驱动框架
- Linux USB驱动框架分析(一)
- Linux USB驱动框架分析(一)
- Linux USB驱动框架分析(一)
- linux usb驱动框架(一)
- linux字符设备驱动框架(一)
- linux驱动开发(一)—GPIO驱动框架
- linux驱动开发(一)—GPIO驱动框架
- Linux音频设备驱动_OSS驱动框架(一)————OSS驱动组成
- linux驱动:i2c驱动(一)
- linux驱动:音频驱动(一)ALSA
- Linux USB驱动框架分析(一)(转)
- Linux USB驱动框架分析(一)
- Linux USB驱动框架分析(一)
- Linux驱动学习笔记----------IIC框架与流程(一)
- linux驱动学习记录(一)-字符设备框架
- Linux 设备驱动框架
- Linux驱动框架
- 权威解答百度权重值是什么?分别是多少?
- Android APK反编译 详解
- 剑指offer-42-翻转单词顺序列
- php,数组函数
- 一些工具的常用设置
- linux驱动(一):linux驱动框架
- 设计模式——备忘录模式
- oozie重要配置详解(生产)
- 通讯录管理系统,元组,列表的练习
- spring系列(六):SSH整合一
- Android APP 使用WebView访问服务器H5页面带上Cookie
- jquery操作select(取值,设置选中)
- Nagios安装中遇到的问题点,记录一下
- lan上网和adsl上网