linux设备驱动程序学习笔记 高级字符驱动学习

linux设备驱动程序学习笔记 高级字符驱动学习

ID:14987321

大小:71.78 KB

页数:21页

时间:2018-07-31

linux设备驱动程序学习笔记 高级字符驱动学习_第1页
linux设备驱动程序学习笔记 高级字符驱动学习_第2页
linux设备驱动程序学习笔记 高级字符驱动学习_第3页
linux设备驱动程序学习笔记 高级字符驱动学习_第4页
linux设备驱动程序学习笔记 高级字符驱动学习_第5页
资源描述:

《linux设备驱动程序学习笔记 高级字符驱动学习》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、Linux设备驱动程序学习笔记高级字符驱动学习--阻塞型I/0提出问题:若驱动程序无法立即满足请求,该如何响应?比如:当数据不可用时调用read,或是在缓冲区已满时,调用write解决问题:驱动程序应该(默认)该阻塞进程,将其置入休眠状态直到请求可继续。 休眠:当一个进程被置入休眠时,它会被标记为一种特殊状态并从调度器运行队列中移走,直到某些情况下修改了这个状态,才能运行该进程。安全进入休眠两原则:1.永远不要在原子上下文中进入休眠。(原子上下文:在执行多个步骤时,不能有任何的并发访问。这意味着,驱动程序不能再拥有自旋锁,seqlock,或是RCU锁时,

2、休眠)2.对唤醒之后的状态不能做任何假定,因此必须检查以确保我们等待的条件真正为真 临界区 vs 原子上下文原子上下本:一般说来,具体指在中断,软中断,或是拥有自旋锁的时候。临界区:每次只允许一个进程进入临界区,进入后不允许其它进程访问。 otherquestion:要休眠进程,必须有一个前提:有人能唤醒进程,而起这个人必须知道在哪儿能唤醒进程,这里,就引入了“等待队列”这个概念。等待队列:就是一个进程链表(我的理解:是一个休眠进程链表),其中包含了等待某个特定事件的所有进程。等待队列头:wait_queue_head_t,定义在

3、h>定义方法:静态 DECLARE_QUEUE_HEAD(name)                     动态 wait_queue_head_t my_queue;                                init_waitqueue_head(&my_queue); struct__wait_queue_head{    spinlock_tlock;    structlist_headtask_list;};typedefstruct__wait_queue_headwait_queue_head_t; 简单休眠linu

4、x最简单的休眠方式是wait_event(queue,condition)及其变种,在实现休眠的同时,它也检查进程等待的条件。四种wait_event形式如下:wait_event(queue,condition);/*不可中断休眠,不推荐*/wait_event_interruptible(queue,condition);/*推荐,返回非零值意味着休眠被中断,且驱动应返回-ERESTARTSYS*/wait_event_timeout(queue,condition,timeout);wait_event_interruptible_timeout(

5、queue,conditon,timeout);/*有限的时间的休眠,若超时,则不管条件为何值返回0*/ 唤醒休眠进程的函数:wake_upvoid wake_up(wait_queue_head_t *queue);void wake_up_interruptible(wait_queue_head *queue);惯例:用wake_up唤醒wait_event,用wake_up_interruptible唤醒wait_event_interruptible 休眠与唤醒实例分析:本例实现效果为:任何从该设备上读取的进程均被置于休眠。只要某个进程向给设备

6、写入,所有休眠的进程就会被唤醒。staticDECLARE_WAIT_QUEUE_HEAD(wq);staticintflag=0;ssize_tsleepy_read(structfile*filp,char__user*buf,size_tcount,loff_t*pos){pirntk(KERN_DEBUG"process%i(%s)goingtosleep",current->pid,current->comm);wait_event_interruptible(wq,flag!=0);flag=0;printk(KERN_DEBUG"awo

7、ken%i(%s)",current->pid,current->comm);return0;} ssize_tsleepy_write(structfile*filp,constchar__user*buf,size_tcount,loff_t*pos){printk(KERN_DEBUG"process%i(%s)awakeningthereaders...",current->pid,current->comm);flag=1;wake_up_interruptible(&wq);returncount; /*成功并避免重试*/}  阻塞与

8、非阻塞类操作小知识点:操作系统中睡眠、阻塞、挂起的区别形象解释操作系统中睡眠、阻

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。