分类: 嵌入式
2012-02-03 02:11:09
第八章主要讲的是阻塞跟非阻塞I/O。要注意,这里不是教我们怎样用I/O,是教我们怎么样在驱动中支持阻塞或非阻塞I/O。
在Linux驱动中,可以使用等待队列来实现阻塞进程的唤醒。我们来看一下源码吧。
这个结构体里面包含了task_struct,可以知道是基于任务列表的。关于具体的操作可以看书。内核中用于改变进程状态的set_current_state()或者_add_current_state()函数直接为current->state赋值也是可以的。
那么我们怎么样支持阻塞与非阻塞呢:看书上例子:
第7行:DECLARE_WAITEQUEUE(wait, current); 这是把当前进程定义为等待队列。注意current在内核当中就是代表当前进程。
第10行:add_wait_queue(&dev->r_wait, &wait); 这是把刚才定义的等待队列放到度等待队列。
接下去的循环好理解,当还没有内容的时候,如果非阻塞的话,就跳出去,如果阻塞,则把当前进程睡眠了。注意测试是否阻塞的方法:测试filp->f_flags是否设置了非阻塞。
下面一节是关于轮询的,select和poll用的可够多了吧,那怎么支持他们呢。其实他们两个对应的文件操作是poll,我们实现这个函数的时候,主要是内核中的poll_wait操作。这个函数的作用是把当前进程添加到wait参数指定的等待列表中,还有就是返回的时候要返回设备资源的可获取状态。具体看例子就可以了。突然对poll和epoll的实现感兴趣。好吧,明天深入追踪一下源码,写一篇博客。