当前位置: 首页 > news >正文

Linux驱动开发之注册

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

模块注册

你必须记住一件事, 在注册内核设备时, 注册可能失败,即便最简单的动作常常需要内存分配, 分配的内存可能不可用,因此模块代码必须一直检查返回值, 并且确认要求的操作实际上已经成功。

如果证实你的模块在一个特别类型的失败后完全不能加载, 你必须取消任何在失败前注册的动作。

错误恢复有时用 goto 语句处理是最好的。我们通常不愿使用 goto, 但是在我们的观念里, 这是一个它有用的地方。在错误情形下小心使用 goto 可以去掉大量的复杂, 过度对齐的"结构形" 的逻辑,因此在内核里goto 是处理错误经常用到。

模块清理函数必须撤销任何由初始化函数进行的注册, 并且惯例(但常常不是要求的)是按照注册时相反的顺序注销设施。

使代码重复最小和所有东西流线化, 你应当做的是无论何时发生错误都从初始化里调用清理函数,清理函数接着必须在撤销它的注册前检查每一项的状态。

注意清理函数当由非退出代码调用时不能标志为 __exit。

不要注册任何设备, 直到所有的需要支持那个设备的你的内部初始化已经完成。cdev_add 一返回, 你的设备就是"活的"并且内核可以调用它的操作。除非你的驱动完全准备好处理设备上的操作, 你不应当调用 cdev_add。

字符设备的注册,内核在内部使用类型 struct cdev 的结构来代表字符设备,在内核调用你的设备操作前, 你编写分配并注册一个或几个这些结构。

  • 分配和初始化:cdev_init(...)
  • 通知内核:cdev_add(...)
  • 去除:cdev_del(...)

模块参数

任何使用它们的细节见 moduleparam.h,所有的模块参数应当给定一个缺省值; insmod 只在用户明确告知它的时候才改变这些值。模块可检查明显的参数, 通过对应它们的缺省值检查这些参数。

最后的 module_param 字段是一个权限值,你应当使用 <linux/stat.h> 中定义的值,这个值控制谁可以存取这些模块参数在 sysfs 中的表示. 如果 perm 被设为 0, 就根本没有 sysfs 项。否则它出现在 /sys/module下面,带有给定的权限。使用 S_IRUGO 作为参数可以被所有人读取, 但是不能改变; S_IRUGO|S_IWUSR 允许 root 来改变参数。注意如果一个参数被 sysfs 修改, 你的模块看到的参数值也改变了, 但是你的模块没有任何其他的通知。你应当不要使模块参数可写, 除非你准备好检测这个改变并且因而作出反应。

转载于:https://my.oschina.net/shelllife/blog/1536088

相关文章:

  • java:Properties属性文件概念
  • 从0实现一个tiny react(三)生命周期
  • python练习-统计包含数字字符串元组在内的列表内数据类型个数
  • MFC添加背景图片
  • C#/VB.NET 给Word文档添加/撤销书签
  • include 和require的区别
  • windows7安装saltstack
  • 训练过程中出现的报错
  • python基础知识
  • mysql的锁机制
  • STM32——C语言知识点:指针、结构体
  • maven及阿里云镜像
  • 【批处理学习笔记】第七课:简单的批处理命令(6)
  • fdisk非交互自动对磁盘分区格式化
  • UWP开发砸手机系列(二)—— “讲述人”识别自定义控件Command
  • JavaScript-如何实现克隆(clone)函数
  • “大数据应用场景”之隔壁老王(连载四)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • CSS 专业技巧
  • Laravel 实践之路: 数据库迁移与数据填充
  • Linux链接文件
  • spring boot 整合mybatis 无法输出sql的问题
  • SpringBoot 实战 (三) | 配置文件详解
  • Terraform入门 - 1. 安装Terraform
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • windows下使用nginx调试简介
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 前端js -- this指向总结。
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 双管齐下,VMware的容器新战略
  • 写代码的正确姿势
  • 学习笔记:对象,原型和继承(1)
  • zabbix3.2监控linux磁盘IO
  • 国内开源镜像站点
  • ​secrets --- 生成管理密码的安全随机数​
  • # Java NIO(一)FileChannel
  • #if和#ifdef区别
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (pt可视化)利用torch的make_grid进行张量可视化
  • .gitignore
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net 微服务 服务保护 自动重试 Polly
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @angular/cli项目构建--http(2)
  • @Async注解的坑,小心
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [100天算法】-x 的平方根(day 61)
  • [2]十道算法题【Java实现】
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林