Linux字符设备驱动程序讲座(1).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文档。上传文档
查看更多
内核符号表 内核符号简介 模块之间用符号连接在一起 符号导出 内核符号表 /proc/ksyms System.map 模块初始化和关闭 模块加载调用的第一个函数init_module 模块所使用资源的分配与释放 使用计数 模块卸载和cleanup_module 显式指定初始化和清除函数 驱动程序使用的资源 获取内存区域 kmalloc ioport和iomem资源的使用 运行时动态分配iomem,ioport 静态分配存储器和端口映射 我该如何选择资源分配方式 动态分配主设备号 register_chrdev注册动态主设备号 动态分配主设备号的优缺点 /proc/devices和lsmod 动态生成设备文件系统节点 dev_t和kdev_t 访问设备驱动程序的方法 devfs简介 devfs的兼容性 proc简介 sysfs简介 用ioctl控制驱动程序实例分析(1) int scull_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg) { int err = 0, tmp; int retval = 0; if (_IOC_TYPE(cmd) != SCULL_IOC_MAGIC) return -ENOTTY; if (_IOC_NR(cmd) SCULL_IOC_MAXNR) return -ENOTTY; if (_IOC_DIR(cmd) _IOC_READ) err = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); else if (_IOC_DIR(cmd) _IOC_WRITE) err = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); if (err) return -EFAULT; 用ioctl控制驱动程序实例分析(2) switch(cmd) { case SCULL_IOCRESET: scull_quantum = SCULL_QUANTUM; scull_qset = SCULL_QSET; break; case SCULL_IOCSQUANTUM: /* Set: arg points to the value */ if (! capable (CAP_SYS_ADMIN)) return -EPERM; retval = __get_user(scull_quantum, (int __user *)arg); break; case SCULL_IOCTQUANTUM: /* Tell: arg is the value */ if (! capable (CAP_SYS_ADMIN)) return -EPERM; scull_quantum = arg; break; case SCULL_IOCGQUANTUM: /* Get: arg is pointer to result */ retval = __put_user(scull_quantum, (int __user *)arg); break; 模块加载与卸载函数模板 struct xxx_dev_t //设备结构体 { struct cdev cdev; ...} xxx_dev; static int _ _init xxx_init(void) //设备驱动模块加载函数 { ... cdev_init(xxx_dev.cdev, xxx_fops); //初始化cdev xxx_dev.cdev.owner = THIS_MODULE; if (xxx_major) //获取字符设备号 { register_chrdev_region(xxx_dev_no, 1, DEV_NAME);} else { alloc_chrdev_region(xxx_dev_no, 0, 1, DEV_NAME); ret = cdev_add(xxx_dev.cdev, xxx_dev_no, 1); //注册设备 } ... } static void _ _exit xxx_e

文档评论(0)

好文精选 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档