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

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
内存设备驱动程序设计分析.doc

完整的内存设备驱动程序 目录 一、设备驱动中的并发控制 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访问等。 二、设备驱动中的阻塞与非阻塞 1、阻塞操作 是指在执行设备操作时,若不能获得资源,则挂起进程直到满足操作的条件后在进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。 2、非阻塞操作 是指进程在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止。 3、等待队列 用来实现进程的阻塞。等待队列可看作保存进程的容器,在阻塞进程时,将进程放入等待队列,当唤醒进程时,从等待队列中取出进程。 3.1、等待队列的相关操作 a.定义“等待队列头” wait_queue_head_t mu_queue; b.初始化“等待队列头” init_waitqueue_head(my_queue); c.定义等待队列 DECLARE_WAITQUEUE(name,tsk) 该宏用于定义并初始化一个名为name的等待队列。 d.添加/移除等待队列 void fastcall add_wait_queue(wait_queue_head_t *q,wait_queue_t *wait); void fastcall remove_wait_queue(wait_queue_head_t *q,wait_queue_t *wait); e.等待事件 wait_event(queue,condition) wait_event_interruptible(queue,condition) f.唤醒队列 void wake_up(wait_queue_head_t *queue); void wake_up_interruptible(wait_queue_head_t *queue); 上述操作会唤醒queue作为等待队列头的所有等待队列中所有属于该等待队列头的等待队列对应的进程。 g.在等待队列上睡眠 sleep_on(wait_queue_head_t *q); interruptible_sleep_on(wait_queue_head_t *q); sleep_on()函数的作用就是将目前进程的状态置成TASK_UNINTERRUPTIBLE,并定义一个等待队列,之后把它附属到等待队列头q,直到资源可获得,q引导的等待队列被唤醒。 4、轮询操作 在用户程序中,select()和poll()也是与设备阻塞与非阻塞访问

文档评论(0)

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

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

1亿VIP精品文档

相关文档