Linux驱动开发(一)

Linux驱动开发(一)

ID:38190116

大小:125.50 KB

页数:6页

时间:2019-05-24

Linux驱动开发(一)_第1页
Linux驱动开发(一)_第2页
Linux驱动开发(一)_第3页
Linux驱动开发(一)_第4页
Linux驱动开发(一)_第5页
资源描述:

《Linux驱动开发(一)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Linux驱动开发(一)引言:学习Linux驱动先从模块开始,驱动都是以模块的形式出现的,所以编写内核模块是学习驱动的第一步。下面以一个实例来展开模块的开发。1.新建一个文件夹,mkdirdriver2.写一个。C文件,vimhello.c3.加入代码//这两个头文件时开发模块必须的两个头文件#include#includeMODULE_LICENSE("GPL");//通过GPL来授权,是一个授权声明,linux内核维护是开源组织维护

2、的,对于你编写的每一个驱动都是贡献于开源组织的,是用来扩展内核的,而不是来污染内核的,linux内核对函数使用是有要求的,没有通过授权的不能使用这些函数。inthello_init(void)//对于入口函数没参数,但有返回值{printk("<0>""hellomodule");//注意:"<0>"与"hellomodule之间要有空格//printf和printk就一个差别,能否设定级别“<0>”就是设定级别为最高级别0return;}inthello_exit(void)//出口函数,

3、没参数,没返回值{printk("helloexit");}MODULE_AUTHOR(“tocore”);//注明模块的作者module_init(hello_init);//module_init是一个宏,里面加载的是入口函数module_exit(hello_exit);//module_exit是一个宏,里面加载的是出口函数4.以上就是一个模块文件,写完后要进行编译,编译之前必须要写Makefile文件才能编译。Makefile文件如下:ifeq($(KERNEKRELEASE),)

4、//这是内核中定义的一个宏,编译模块时,如果KERNEKRELEASE为空时,则说明要编译的模块不在内核中,$表示取变量KERNELDIR:=/usr/src/kernels/2.6.18-92.el5-xen-i686//通过KERNELDIR得到内//核地址,中间是tab键PWD:=$(shellpwd)//得到当前模块路径,default://default下一行为tab键$(MAKE)-C$(KERNELDIR)M=$(PWD)modules//最前面为一tab键//-C后面跟的内核路径

5、,这句话的意思是调用make命令时切换当前目录到KERNELDIR下面,去编译PWD目录下的模块,M的意思是模块,M=$(PWD)modules,当前目录下的模块elseobj-m:=hello.o//目标文件为hello.oendif1.执行make命令对模块进行编译2.如何加载和卸载模块到内核中利用insmod命令加载,利用rmmod命令卸载具体用法为:insmodhello.ko//加载模块rmmodhello.ko//卸载模块查看模块是否加载成功用命令dmesg,输出结果,如图:3.当模

6、块已经加载后,再重新加载一遍便会出现文件存在的提示,加载之后不能再进行加载。要消除这个提示,除非用rmmod命令将其卸载掉,然后再重新加载,加载完毕后用lsmod命令查看新加载的模块,一般新加载的模块都在最上面,如图:也可以通过查看proc/modules下文件按查看,如图:4.命令modinfohello.ko可以查看模块的详细信息1.加载模块的目的是为了初始化设备,有时初始化时需要传递参数,下面介绍模块中如何传递参数。可以通过module_param为模块定义一个参数,在装载内核模块时,用户

7、可以向模块传递参数,参数类型可以是byte、short、ushort、int、uint、long、ulong、charp、bool、或invbool(布尔的反),在模块被编译时会将module_param中声明的类型与变量定义的类型进行比较,判断是否一致。module_param(num,int,S_IRUGO

8、S_IWUGO);S_IRUGO表示可读,S_IWUGO表示可写。#include#includeMODULE_LICENSE

9、("GPL");intnum=0;//不改动,默认为0,定义参数module_param(num,int,S_IRUGO

10、S_IWUGO);//利用module_param向模块传递参数定义参数//可读可写inthello_init(void){printk("<0>""hellomodule,num=%d",num);//打印出数字return;}Voidhello_exit(void){printk("helloexit");}module_init(hello_init);modu

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。