原帖由 qtdszws 于 2007-6-19 10:27 发表于 1楼
设备文件和设备上的文件都可以被映射
文件被映射时,都是按照逻辑块顺序被映射到连续的虚拟地址空间和物理页中
而文件在设备上的块是乱序的
如果块大小<物理页大小,那么设备文件和设备上的文件同时 ...
原帖由 qtdszws 于 2007-6-19 12:19 发表于 3楼
假如块大小为1k,文件f的开头四个块为a,b,c,d(不连续)
则mmap该文件后A
物理页|-------------------------------------------------|
块 |----a----|----b----|----c-----|-------d--------|
再映射该设 ...
原帖由 qtdszws 于 2007-6-19 14:14 发表于 5楼
在buffer层上,设备上的块是由设备号和块号唯一确定
按照你的解释,不就有了两个同样的buffer_head结构了吗?
原帖由 qtdszws 于 2007-6-19 14:54 发表于 7楼
>>则读写是以page为单位的而不是以block为单位的,所以不需要buffer_head。
那么你的这些数据是如何来的呢?是不是也要经过buffer层(buffer_head)从设备读取呢?
原帖由 qtdszws 于 2007-6-19 17:52 发表于 9楼
看了一下代码,发现还真可以存在两个一样的buffer_head(dev,block)
映射设备操作
v2.4.32
文件/dev/sda1
1.打开设备
fp=fopen("/dev/sda1","r");
sys_open->...->ext2_rea ...
原帖由 塑料袋 于 2007-6-20 11:23 发表于 12楼
确实有bufferCache这一层呀。
在page的hash表中的page既为pagecache,在buffer_head的hash表中的buffer_head既为bufferCache。
但是在2.4.x版本的kernel中,对buffer_head这个结构的处理变化很大。
以 ...
原帖由 zx_wing 于 2007-6-19 14:38 发表于 6楼
首先没有所谓的buffer层,其次buffer_head只是把page cache中的page细分成以block为单位。当你用以文件的方式打开一个文件的时候,如果文件没有hole,则读写是以page为单位的而不是以block为单位的,所以不需 ...
原帖由 思一克 于 2007-6-20 17:22 发表于 14楼
当你用以文件的方式打开一个文件的时候,如果文件没有hole,则读写是以page为单位的而不是以block为单位的,所以不需要buffer_head
??
详细的解释?
原帖由 思一克 于 2007-6-20 17:22 发表于 14楼
当你用以文件的方式打开一个文件的时候,如果文件没有hole,则读写是以page为单位的而不是以block为单位的,所以不需要buffer_head
??
详细的解释?
原帖由 塑料袋 于 2007-6-20 18:05 发表于 17楼
写一个page的最一般化,理想化的过程:
1) 写了page后,置PG_Dirty
2) 将page关联的buffer_head置bh_dirty后,清PG_Dirty
3) 由bdflush启动写磁盘,或者进程自己直接submit_bh
表现在kerne ...
原帖由 塑料袋 于 2007-6-20 18:05 发表于 17楼
写一个page的最一般化,理想化的过程:
1) 写了page后,置PG_Dirty
2) 将page关联的buffer_head置bh_dirty后,清PG_Dirty
3) 由bdflush启动写磁盘,或者进程自己直接submit_bh
表现在kerne ...
原帖由 思一克 于 2007-6-20 18:58 发表于 20楼
我是问
"则读写是以page为单位的而不是以block为单位的,所以不需要buffer_head
"
原帖由 zx_wing 于 2007-6-20 19:26 发表于 21楼
哦,这个是因为对于以regular file方式打开的文件的,读写的时候kernel以page为单位管理page cache,这个时候一个页不会被分成多个block,所以就没有对应的buffer_head结构。
我不太清楚2.4内核的时候是否 ...
原帖由 思一克 于 2007-6-20 19:44 发表于 22楼
没有bh的原因是block的大小等于page大小.
你前边说linux ext2 block大小一般是1024. 不是的, 一般是4096.
原帖由 qtdszws 于 2007-6-20 17:47 发表于 15楼
塑料袋 2.4.32中
2)...但是只有块设备文件的page所关联的buffer_head,才能进入buffer_head的hash表...
没找到具体的代码,能否指定一下
原帖由 塑料袋 于 2007-6-20 20:56 发表于 24楼
见grow_buffers函数
所有增加buffercache的操作,归根到底是要调用grow_buffers。这个应该没疑问。
grow_buffers在2.4.32的实现是以( block_device->bd_inode->i_mapping,index)为唯一索引 ...
原帖由 zx_wing 于 2007-6-20 21:08 发表于 25楼
在2.4中,用文件方式读写而不用打开设备文件的方式读写,也会调用到 grow_buffers分配buffer page吗?
原帖由 塑料袋 于 2007-6-20 21:17 发表于 26楼
没看明白,你是指的:
文件方式读写==读写regular文件
打开设备文件方式读写==读写块设备文件??
原帖由 塑料袋 于 2007-6-20 21:42 发表于 28楼
无论怎么写文件,都不会调用grow_buffers。只有那些诸如ext2_get_block,ext2_unlink,ext2_alloc_branches......这些以文件系统的管理为目的的函数才会直接调用getblk---->grow_buffers。
不论写什么文件 ...
原帖由 塑料袋 于 2007-6-20 21:42 发表于 28楼
无论怎么写文件,都不会调用grow_buffers。只有那些诸如ext2_get_block,ext2_unlink,ext2_alloc_branches......这些以文件系统的管理为目的的函数才会直接调用getblk---->grow_buffers。
不论写什么文件 ...
原帖由 zx_wing 于 2007-6-20 20:32 发表于 23楼
>>没有bh的原因是block的大小等于page大小.
我想不是这样的,这个可以通过源码来证明。以读为例子,我们从regluar file的read操作中和page cache打交道的函数do_generic_mapping_read()开始(这里只 ...
原帖由 zx_wing 于 2007-6-21 13:55 发表于 32楼
如果版主坚持这么认为,我也没有办法。但我可以非常确定的在2.6内核中不是你说这样。
原帖由 思一克 于 2007-6-21 14:06 发表于 33楼
我的也是2.6.13 KERNEL。盘是6G, 8G, 20G, ext2.
你是用什么看出block大小是1024的(也可能在你特定安装环境下就是)?
原帖由 zx_wing 于 2007-6-21 14:15 发表于 34楼
这个是我印象中的大小,昨天我也查了不少资料,但没查到。源码跟了一遍,也没跟到默认值。所以我想知道版主说ext2上默认4k的大小是从哪儿得来的。
原帖由 塑料袋 于 2007-6-21 14:31 发表于 36楼
blocksize应该是1024
在ext2_read_super中决定了块的大小
首先是默认的BLOCK_SIZE,定义于fs.h,是1<<10
原帖由 思一克 于 2007-6-21 14:24 发表于 35楼
你印象的那就不行了。也不用查资料。你下载可lde(linux disk editor)一看不就知道了。
block_dev 中的bd_block_size
sb 中的 s_blocksize 都是是这个数值。
可以printk出来看。
原帖由 思一克 于 2007-6-21 14:31 发表于 37楼
我不是坚持,也不是认为,
而是用程序实验了结论:读FAT分区的普通文件后,每一个page(cached)都有buffer_head.
读EXT2的文件后没有。
所以”读普通文件不用buffer_head"至少在读FAT分区文件是不对的 ...
原帖由 zx_wing 于 2007-6-21 14:40 发表于 39楼
好的,等忙完手上的工作,我会在block_size函数中加printk看看。
但我仍会试着找到有决定性证明的资料。因为这种通过“看”得到的信息不可靠,很可能换个平台就不一样了。例如我一直认为x86平台上linux默认的 ...
原帖由 思一克 于 2007-6-21 14:40 发表于 40楼
这是用一个程序输出的结果。
super blocks list for all file systems:
sb c12b8a00 type c03a8680 sysfs -- blksize 4096 s_root c12b28c0 / bdev 00000000
sb c12b8800 type c03a9140 ...
原帖由 zx_wing 于 2007-6-21 14:40 发表于 39楼
好的,等忙完手上的工作,我会在block_size函数中加printk看看。
但我仍会试着找到有决定性证明的资料。因为这种通过“看”得到的信息不可靠,很可能换个平台就不一样了。例如我一直认为x86平台上linux默认的 ...
原帖由 zx_wing 于 2007-6-21 14:42 发表于 41楼
请讲述一下你是如何实验证明出每一个page都分配了buffer_head结构的。
原帖由 塑料袋 于 2007-6-21 14:53 发表于 45楼
我截获的不一定是默认值,而且对于linux下的那些工具也不怎么会使。
但是首先是默认的1024,
然后hardsect_size做一修改,这种修改除非hardsect_size>1024才发生
然后以1024为块大小读sb
然后以sb-> ...
原帖由 思一克 于 2007-6-21 14:54 发表于 46楼
读文件后,找到文件的address_space, 找到所以影射的pages,
如果
page_has_buffers(page)
为真,
打印出各buffer_head.
page_bufers(page)
你可以试图做以下看。很有意思的。
原帖由 zx_wing 于 2007-6-21 15:13 发表于 48楼
page_has_buffers??2.6内核中有这个函数吗?在哪儿?要检测一个页是否是buffer page,只要看PG_private标志就行了啊。
这个实验原理简单,但实现麻烦,还要专门写个module,如果版主能给出源码最好,没有就 ...
原帖由 qtdszws 于 2007-6-21 12:19 发表于 30楼
是否可以说,
在v2.4.0中,对普通文件的读写的buffer_head不进入hash,对设备文件的读写和文件系统的metadata进行读写的buffer_head进入hash
在v2.4.32中,对普通文件的读写和对设备文件的读写的buffer_hea ...
原帖由 qtdszws 于 2007-6-19 10:27 发表于 1楼
设备文件和设备上的文件都可以被映射
文件被映射时,都是按照逻辑块顺序被映射到连续的虚拟地址空间和物理页中
而文件在设备上的块是乱序的
如果块大小<物理页大小,那么设备文件和设备上的文件同时 ...
原帖由 qtdszws 于 2007-6-21 12:19 发表于 30楼
在v2.4.0中,对普通文件的读写的buffer_head不进入hash,对设备文件的读写和文件系统的metadata进行读写的buffer_head进入hash
在v2.4.32中,对普通文件的读写和对设备文件的读写的buffer_head都不进入hash,只有对文件系统的metadata进行读写的buffer_head才进入hash
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |