1) 他的旧版说的是2.4,当时page cache用做文件页的缓冲,page的键值是(inode, pgoff );buffer cache用做文件系统metadata的缓冲,buffer的键值是( bdev, 块号)
2) page cache中的页4K,文件系统的块1K,那么一个文件页很可能对应到4个离散的磁盘块。
3) 是的 问题一:
如读一个磁盘文件file1时,分为如下两步:(1)首先要读包含file1 inode结点的磁盘块;(2)读file1的内容;
那么
(1)中读的内容放在块高速缓存中,其树根是与块设备相关的bdev文件系统中索引节点的address_space对象?
address_space 是文件物理“内容”的连续内存的逻辑体现。
。。。我没看懂你问题。
inode和本身存储空间 和 inode描述空间 不一样。
inode本身的空间应该由 buffer head 描述,属于文件的metadata
inode描述对应的address_space 就是文件内容。
(2)中读的内容放在页高速缓存中,其树根是file1 inode对象的address_space中?
看上面。
树根是啥东西?
问题二:
ULK3 P610
“下面是内核创建缓冲区页的两种普通情况:”
(1)当读或写的文件页在磁盘块中不相邻时。发生这种情况是因为文件系统为文件分配了非连续的块,或因为文件中”洞“。
(2)当访问一个单独的磁盘块时(例如,当读超级块或索引节点块时)。
“当读或写的文件页在磁盘块中不相邻时。”这一句不太理解,能否给解释一下?文件页是个什么概念?
我感觉我上面的问题应该回答你了。
文件在内存中是连续的(address_space) 在磁盘中不一定连续 。怎么实现?没啥魔法文件系统的作者要 搞定他,自己实现readpage function 提取一个文件1或者n个page的内容 到指定page就好了。
所以在pagecache启动 的时候。 你读写文件都是先添完善addressspace 往里面加page ,然后在填充 page内容 。 组成连续的内容。
问题三:
通过dd if=/dev/sda1 of=/tmp/file1 count=1024 blocksize=1M,这样读sda1时,读到的内容也放在bdev文件系统中块设备文件的高速缓存吗?
运行之后如果内存够用。所有的内容都在 pagecache里面
“bdev文件系统中块设备文件的高速缓存”这个概念不对。
pagecache就是个 表。可以包含多个bdev设备 。。。。
页:
[1]