假设您在 scull 驱动程序中将量子区域大小设置为 4000 字节,并将 qset 数组大小设置为 10。在这种情况下,itemsize 的值将是 40000。f_pos 是读/写应该开始的位置,它作为参数来读/写功能。假设读取请求来了,f_pos 是 50000。
现在,item = (long)*f_pos / itemsize; 所以项目将是 50000/40000 = 1
休息 = (long)*f_pos % 项目大小;所以休息将是 50000%40000 = 10000
s_pos = 休息/量子;所以 s_pos 将是 10000/4000 = 2
q_pos = 剩余 % 量子;所以 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 的计算证明的。由于 item 为 1,它将指向第二个 scull_qset(第一个 scull_qset 的 item 的值为 0,更多信息请参见 scull_follow 函数定义)。
rest 的值将有助于找出第二个 scull_qset 读取应该从哪个位置开始。由于每个量子区域为 4000 字节,s_pos 给出了第二个 scull_qset 的 10 个指针中应该使用哪个指针,并且 qset 告诉在 s_pos 中找到的指针指向的特定量子区域中,应该从哪个特定位置开始读取。