- 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驱动程序开发?-?字符设备驱动 (2008-08-03 08:08:08)
标签:it?linux?kernel?driver? 分类:Linux 序言Linux下的大部分驱动程序都是字符设备驱动程序,在这一章我们就扩展我们的“Hello World”程序来支持用户应用程序的读写操作。我们也会了解到字符设备是如何注册到系统中的,应用程序是如何访问驱动程序的数据的,及字符驱动程序是如何工作的。设备号通过前面的学习我们知道应用程序是通过设备节点来访问驱动程序及设备的,其根本是通过设备节点的设备号(主设备号及从设备号)来关联驱动程序及设备的,字符设备也不例外(其实字符设备只能这样访问)。这里我们详细讨论Linux内部如何管理设备号的。
设备号类型
Linux内核里用“dev_t”来表示设备号,它是一个32位的无符号数,其高12位用来表示主设备号,低20位用来表示从设备号。它被定义在linux/types.h头文件里。内核里提供了操作“dev_t”的函数,驱动程序中通过这些函数(其实是宏,定义在linux/kdev_t.h文件中)来操作设备号。
#define MINORBITS?? ?20#define MINORMASK?? ?((1U MINORBITS) - 1)#define MAJOR(dev)?? ?((unsigned int) ((dev) MINORBITS))#define MINOR(dev)?? ?((unsigned int) ((dev) MINORMASK))#define MKDEV(ma,mi)?? ?(((ma) MINORBITS) | (mi)) MAJOR(dev)用于获取主设备号,MINOR(dev)用于获取从设备号,而MKDEV(ma,mi)用于通过主设备号和从设备号构造dev_t数据。另一点需要说明的是,dev_t数据类型支持2^12个主设备号,每个主设备号(通常是一个设备驱动)可以支持2^20个设备,目前来说这已经足够大了,但谁又能说将来还能满足要求呢?一个良好的编程习惯是不要依赖dev_t这个数据类型,切记必须使用内核提供的操作设备号的函数。
字符设备号注册
内核提供了字符设备号管理的函数接口,作为一个良好的编程习惯,字符设备驱动程序应该通过这些函数向系统注册或注销字符设备号。
int register_chrdev_region(dev_t from, unsigned count, const char *name)int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,??? ??? ??? const char *name)void unregister_chrdev_region(dev_t from, unsigned count) register_chrdev_region用于向内核注册已知可用的设备号(次设备号通常是0)范围。由于历史的原因一些设备的设备号是固定的,你可以在内核源代码树的Documentation/devices.txt文件中找到这些静态分配的设备号。
alloc_chrdev_region用于动态分配的设备号并注册到内核中,分配的设备号通过dev参数返回。作为一个良好的内核开发习惯,我们推荐你使用动态分配的方式来生成设备号。unregister_chrdev_region用于注销一个不用的设备号区域,通常这个函数在驱动程序卸载时被调用。
字符设备Linux2.6内核使用“struct cdev”来记录字符设备的信息,内核也提供了相关的函数来操作“struct cdev”对象,他们定义在linux/cdev.h头文件中。可见字符设备及其操作函数接口定义的很简单。
struct cdev {?? ?struct kobject kobj;?? ?struct module *owner;?? ?const struct file_operations *ops;?? ?struct list_head list;?? ?dev_t dev;?? ?unsigned int count;};void cdev_init(struct cdev *, const struct file_operations *);struct cdev *cdev_alloc(void);void cdev_put(struct cdev *p);int cdev_add(struct cdev *, dev_t, unsigned);void cdev_del(struct cdev *);
您可能关注的文档
最近下载
- 《公共行政学》期末复习题.doc VIP
- 公路工程竣交工验收培训课件.pptx VIP
- 小学生品德发展与道德教育 【第1章】 品德发展与道德教育概述 教学PPT课件.pptx VIP
- 吸湿器说明书(中英文)明远(46).doc VIP
- 学习解读《SLT 631水利水电工程单元工程施工质量验收标准 第 4 部分:堤防与河道整治工程》课件.pptx
- 以德育之笔——2025年秋季学期学校德育工作安排表 第二版.docx VIP
- 新概念2册1-36课测试卷.pdf VIP
- 企业会计准则讲解2010版.doc
- 入党志愿书(全电子版).pdf VIP
- 2025年秋季统编版七年级上册道德与法治全册教学课件.pptx
文档评论(0)