我正在从Rubini那里学习LDD来学习驱动程序编程。目前,我正在阅读第3章 - 编写字符驱动程序“scull”。但是,在作者提供的示例代码中,我无法理解scull_read()和scull_write()方法中的以下行:
item = (long)*f_pos / itemsize;
rest = (long)*f_pos % itemsize;
s_pos = rest / quantum;
q_pos = rest % quantum;
我花了很多时间徒劳(并且还在努力)。有人可以帮我理解上面代码片段的功能吗?
此致
罗伊
答案 0 :(得分:3)
假设您已将scull驱动程序中的量程区域大小设置为4000字节,并且qset数组大小设置为10.在这种情况下,itemsize的值将为40000. f_pos是读取/写入应该从哪里开始的位置,这将是读/写功能的参数。假设读取请求已经到来且f_pos为50000。
现在, item =(long)* f_pos / itemsize;所以项目将是50000/40000 = 1
rest =(long)* f_pos%itemsize;所以休息将是50000%40000 = 10000
s_pos = rest / quantum;所以s_pos将是10000/4000 = 2
q_pos = rest%quantum;所以q_pos将是10000%4000 = 2000
如果您仔细阅读了第3章中scull驱动程序的描述,那么每个scull设备都是一个链接的指针列表(scull_qset),在我们的例子中,每个scull_qset指向指向4000字节量子区域的指针数组。设置量子区域大小为4000字节,在我们的例子中数组大小为10.因此,我们的每个scull_qset是一个包含10个指针的数组,每个指针指向4000个字节。因此,一个scull_qset的容量为40000字节。
在我们的读取请求中,f_pos是50000,所以显然这个位置不会出现在第一个scull_qset中,这可以通过计算项目来证明。当item为1时,它将指向第二个scull_qset(第一个scull_qset的item值为0,有关更多信息,请参阅scull_follow函数定义)。
休息值有助于找出第二个scull_qset读取应该从哪个位置开始。由于每个量子区域为4000字节,s_pos给出第二个scull_qset的10个指针,该指针应该被使用,而qset告诉在s_pos中找到的指针所指向的特定量子区域中,应该从哪个特定位置开始读取。