Linux 页高速缓存之buffer head

Linux中buffer_head与磁盘块映射及BIO提交

我们都知道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,
            
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值