- 论坛徽章:
- 0
|
本帖最后由 xshenpan 于 2014-12-01 14:07 编辑
正在看《linux设备驱动开发详解》 宋宝华 写的
看到代码有些疑问,代码如下,问题就是顶格用双斜线“//"注释的地方
- static ssize_t globalfifo_read(struct file *filp,char __user *buf,size_t count,loff_t *ppos)
- {
- int ret = 0;
- struct globalfifo_dev *dev = filp->private_data;
- /* 定义等待队列 */
- DECLARE_WAITQUEUE(wait,current);
- /* 获得信号量 */
- down(&dev->sem);
- /* 进入读等待队列头 */
- add_wait_queue(&dev->r_wait,&wait);
- /* 等待FIFO有数据(非空)*/
- while(dev->current_len == 0){
- /* 如果是以非阻塞方式访问则返回 */
- if(filp->f_flags & O_NONBLOCK){
- ret = -EAGAIN;
- goto out;
- }
- /* 将进程改为睡眠态,可被信号打断,此时进程还未睡眠 */
- __set_current_state(TASK_INTERRUPTIBLE);
- /* 在睡眠之前释放信号量,以免发生死锁 */
- // 如果在调用schedule之前发生了进程切换会怎样
- up(&dev->sem);
- /* 进行进程调度 */
- schedule();
- /* 在调用完schedule之后,进程已经睡眠 */
- /* 如果进程被信号** */
- if(signal_pending(current)){
- ret = -ERESATRTSYS;
- goto out2;
- }
- /* 否则,则不是被信号**,而全局内存区有数据了 */
- /* 此时,要获取信号量 */
- // 这句能否放在循环外面
- down(&dev->sem);
- }
-
- // down(&dev->sem);
- /* 如果想要得到的长度大于了当前长度 */
- if(count > dev->current_len)
- count = dev->current_len;
-
- if(copy_to_user(buf,(void*)(dev->mem),count)){
- ret = -EFAULT;
- goto out;
- }
- else{
- /* 将内存空间的数据前移到dev->mem位置 */
- memcpy(dev->mem,dev->mem+count,dev->current_len - count);
- dev->current_len -= count;
- printk(KERN_INFO"read %d bytes(s),current len %d\n",count,dev->current_len);
- /* 此时,读走了数据则mem空间不是满的了,可以**写进程 */
- wake_up_interruptible(&dev->w_wait);
- ret = count;
- }
- out:up(&dev->sem);
- /* 这里移除的是写等待队列,当读进程被**时
- 肯定被写进程移除了读等待队列 */
- out2:remove_wait_queue(&dev->w_wait,&wait);
- // 为什么要在这里才改变状态,能不能在前面改变
- set_current_state(TASK_RUNNING);
- return ret;
- }
复制代码 还请帮忙看下我写的注释对吗?
感觉驱动学的一头雾水,,不知道这些驱动为什么要这样写 |
|