ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux 在 scull 中使用旗标

2019-07-06 09:53:35  阅读:284  来源: 互联网

标签:旗标 struct dev linux quantum sem scull


旗标机制给予 scull 一个工具, 可以在存取 scull_dev 数据结构时用来避免竞争情况. 但是正确使用这个工具是我们的责任. 正确使用加锁原语的关键是严密地指定要保护哪个 资源并且确认每个对这些资源的存取都使用了正确的加锁方法. 在我们的例子驱动中, 感 兴趣的所有东西都包含在 scull_dev 结构里面, 因此它是我们的加锁体制的逻辑范围.

让我们在看看这个结构: struct scull_dev {

struct scull_qset *data; /* Pointer to first quantum set */ int quantum; /* the current quantum size */

int qset; /* the current array size */

unsigned long size; /* amount of data stored here */

unsigned int access_key; /* used by sculluid and scullpriv */ struct semaphore sem; /* mutual exclusion semaphore */

struct cdev cdev; /* Char device structure */

};

 

到结构的底部是一个称为 sem 的成员, 当然, 它是我们的旗标. 我们已经选择为每个虚 拟 scull 设备使用单独的旗标. 使用一个单个的全局的旗标也可能会是同样正确. 通常 各种 scull 设备不共享资源, 然而, 并且没有理由使一个进程等待, 而另一个进程在使 用不同 scull 设备. 不同设备使用单独的旗标允许并行进行对不同设备的操作, 因此, 提高了性能.

旗标在使用前必须初始化. scull 在加载时进行这个初始化, 在这个循环中: for (i = 0; i < scull_nr_devs; i++) {

scull_devices[i].quantum = scull_quantum;

scull_devices[i].qset = scull_qset; init_MUTEX(&scull_devices[i].sem); scull_setup_cdev(&scull_devices[i], i);

}

 

注意, 旗标必须在 scull 设备对系统其他部分可用前初始化. 因此, init_MUTEX 在 scull_setup_cdev 前被调用. 以相反的次序进行这个操作可能产生一个竞争情况, 旗标 可能在它准备好之前被存取.

 

下一步, 我们必须浏览代码, 并且确认在没有持有旗标时没有对 scull_dev 数据结构的 存取. 因此, 例如, scull_write 以这个代码开始:

 

if (down_interruptible(&dev->sem))

 

return -ERESTARTSYS;

 

注意对 down_interruptible 返回值的检查; 如果它返回非零, 操作被打断了. 在这个情 况下通常要做的是返回 -ERESTARTSYS. 看到这个返回值后, 内核的高层要么从头重启这 个调用要么返回这个错误给用户. 如果你返回 -ERESTARTSYS, 你必须首先恢复任何用户 可见的已经做了的改变, 以保证当重试系统调用时正确的事情发生. 如果你不能以这个方 式恢复, 你应当替之返回 -EINTR.

 

scull_write 必须释放旗标, 不管它是否能够成功进行它的其他任务. 如果事事都顺利, 执行落到这个函数的最后几行:

 

out:

up(&dev->sem); return retval;

 

这个代码释放旗标并且返回任何需要的状态. 在 scull_write 中有几个地方可能会出错; 这些地方包括内存分配失败或者在试图从用户空间拷贝数据时出错. 在这些情况中, 代码 进行了一个 goto out, 以确保进行正确的清理.

标签:旗标,struct,dev,linux,quantum,sem,scull
来源: https://www.cnblogs.com/fanweisheng/p/11141647.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有