红联Linux门户
Linux帮助

关于《linux设备驱动程序》第三版 第三章 read方法中item = (long)*f_pos/itemsize

发布时间:2011-04-11 19:03:06来源:红联作者:stephenyong
你的一个scull里面盛放的是一个链表scull_qset,一个链表又有许多的链表项(item)组成,而每个item中又存放了1000个指针(也就是这个item中数组的大小quanset),这些指针中,每个指针都可以指向一块内存,这块内存大小就是quantum(也就是书上讲的4000),那么,这一个item就可以操作的内存大小itemsize=(item中的指针数)*(每个指针可以指向的内存大小,也就是量子大小)=quanset*quantum=1000*4000,对吧?这个应该可以理解吧?
接下来我们看看(long) *f_pos,这个指针变量就是我们文件相对于文件起始位置的偏移量啊,用(long) *f_pos表示一个长整形,可以取的大小为0--2^64-1,这是文件的最大范围。注意不能超过他,否则goto out;我们假设现在这个数没有超过,那么,想一想,这个链表的每一项item所能操作的内存大小是多少?
不就是itemsize么?
如果你的这个(long)*f_pos超过一个itemsize怎么办?比如现在(long)*f_pos=4 000 001,那么当程序读完第一个item中的4000 000个字节以后,就要到链表项的第二个item开始读啊!对吧?那么我们怎么知道我要从第几个链表项开始读?
就用(long)*f_pos/itemsize 来算,还是刚才的假设,(long)*f_pos=4 000 001,又因为itemsize=4000 000
所以(long)*f_pos/itemsize =?应该为1,这不就是第二个链表项吗?注意,c语言从0开始计数(这个估计大家都知道,呵呵)。
在注意一下,刚才的(long)*f_pos/itemsize =1,那么(long)*f_pos%itemsize =?,也是1,这个是item中的偏移量,可以认为是哪个指针数组的偏移量,它就从第一个指针开始取数,第一个指针指向的是第二个item的第一个量子,ok


申明:因为本人也是菜鸟,所以可能解释的不一定对,希望大虾批评指正,谢谢!
文章评论

共有 3 条评论

  1. 于 2012-08-14 21:45:00发表:

    太感谢了,就需要有这样的明白人来解答问题啊

  2. long_007 于 2012-05-04 15:10:30发表:

    多谢提点~呵呵~~~

  3. dfwclm 于 2011-04-11 21:05:41发表:

    楼主还是菜鸟那我真无地自容了