我们都知道Linux为了加速读写速度,采用了pagecache机制,用内存缓存磁盘内容,而buffer_head正是连接page和磁盘块的关键结构.
1.buffer head的作用
1. buffer_head是磁盘块的一个抽象,一个buffer_head对应一个磁盘块,buffer_head中保存对应的磁盘号
2. buffer_head把page与磁盘块联系起来,由于page和磁盘块的大小可能不一样,所以一个page可能管理多个buffer_head
这里假设page大小4K,块大小为1K, buffer_head,page和磁盘块关系如下:
2.page与磁盘块映射的建立
这里以写文件为例说明page cache,buffer_head和磁盘块的映射
采用异步IO方式写文件时,会调用到generic_perform_write函数
2.1 文件写流程
static ssize_t generic_perform_write(struct file *file,
struct iov_iter *i, loff_t pos)
{
do {
/*建立page,BH,磁盘块的映射关系 */
status = a_ops->write_begin(file, mapping, pos, bytes, flags,
&page, &fsdata);
if (unlikely(status))
break;
/*复制用户数据到page */
copied = iov_iter_copy_from_user_atomic(page, i, offset, bytes);
/*标记缓冲区为dirty,等待异步IO完成 */
status = a_ops->write_end(file, mapping, pos, bytes, copied,
} while (iov_iter_count(i));
return written ? written : status;
}
write_bengin和write_end会调用到具体文件系统的实现,这里以ext4为例ext4_write_begin:
static int ext4_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned len, unsigned flags,
Linux中buffer_head与磁盘块映射及BIO提交

最低0.47元/天 解锁文章
3033





