免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2106 | 回复: 5
打印 上一主题 下一主题

[内存管理] 关于buffer head 和 page table 的dirty 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-05-08 10:59 |只看该作者 |倒序浏览
本帖最后由 smartegg 于 2013-05-08 11:19 编辑

最近在研究linux ext2 文件系统的代码, 里面会经常 调用 mark_buffer_dirty 操作。
但是 我的理解是 buffer_head 是有线性地址空间的(也就是有 pte 的).
       cpu 不是会自动把 pte 设置为 dirty 么(假如把buffer head 对应的page 修改了的话)?
       为啥还要自己手动把 buffer 设置为 BH_DIRTY 呢?  反正cpu 会把对应的 pte  设置为dirty 吧?
还是说我哪里完全理解错了.


小菜鸟求教了   

论坛徽章:
0
2 [报告]
发表于 2013-05-08 11:57 |只看该作者
buffer_head是内核的数据结构,不是页表项,所以必须由内核管理,而不是cpu的mmu自动管理

论坛徽章:
0
3 [报告]
发表于 2013-05-08 13:24 |只看该作者
回复 2# aweii

谢谢你的回复。

  我脑袋还是转不过来这个弯。

我老觉得觉得 只要对 buffer_head  指向的数据修改了, 肯定就对应的 pte  被cpu设置dirty了吧?
或者说:
当VM发现一个page dirty时,应该是会调用set_page_dirty()设置该page以及所属的buffer head为dirty。
然后,在适当的时候,会通过writepage()写到磁盘上去。

那么在开发文件系统时,手动调用mark_buffer_dirty  老觉得重复dirty  了呢?

论坛徽章:
0
4 [报告]
发表于 2013-05-08 23:08 |只看该作者
回复 3# smartegg


   多个BH可以指向同一个page内的不同offset,所以page dirty并不意味着这些BH都应该是dirty的,只需要把mark为dirty的BH写回到设备,减少I/O操作。历史上BH是作为fs与block层之间的I/O unit,以sector为单位(typically 512B)。

论坛徽章:
0
5 [报告]
发表于 2013-05-09 10:07 |只看该作者
回复 4# jinuxstyle

恩, 这点我也想过。
    比如 ext2 的  block size 如果是1024 的话, 那么 buffer head 的大小为 1024, 也就是一个page  可以放4个 buffer
head.  
     但是假如一个文件系统 的 block size 为 4096的话, buffer head 也就是4096了吧(一个page对应一个buffer head)? 是不是在这时候就可以不mark_buffer_dirty了呢?
   

论坛徽章:
0
6 [报告]
发表于 2013-05-10 00:11 |只看该作者
回复 5# smartegg


如果FS的block size和page size一样大,确实对mark_buffer_dirty显得多余,事实上很多文件系统就没有调用这个函数,更多的依赖于page cache 而不是buffer head,如btrfs。
在它们的size不一样大的情况下,mark_buffer_dirty还是有必要的,因为一个page的buffer head 是动态建立的,而且不是每次写一个新建立的buffer head都会触发vmm对set_page_dirty的调用。(个人理解和分析,没有经过实验论证,仅作为参考)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP