Linux内核驱动模块编写概览-ioctl,class_create,device_create

Linux内核驱动模块编写概览-ioctl,class_create,device_create

ID:47614493

大小:476.50 KB

页数:12页

时间:2019-10-09

Linux内核驱动模块编写概览-ioctl,class_create,device_create_第1页
Linux内核驱动模块编写概览-ioctl,class_create,device_create_第2页
Linux内核驱动模块编写概览-ioctl,class_create,device_create_第3页
Linux内核驱动模块编写概览-ioctl,class_create,device_create_第4页
Linux内核驱动模块编写概览-ioctl,class_create,device_create_第5页
资源描述:

《Linux内核驱动模块编写概览-ioctl,class_create,device_create》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、如果你对内核驱动模块一无所知,请先学习内核驱动模块的基础知识。如果你已经入门了内核驱动模块,但是仍感觉有些模糊,不能从整体来了解一个内核驱动模块的结构,请赏读一下这篇拙文。如果你已经从事内核模块编程N年,并且道行高深,也请不吝赐教一下文中的疏漏错误。 本文中我将实现一个简单的Linux字符设备,旨在大致勾勒出linux内核模块的编写方法的轮廓。其中重点介绍ioctl的用途。我把这个简单的Linux字符设备模块命名为hello_mod.设备类型名为hello_class设备名为hello 该设备是一个虚拟设备,模块加载时会在/sys/class/中创建名为hello_class的逻辑设备

2、,在/dev/中创建hello的物理设备文件。模块名为hello_mod,可接受输入字符串数据(长度小于128),处理该输入字符串之后可向外输出字符串。并且可以接受ioctl()函数控制内部处理字符串的方式。例如:a.通过write函数写入“Tom”,通过ioctl函数设置langtype=chinese,通过read函数读出的数据将会是“你好!Tom/n”b.通过write函数写入“Tom”,通过ioctl函数设置langtype=english,通过read函数读出的数据将会是“hello!Tom/n”c.通过write函数写入“Tom”,通过ioctl函数设置langtype=p

3、inyin,通过read函数读出的数据将会是“nihao!Tom/n”  一般的内核模块中不会负责设备类别和节点的创建,我们在编译完之后会得到.o或者.ko文件,然后insmod之后需要mknod来创建相应文件,这个简单的例子中我们让驱动模块加载时负责自动创建设备类别和设备文件。这个功能有两个步骤,1)创建设备类别文件 class_create();2)创建设备文件  device_create();关于这两个函数的使用方法请参阅其他资料。 linux设备驱动的编写相对windows编程来说更容易理解一点因为不需要处理IRP,应用层函数和内核函数的关联方式浅显易懂。比如当应曾函数对我的

4、设备调用了open()函数,而最终这个应用层函数会调用我的设备中的自定义open()函数,这个函数要怎么写呢,我在我的设备中定义的函数名是hello_mod_open,注意函数名是可以随意定义,但是函数签名是要符合内核要求的,具体的定义是怎么样请看 staticinthello_mod_open(structinode*,structfile*); 这样就定义了内核中的open函数,这只是定义还需要与我们自己的模块关联起来,这就要用到一个结构 structfile_operations 这个结构里面的成员是对应于设备操作的各种函数的指针。我在设备中用到了这些函数

5、所以就如下定义,注意下面的写法不是标准ANSIC的语法,而是GNU扩展语法。 structfile_operationshello_mod_fops={ .owner=THIS_MODULE, .open=hello_mod_open, .read=hello_mod_read, .write=hello_mod_write, .ioctl=hello_mod_ioctl, .release=hello_mod_release,}; 这个结构体变量定义好之后我们在模块初始化函数中就可以通过register_chrdev()或者填充cdev结构来关联所有的操作到我们的模块函数了。 和设备

6、交互的数据我们总称为“数据”,但是大致可划分为两种“功能数据”:我们要输入设备处理的和设备处理完之后输出的数据。“控制数据”:我们用来控制设备特性功能的命令和参数。open,read,write,release等函数是对一个驱动模块的使用,就是我们对“设备的功能”的使用。但是一个设备有可能有很多功能,那么我们要怎么控制设备让设备完成指定的功能呢?据个例子来说:假如我们有一个翻译机(姑且说机吧,也可能是器)实体设备,主要功能是输入中文,然后可以输出各种语言对应的翻译结果,那这个机的功能就是翻译,我们真正用来处理的数据是我们输入的中文,我们要得到的“设备功能”就是翻译后的输出内容,而各种语

7、言则是我们的选择控制了,我们可设定这个设备翻译成何种语言。这就要求我们要向设备发送命令,设定目标语言。请注意我们要发送的是两个“控制数据”,命令和参数。 命令:一个设备可能有很多种行为,我们的命令就是代表我们要让设备执行何种行为。“复位”,“设定目标语言”,“获得当前目标语言”等参数:对于某一个命令,可能需要参数可能不需要参数。       比如:        “复位”命令就不需要参数。       “设定目标语言”则需要传入目标语言的类型。

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

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

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