内存设备驱动程序设计分析.docVIP

  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文档。上传文档
查看更多
PAGE3 / NUMPAGES15 完整的内存设备驱动程序 目录 TOC \o 1-3 \u 一、设备驱动中的并发控制 2 1、并发 2 2、自旋锁 2 2.1、自旋锁的使用 2 3、信号量 2 3.1、信号量的相关操作 3 3.2、信号量用于同步 3 二、设备驱动中的阻塞与非阻塞 3 1、阻塞操作 3 2、非阻塞操作 3 3、等待队列 3 3.1、等待队列的相关操作 3 4、轮询操作 4 三、设备驱动中的异步通知 4 1、异步通知 4 2、信号的接收 4 3、信号的释放 4 3.1、异步通知编程用到一项数据结构和两个函数 4 四、设备I/O端口和I/O内存的访问 5 1、I/O端口与I/O内存 5 2、可以使用以下函数访问定位于I/O空间端口 5 2.1、I/O内存 5 2.2、对设备内存映射的虚拟地址的读写 5 3、申请与释放设备I/O端口和I/O内存 5 4、设备I/O端口和I/O内存访问流程 5 4.1、设备I/O端口访问流程 5 4.2、I/O内存访问流程 5 五、globalfifo驱动涉及的结构体、操作及代码 5 1、globalfifo设备结构体 5 1.1、cdev结构体 6 1.2、设备号的分配和释放 6 1.3、struct file_operations结构体 6 2、使globalfifo驱动实现异步通知 7 3、文件打开函数于释放函数 7 4、读写函数 7 4.1读函数 7 4.2、写函数 8 5、ioctl设备控制函数 10 6、轮询操作 10 7、初始化并注册cdev 11 8、文件操作结构体 11 9、设备驱动模块加载函数 12 9.1自动创建设备文件 13 10、模块卸载函数 13 11、其他代码 13 11.1、必要的头文件 13 11.2模块的相关信息 14 六、Makefile 14 七、模块加载 14 1、直接编译内核 14 2、使用模块法 15 设备驱动最通俗的理解是“驱使硬件设备行动”。驱动与底层硬件直接打交道,按照硬件设备的具体工作方式,读写设备的寄存器,完成设备的轮询、中断处理、DMA通信,进行物理内存向虚拟内存的映射等,最终让通信设备能收发数据,让显示设备能显示文字和画面,让存储设备能记录文件和数据。 现以globalfifo设备驱动为例介绍完整的内存设备驱动程序。首先描述一下该驱动中所涉及到的并发控制、自旋锁、信号量、阻塞与非阻塞I/O、轮询操作、异步通知与异步I/O和I/O访问等。 一、设备驱动中的并发控制 1、并发 指的是多个执行单元同时、并行被执行。而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问很容易导致竞态。处理并发的常用技术是加锁或者互斥,即确保在任何时候只有一个执行单元可以操作共享资源。在Linux内核中主要通过信号量机制和自旋锁机制实现。 2、自旋锁 可以从它的工作方式理解,即,在某CPU上运行的代码需要先执行一个原子操作,该操作测试并设置某个内存变量,由于它是原子操作,所以在该操作完成之前其他执行单元不可能访问这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行;如果测试结果表明锁仍被占用,程序将在一个小的循环内重复这个“测试并设置”操作,即进行所谓的“自旋锁”。自旋锁最多只能被一个可执行单元持有。 2.1、自旋锁的使用 a.定义自旋锁 spinlock_t lock; b.初始化自旋锁 spin_lock_init(lock) 该宏用于动态初始化自旋锁lock。 c.获得自旋锁 spin_lock(lock) 该宏用于获得自旋锁lock,如果能立即获得锁,马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放。 d.释放自旋锁 spin_unlock(lock) 3、信号量 它主要提供对进程间共享资源访问控制机制。与自旋锁类似,只有得到信号量的进程才能执行临界区代码。与自旋锁不同的是,当获得不到信号量时,进程不会原地打转而是进入休眠等待状态。 3.1、信号量的相关操作 a.定义信号量 struct semaphore sem; 定义名为sem的信号量。 b.初始化信号量 void sema_init(struct semaphore *sem,int val); 该函数初始化信号量,并设置信号量sem的值为val。 c.获得信号量 void down(struct semaphore *sem); 该函数用于获得信号量sem,它可能会导致睡眠。 d.释放信号量 void up(struct semaphore *sem); 该函数释放信号量sem,唤醒等待者。 3.2、信号量用于同步

文档评论(0)

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

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

1亿VIP精品文档

相关文档