第10课设备驱动开发内容摘要:

它们的总线进行组织 struct device /sys/devices/*/*/../ 设备类别( Device Classes) 系统中设备的类型(声卡,网卡,显卡,输入设备等),同一类中包含的设备可能连接不同的总线 struct class /sys/class/*/ 设备驱动( Device Drivers) 在一个系统中安装多个相同设备,只需要一份驱动程序的支持 struct device_driver /sys/bus/pic/drivers/*/ Platform机制 • 从 Linux 起引入了一套新的驱动管理和注册机制 :Platform_device 和 Platform_driver。 • 通过 Platform 机制开发发底层驱动的大致流程为 : 定义 platform_device 注册 platform_device 定义 platform_driver 注册 platform_driver。 • Platform_bus是一 个虚拟总线,使设备的管理更加简单化。 各个 Platform device 和 Platform driver挂载在虚拟总线 platform_bus上 • 接口 定义在 linux/中。 同步机制 • 同步 锁 • 信号量 • 读写信号量 • 原子操作 • 完成 事件( pletion) 同步锁 • 自旋锁( spinlock) • 读写锁( rwlock) • RCU锁 ( ReadCopy Update) • Seqlock 自旋锁( 1) • 如果一个 自旋锁被别的 任务 保持 ,调用者就一直循环 , 不停检测 该 自旋锁的保持 者是否 已经 释放了锁。 • 自旋 锁不会引起调用者 睡眠。 自旋 锁使用者一般保持锁事件非常短,所以选择自旋而不是睡眠,效率会高于互斥锁。 自旋锁( 2) • 自旋锁的类型是 spinlock_t • 初始化 – spinlock_t my_spinlock = SPIN_LOCK_UNLOCKED。 – void spin_lock_init(spinlock_t *lock)。 • 获得锁: void spin_lock(spinlock_t *lock)。 • 释放锁: void spin_unlock(spinlock_t *lock)。 • 非 阻塞版本: – int spin_trylock(spinlock_t *lock)。 – int spin_trylock_bh(spinlock_t *lock)。 读写锁( rwlock)( 1) • 访问者分为两类 : 读者 与 写者。 • 任意 数目的 读者 可以 同时 进入临界区,但是写者必须是排他的。 • 读写锁类型是 rwlock_t, 位于linux/ 读写锁( 2) • 初始化: – rwlock_t my_rwlock=RW_LOCK_UNLOCKED。 /*静态 */ – rwlock_init(amp。 my_rwlock)。 /* 动态 */ • 读者锁的获取和释放 : – void read_lock(rwlock_t *lock)。 – void read_unlock(rwlock_t *lock)。 • 写 者 锁的获取和释放: – void write_lock(rwlock_t *lock)。 – int write_trylock(rwlock_t *lock)。 – void write_unlock_bh(rwlock_t *lock)。 RCU锁( 1) • RCU( ReadCopy Update,读 拷贝修改 ) 锁机制是。 • 对于被 RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它 时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调( callback)机制在适当的时机把指向原来数据的指针重新指向新的被修改的数据。 这个时机就是所有引用该数据的 CPU都退出对共享数据的操作。 • 读者 基本上没有同步开销,不需要锁,不使用原子指令; 但是 写 者同步开销相对较大,因为它需要延迟数据结构的释放,复制被修改的数据结构,也必须用某种锁机制同步并行的其它写者的修改操作。 RCU锁(。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。