免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2886 | 回复: 2

一个page的block可以来自不连续的物理地址吗? [复制链接]

论坛徽章:
0
发表于 2007-08-04 18:44 |显示全部楼层
在2.6中读一个普通文件时会通过下面调用来实现:
sys_read()->vfs_read()->generic_file_read()->__generic_file_aio_read()
->do_generic_file_read()->do_generic_mapping_read()->mpage_readpage()
->do_mpage_readpage()

而在do_mpage_readpage函数中有这么一段:(.../fs/Mpage.c about line 209)
static struct bio *
do_mpage_readpage(struct bio *bio, struct page *page, unsigned nr_pages,
                        sector_t *last_block_in_bio, get_block_t get_block)
{
......
                /* Contiguous blocks? */
                if (page_block && blocks[page_block-1] != bh.b_blocknr-1)
                        goto confused;
......
}
这段代码在判断这个page中相邻的两个block的物理地址是否邻接,
如果不是就跳到一个出错处理的代码段中。
可以说在一个page中的相邻的block的物理地址也是相邻的吗?

但是一些书中都说一个page中的block可以来自不连续的物理块:
Formally, a buffer page is a page of data associated with additional descriptors called "buffer heads ," whose main purpose is to quickly locate the disk address of each individual block in the page. In fact, the chunks of data stored in a page belonging to the page cache are not necessarily adjacent on disk.
《Understanding the Linux Kernel》 3rd Edition. 15.2节

我也觉得没有必要连续,但是上面的代码有应该怎样理解呢?
请各位指点迷津!

谢谢谢谢!!

论坛徽章:
0
发表于 2007-08-04 20:49 |显示全部楼层

回复 #1 pennyliang 的帖子

confused处是代表出错吗?

论坛徽章:
0
发表于 2007-08-04 21:58 |显示全部楼层
OH,是我看错了,confused不是出错处理。
block_read_full_page()在confused被调用,当page中的block不是连续时
跳到这个函数来处理,这个函数就是为这个page的每个block分配一个bio。
这样就没有连不连续的问题了。

谢谢:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP