1

我正在通过 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; 

我徒劳地花了很长时间(并且仍在努力)。有人可以帮我理解上述代码片段的功能吗?

问候,

罗伊

4

1 回答 1

3

假设您在 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 中找到的指针指向的特定量子区域中,应该从哪个特定位置开始读取。

于 2013-09-24T09:38:16.180 回答