- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(linux内核驱动模块编写ioctl
如果你对内核驱动模块一无所知,请先学习内核驱动模块的基础知识。如果你已经入门了内核驱动模块,但是仍感觉有些模糊,不能从整体来了解一个内核驱动模块的结构,请赏读一下这篇拙文。如果你已经从事内核模块编程N年,并且道行高深,也请不吝赐教一下文中的疏漏错误。?本文中我将实现一个简单的Linux字符设备,旨在大致勾勒出linux内核模块的编写方法的轮廓。其中重点介绍ioctl的用途。我把这个简单的Linux字符设备模块命名为hello_mod.设备类型名为hello_class设备名为hello?该设备是一个虚拟设备,模块加载时会在/sys/class/中创建名为hello_class的逻辑设备,在/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=pinyin,通过read函数读出的数据将会是“ni hao!Tom/n”??一般的内核模块中不会负责设备类别和节点的创建,我们在编译完之后会得到.o或者.ko文件,然后insmod之后需要mknod来创建相应文件,这个简单的例子中我们让驱动模块加载时负责自动创建设备类别和设备文件。这个功能有两个步骤,1)创建设备类别文件? class_create();2)创建设备文件?? device_create();关于这两个函数的使用方法请参阅其他资料。?linux设备驱动的编写相对windows编程来说更容易理解一点因为不需要处理IRP,应用层函数和内核函数的关联方式浅显易懂。比如当应曾函数对我的设备调用了open()函数,而最终这个应用层函数会调用我的设备中的自定义open()函数,这个函数要怎么写呢,我在我的设备中定义的函数名是hello_mod_open,注意函数名是可以随意定义,但是函数签名是要符合内核要求的,具体的定义是怎么样请看linux/fs.h?static int hello_mod_open(struct inode *, struct file *);?这样就定义了内核中的open函数,这只是定义还需要与我们自己的模块关联起来,这就要用到一个结构?struct file_operations?这个结构里面的成员是对应于设备操作的各种函数的指针。我在设备中用到了这些函数所以就如下定义,注意下面的写法不是标准ANSI C的语法,而是GNU扩展语法。?struct file_operations hello_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结构来关联所有的操作到我们的模块函数了。?和设备交互的数据我们总称为“数据”,但是大致可划分为两种“功能数据”:我们要输入设备处理的和设备处理完之后输出的数据。“控制数据”:我们用来控制设备特性功能的命令和参数。open,read,write,release等函数是对一个驱动模块的使用,就是我们对“设备的功能”的使用。但是一个设备有可能有很多功能,那么我们要怎么控制设备让设备完成指定的功能呢?据个例子来说:假如我们有一个翻译机(姑且说机吧,也可能是器)实体设备,主要功能是输入中文,然后可以输出各种语言对应的翻译结果,那这个机的功能就是翻译,我们真正用来处理的数据是我们输入的中文,我们要得到的“设备功能”就是翻译后的输出内容,而各种语言则是我们的选择控制了,我们可设定这个设备翻译成何种语言。这就要求我们要向设备发送命令,设定目标语言。请注意我们要发送的是两个“控制数据”,命令和参数。?命令:一个设备可能有很多种行为,我们的命令就是代表我们要让设备执行何种行为。“复位”,“设定目标语言”,“获得当前目标语言”等参数:对于某一个命令,可能需要参数可能不需要参数。? 比如:?“复位”命令就不需要参数。? “设定目标语言”则
您可能关注的文档
- [专家提问题目汇总.doc
- [专家点评2013年高考全国各地作文题.doc
- [专接本必看考点、考试公告、跨专业.doc
- (linux下遇到错误解决新手.doc
- (Linux中查找文件技术大全.doc
- [专科应用文练习题.doc
- (linux中的用户组和各种权限.doc
- [专科机械制造技术基础试卷.doc
- [专科模拟考试.doc
- [专科起点升本科招生专业与统一考试科目对照表.doc
- 人教版九年级英语上册学习资料 第02讲 Unit 2(单元知识、考点).pdf
- 人教版九年级英语上册 2025年秋开学考试卷02.docx
- 人教版九年级英语上册学习资料 第04讲 Unit 4(单元知识、考点).docx
- 人教版八年级英语上册学习资料 第07讲 原级和比较级.pdf
- 2025年秋人教版八年级英语上册 Unit 4 Amazing Plants and Animals(学习、上课).pptx
- 人教版八年级英语上册学习资料 第03讲 Unit 3(单元知识、考点).docx
- 人教版七年级英语下册复习 专题03 介词、数词、连词和频度副词.docx
- 人教版八年级英语下册复习 专题01 动词时态(解析版).pdf
- 人教版九年级英语上册 2025年秋开学考试卷02.pdf
- 人教版八年级英语上册学习资料 第01讲 Unit 1(单元知识、考点).pdf
文档评论(0)