当前位置: 技术问答>linux和unix
vfs中inode结构的i_size是什么意思
来源: 互联网 发布时间:2016-04-13
本文导语: (i_size - 1) >> PAGE_CACHE_SHIFT last_block = (i_size - 1) >> blkbits; 看内核源码文件读写的时候,常看到上面这样的表达式,我不明白是什么意思,i_size应该是文件的大小,右移相应位以后应该是什么呢?右移以后代表什么意思呢...
(i_size - 1) >> PAGE_CACHE_SHIFT
last_block = (i_size - 1) >> blkbits;
看内核源码文件读写的时候,常看到上面这样的表达式,我不明白是什么意思,i_size应该是文件的大小,右移相应位以后应该是什么呢?右移以后代表什么意思呢?谢谢大家。我是初学者。请帮忙。
|
i_size -1 的目的是为了得到从0开始的编号!
打个比方,如果刚好 i_size = PAGE_CACHE_SHIFT,那么用i_size >> PAGE_CACHE_SHIFT,得到的是1,而事实上i_size = PAGE_CACHE_SHIFT,一共只有一个PAGE, 所以得到的最后一个PAGE的编号(从0开始)应该是0;所以用了一个简单的编程技巧来得到从0开始的编号:就是(i_size-1) >> PAGE_CACHE_SHIFT;
为什么偏偏是-1,而不是-2,-3,-4 ...呢?
那时因为如果i_size = PAGE_CACHE_SHIFT+1,按上面的公式,最后一个PAGE的编号应该是1(该PAGE的实际大小就是1个字节),如果用 -2, -3, -4 ... 那么得到的最后一块的PAGE编号就变成了0,这和事实不符合!
够罗嗦的了,希望楼主能够明白,其实自己多想想就明白这个道理了。
Good Luck!
打个比方,如果刚好 i_size = PAGE_CACHE_SHIFT,那么用i_size >> PAGE_CACHE_SHIFT,得到的是1,而事实上i_size = PAGE_CACHE_SHIFT,一共只有一个PAGE, 所以得到的最后一个PAGE的编号(从0开始)应该是0;所以用了一个简单的编程技巧来得到从0开始的编号:就是(i_size-1) >> PAGE_CACHE_SHIFT;
为什么偏偏是-1,而不是-2,-3,-4 ...呢?
那时因为如果i_size = PAGE_CACHE_SHIFT+1,按上面的公式,最后一个PAGE的编号应该是1(该PAGE的实际大小就是1个字节),如果用 -2, -3, -4 ... 那么得到的最后一块的PAGE编号就变成了0,这和事实不符合!
够罗嗦的了,希望楼主能够明白,其实自己多想想就明白这个道理了。
Good Luck!
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。