- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
如果你曾对 Linux2.0 版比较熟悉,现在要在内核 2.4 版下开发驱动程序,那么在了解了 2.0 到 2.2 内核 API 的变化后,还要了解 2.2 到 2.4 的变化。
1. 使用设备文件系统(DevFS)
DevFS 设备文件系统是 Linux 2.4 一个全新的功能,它主要为了有效的管理/ dev 目录而开发的。我能知道,Unix/Linux 中所有的目录都是层次结构,唯独/ dev 目录是一维结构(没有子目录),这就直接影响着访问的效率及管理的方便与否。另外,/dev 目录下的节点并不是按实际需要创建的,因此,该目录下存在大量实际不用的节点,但一般也不能轻易删除。
理想的/dev 目录应该是层次的、其规模是可伸缩的。Devfs 就是为达到此目的而设计。它在底层改写了用户与设备交互的方式和途径。它会给用户在两方面带来影响。首先,几乎所有的设备名称都做了改变,例如:“/dev/hda”是用户的硬盘,现在可能被定位于“/dev/ide0/...”。这一修改方案增大了设备可用的名字空间,且容许 USB 类和类似设备的系统集成。其次,不再需要用户自己创建设备节点。DevFS 的 /dev 目录最初是空的,里面特定的文件是在系统启动时、或是加载模块后驱动程序装入时建立的。当模块和驱动程序卸载时,文件就消失了。为保持和旧版本的兼容,可以使用一个用户空间守护程序“devfsd”, 以使先前的设备名称能继续使用。目前,Devfs 的使用还只是一个实验性选项, 由一个编译选项 CONFIG_DEVFS_FS 加以选择。
(1)注册和注销字符设备驱动程序
如前所述,一个新的文件系统要加入系统,必须进行注册。那么,一个新的驱动程序要加入系统,也必须进行注册。在下一章我们会看到,我们把设备大体分为字符设备和块设备。字符设备的注册和注销调用 register_chrdev()和 u nregister_chrdev()函数。注册了设备驱动程序以后,驱动程序应该调用 devfs
_register()登记设备的入口点,所谓设备的入口点就是设备所在的路径名;在注销设备驱动程序之前,应该调用 devfs_unregister()取消注册。
devfs_register()和 devfs_unregister() 函数原型为:
devfs_handle_t devfs_register(devfs_handle_t dir, const char *nam
e,
unsigned int flags,
unsigned int major, unsigned int minor, umode_t mode, void *ops, void *info);
void devfs_unregister(devfs_handle_t de);
其中 devfs_handle_t 表示 Devfs 的句柄(一个结构类型),每个参数的含义如下:
dir : 我们要创建的文件所在的Devfs 的句柄。NULL 意味着这是Devfs 的根, 即 /dev。
flags :设备文件系统的标志,缺省值为 DEVFS_FL_DEFAULT。major : 主设备号,普通文件不需要这一参数。
minor : 次设备号, 普通文件也不需要这一参数
mode : 缺省的文件模式(包括属性和许可权)。
ops : 指向 file_operations 或 block_device_operations 结构的指针
info : 任意一个指针,这个指针将被写到 file 结构的 private_data 域。
例如,如果我们要注册的设备驱动程序叫做DEVICE_NAME,其主设备号为MA JOR_NR,次设备号为 MINOR_NR,缺省的文件操作为 device_fops:则该设备驱动程序的 init_module()函数和 cleanup_module()函数如下:
int init_module(void)
{
int ret;
if ((ret = register_chrdev(MAJOR_NR, DEVICE_NAME, device_fop s)) == 0)
return ret;
}
void cleanup_module(void)
{
unregister_chrdev(MAJOR_NR, DEVICE_NAME);
}
对以上代码进行改写以支持设备文件系统(假定设备入口点的名字为 DEVIC E_ENTRY)
#include linux/devfs_fs_kernel.h devfs_handle_t devfs_handle;
int init_module(void)
{
int ret;
if ((ret = devfs_register_chr
您可能关注的文档
最近下载
- 迅达3300AP电气原理图(中文精简版).pdf VIP
- (精品)《雨人》中英文台词剧本完整版.docx VIP
- 2025-2026学年初中美术八年级上册(2024)岭南版(2024)教学设计合集.docx
- 上市公司应对证券民事索赔100问.pdf VIP
- 【继续教育】水质PH(每日一练).pdf VIP
- Lenovo联想 服务器 ThinkServer TS560 说明书.pdf
- Q/GDW 364-2009《单相智能电能表技术规范》及编制说明.doc VIP
- 社会保障学 高教版 第16章--扶贫开发.ppt VIP
- 《2和5的倍数的特征》省公开课一等奖全国示范课微课金奖PPT课件.pptx VIP
- 甜梦口服液与丁螺环酮治疗广泛性焦虑症的疗效对比.PDF VIP
文档评论(0)