gpt4 book ai didi

linux - 来自 LDD 的 scull 驱动程序 - scull_read 和 scull_write

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:59 25 4
gpt4 key购买 nike

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

我已经在它上面白费了很多时间(并且仍在努力)。有人可以帮助我理解上述代码片段的功能吗?

问候,

罗伊

最佳答案

假设您在 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 = 静止/量子;所以 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 中找到的指针指向的特定量子区域中,读取的特定位置应该开始。

关于linux - 来自 LDD 的 scull 驱动程序 - scull_read 和 scull_write,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18961439/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com