07Linux设备驱动2讲稿.ppt

  1. 1、本文档共77页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2014.4 北京交通大学 电子信息工程学院 Linux设备驱动-2 设备驱动-2 混杂设备驱动介绍 设备驱动程序的内核支持 设备驱动的内核框架 设备树文件 I2C子系统介绍 I/O空间寄存器访问 混杂设备驱动 混杂设备misc 混杂设备驱动 混杂设备子系统 混杂设备驱动 miscdevice 混杂设备驱动 声明一个混杂设备很简便 混杂设备驱动 混杂设备驱动 混杂设备驱动 udev自动建立设备节点 混杂设备驱动 Misc设备驱动框架 设备驱动-2 混杂设备驱动介绍 设备驱动程序的内核支持 设备驱动的内核框架 设备树文件 I2C子系统介绍 I/O空间寄存器访问 设备驱动程序的内核支持 驱动程序常用的内核支持 申请内存 用户空间内存访问 锁定共享资源 定时服务 中断服务和推后处理 常用函数库、宏定义、数据类型、链表操作 子系统api .. .. .. 设备驱动程序的内核支持 内存管理 申请内存(物理地址连续) kmalloc, kzalloc(清零), devm_kzalloc(内核管理的分配;设备/模块移除时自动释放) 设备、驱动和框架结构体专门分配函数(内部调用kzalloc ) 例如:cdev_alloc(), cdev_del() 释放内存 kfree vmalloc申请内存(虚拟地址空间连续、物理地址不连续) MMU按4kB页整数倍分配内存,linux可以按SLAB方式分配更小的内存块。 #include linux/slab 设备驱动程序的内核支持 访问用户空间内存 文件接口 ssize_t foo_read(struct file *f, __user char *buf, size_t sz, loff_t *off) ssize_t foo_write(struct file *f, __user const char *buf, size_t sz, loff_t *off) 内核代码不能直接用指针或memcpy访问用户空间内存 单个数值 get_user(v, p); kernel v -- user p put_user(v, p); kernel v -- user p 缓冲区 unsigned long copy_to_user(void __user *to, const void *from, unsigned long n); unsigned long copy_from_user(void *to, const void __user *from, unsigned long n); 设备驱动程序的内核支持 访问用户空间内存 设备驱动程序的内核支持 锁定共享资源* 内核程序可能是并发的(多处理器、中断和内核抢占) 加锁保护 设备驱动程序的内核支持 互斥mutex* 当进程申请mutex锁定,而mutex已经被锁定时,则申请的进程就会阻塞(block)或休眠。因此mutex锁定只能用在允许休眠的环境下。 定义 #include linux/mutex.h 初始化: DEFINE_MUTEX(name); (静态) void mutex_init(struct mutex *lock); (动态) 加锁 void mutex_lock(struct mutex *lock); int mutex_lock_killable(struct mutex *lock); int mutex_lock_interruptible(struct mutex *lock); int mutex_trylock(struct mutex *lock); 解锁 void mutex_unlock(struct mutex *lock); 设备驱动程序的内核支持 自旋锁spinlock* 用于不允许休眠的场合。 最初用于多处理器场合。 Spinlock不休眠,忙等直到可加锁。 被spinlock保护的关键段不能休眠(不能调用可能休眠的函数) 设备驱动程序的内核支持 自旋锁spinlock* 初始化 DEFINE_SPINLOCK(my_lock); (静态) void spin_lock_init(spinlock_t *lock); (动态) 加锁/解锁 void spin_lock(spinlock_t *lock); (不关闭中断) void spin_unlock(spinlock_t *lock); void spin_lock_irqsave(spinlock_t *lock, unsigned long flags); (关中断) void spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags); 设备驱动程序

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档