第3章字符设备驱动程序..pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
scull的设计 scull0 ~ scull3 由全局且持久的内存区组成,可被多次打开,关闭后再打开,仍能保持原数据 scullpipe0 to scullpipe3 FIFO(先进先出)设备,类似管道,可由一个进程读,另一个进程写 Scullsingle、scullpriv 、sculluid、scullwuid 与scull0类似,但在open操作方面有些限制 主设备号与次设备号 $ls –l /dev 主设备号与次设备号 设备编号的内部表达 内核中,设备编号数据类型为dev_t,定义在linux/types.h 中 操作设备编号的宏 MAJOR(dev_t dev); 由dev_t数得到主设备号 MINOR(dev_t dev);由dev_t数得到次设备号 MKDEV(int major, int minor);由主、次设备号得到dev_t数 主设备号与次设备号 静态分配设备编号 int register_chrdev_region(dev_t first, unsigned int count, char *name); first:主设备号范围起始值,次设备号通常为0 count:连续设备号的个数 name:设备编号范围关联的设备名称,将出现在/proc/devices和/sysfs中 成功返回0,失败返回负数 静态分配需要预先知道可使用的设备号,如何知道? 内核源代码树的Documenttation/devices.text可查到尚有哪些号可用 主设备号与次设备号 动态分配设备编号 int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name); dev:调用成功后保存分配到的设备编号范围的第一个数 firstminor:第一个次设备号,通常用是0 count与name与静态分配时相同 释放设备编号 void unregister_chrdev_region(dev_t first, unsigned int count); 主设备号与次设备号 scull设备号分配 主设备号与次设备号 scull_load 静态分配的问题是:若驱动程序仅自己使用,选择一个未用的号来用没什么问题,但若驱动程序被广泛使用,则可能造成冲突 动态分配的问题是:由于分配的主设备号不能始终一至,所以无法预先创建设备节点 一旦分配了设备号,就可从/proc/devices中读到,因此可写一脚本代替insmod,在载入模块后读出设备号并创建节点。即用一脚本完成加载模块、读出主设备号及创建设备节点等操作。 scull设备的这一脚本叫scull_load 主设备号与次设备号 /proc/devices 文件如下: Character devices: 1 mem 2 pty 3 ttyp 4 ttyS 6 lp 7 vcs 10 misc 13 input 14 sound 21 sg 180 usb 主设备号与次设备号 /*Scull_load*/ #!/bin/sh module=scull device=scull mode=664 /sbin/insmod ./$module.ko $* || exit 1 rm -f /dev/${device}[0-3] major=$(awk \$2= =\$module\ {print \$1} /proc/devices) mknod /dev/${device}0 c $major 0 mknod /dev/${device}1 c $major 1 mknod /dev/${device}2 c $major 2 mknod /dev/${device}3 c $major 3 group=staff“ grep -q ^staff: /etc/group || group=wheel“ chgrp $group /dev/${device}[0-3] chmod $mode /dev/${device}[0-3] 主设备号与次设备号 也可编写一个init脚本放在/etc/init.d下,可在系统初始化时加载模块、并根据主设备号创建节点 若只涉及单个驱动,因动态设备号的分配并不是真正随机生成的,故只需在第一次加载时创建节点,以后加载时无需再创节点 一些重要的数据结构 大部分的驱动程序操作涉及到3个重要的内核数据结构,分别是: file_operations:文件操作结构,保存文件操作方法 file:文件结构,对应一个打开的文件 inode:

文档评论(0)

peain + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档