- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux驱动开发(一)
Linux驱动开发(一)
引言:学习Linux驱动先从模块开始,驱动都是以模块的形式出现的,所以编写内核模块是学习驱动的第一步。下面以一个实例来展开模块的开发。
新建一个文件夹,mkdir driver
写一个。C文件,vim hello.c
加入代码
//这两个头文件时开发模块必须的两个头文件
#include linux/init.h
#include linux/module.h
MODULE_LICENSE(GPL); //通过GPL来授权,是一个授权声明,linux内核维护是开源组织维护的,对于你编写的每一个驱动都是贡献于开源组织的,是用来扩展内核的,而不是来污染内核的,linux内核对函数使用是有要求的,没有通过授权的不能使用这些函数。
int hello_init(void) //对于入口函数没参数,但有返回值
{
printk(0 hello module\n); //注意:0与hello module之间要有空格
//printf和printk就一个差别,能否设定级别 “0”就是设定级别为最高级别0
return ;
}
int hello_exit(void) //出口函数,没参数,没返回值
{
printk(hello exit\n);
}
MODULE_AUTHOR(“tocore”); //注明模块的作者
module_init(hello_init); //module_init是一个宏,里面加载的是入口函数
module_exit(hello_exit); // module_exit是一个宏,里面加载的是出口函数
以上就是一个模块文件,写完后要进行编译,编译之前必须要写Makefile文件才能编译。
Makefile文件如下:
ifeq ($(KERNEKRELEASE),) //这是内核中定义的一个宏,编译模块时,如果KERNEKRELEASE为空时,则说明要编译的模块不在内核中,$表示取变量
KERNELDIR :=/usr/src/kernels/2.6.18-92.el5-xen-i686 //通过KERNELDIR得到内
//核地址,中间是tab键
PWD :=$(shell pwd) //得到当前模块路径,
default: //default下一行为tab键
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules //最前面为一tab键
//-C后面跟的内核路径,这句话的意思是调用make命令时切换当前目录到KERNELDIR下面,去编译PWD目录下的模块,M的意思是模块,M=$(PWD) modules,当前目录下的模块
else
obj-m :=hello.o //目标文件为hello.o
endif
执行make命令对模块进行编译
如何加载和卸载模块到内核中
利用insmod命令加载,利用rmmod命令卸载
具体用法为:insmod hello.ko //加载模块
rmmod hello.ko //卸载模块
查看模块是否加载成功用命令dmesg,输出结果,如图:
当模块已经加载后,再重新加载一遍便会出现文件存在的提示,加载之后不能再进行加载。
要消除这个提示,除非用rmmod命令将其卸载掉,然后再重新加载,加载完毕后用lsmod命令查看新加载的模块,一般新加载的模块都在最上面,如图:
也可以通过查看proc/modules下文件按查看,如图:
命令modinfo hello.ko可以查看模块的详细信息
加载模块的目的是为了初始化设备,有时初始化时需要传递参数,下面介绍模块中如何
传递参数。
可以通过module_param为模块定义一个参数,在装载内核模块时,用户可以向模块传递参数,参数类型可以是byte、short、ushort、int、uint、long、ulong、charp、bool、或invbool(布尔的反),在模块被编译时会将module_param中声明的类型与变量定义的类型进行比较,判断是否一致。
module_param(num, int, S_IRUGO | S_IWUGO); S_IRUGO表示可读,S_IWUGO表示可写。
#include linux/init.h
#include linux/module.h
MODULE_LICENSE(GPL);
int num=0;//不改动,默认为0,定义参数
module_param(num,int,S_IRUGO
文档评论(0)