分类: LINUX
2007-08-07 11:57:17
当时似乎是pdf文档不能下载,而后来发布的文本并不完整。直到 Chapter 4 bcache 中脏
缓冲区的同步机制的4.1 bcache中的脏缓冲区同步操作,就结束了。
却再找不到完全的版本进行继续的阅读,小遗憾~~
在这里有几个问题:
(1) 在 3 .1 缓冲区的分配这一节中,详细介绍了grow_buffers(),
create_buffers(),get_unused_buffer_head三个函数,(层层调用)。
而在普通文件读的 prepare_write 方法包装的block_prepare_write函数调用的__block_prepare_write函数中 调用了
create_empty_buffers (struct page *page, kdev_t dev, unsigned long blocksize)
为页中的所有缓冲区分配bh,这里的page已经存在,就不用像grow_buffers()般需要调用 alloc_page来分配页了。
但create_empty_buffers也调用了 create_buffers()和get_unused_buffer_head。
那么 grow_buffers()和create_empty_buffers()的区别即用途有什么不同么?是否前者针
对块设备文件,后者针对普通文件。create_empty_buffers也算是缓冲区分配的操作么?
(2)在create_buffers()中对该bh对象进行初始化时
bh->b_dev = B_FREE;
//表明这是一个空闲缓冲区,那么就应该是bh处于空闲状态
bh->b_list = BUF_CLEAN;
//那这里是否表示将其链入BUF_CLEAN链表,还是只是记录这个缓冲区应该出现在哪个链表上
因为一旦是lru_list[BUF_CLEAN],该bh就是处于正在使用状态了吧,就与前面矛盾了。
当然,在2.4.18版本中,create_buffers()的代码行bh->b_dev = B_FREE已经变成了
bh->b_dev = NODEV;我反倒觉得这样比较好理解一些。版本更新了的原因,bh的几个状态也与这篇文
章讲述的有些出入了。只是想就这篇文章的概念弄清楚这几个问题了。