Page和Buffer Head的区别

本文详细解释了Linux内核中的page结构体与BufferHead结构体的作用。page用于描述实际物理内存信息,通常为4KB大小;而BufferHead则用于记录物理内存映射到块设备的具体偏移位置。两者通过相互引用彼此的指针来共同维护内存数据及其位置信息。

1. page

结构体struct page定义在/include/linux/mm_types.h,大小是32字节。描述的是一片实际物理内存信息,一般是4K大小,简称页。在这32字节里面保存有状态信息,和文件系统,内存交换等方面的信息,唯独没有保存物理内存的偏移,即其代表4K是物理内存什么位置的4K。

这个信息实际是被隐式保存起来了,因为所有的struct page结构体都共同保存在同一个mem_map数组里面,数组下标实际就是物理内存位置。因此page就代表了内存。


2. Buffer Head

Buffer Head的结构体定义在/include/linux/buffer_head.h。一般不容易理解其作用,代码上也经常和page混在一起。它其实表针的不是内存,虽然名称里面有buffer字眼。它实际代表的是物理内存映射的块设备偏移位置。

举个简单例子,从块设备/dev/block/sda的第512 sector上的读取一个4K大小的数据,需要用一个page结构来缓存这个数据,而这个512 sector偏移这个信息则由buffer_head来保存。


所以page是存数据,buffer_head是存偏移。两个结构体内部互有指针保存相互的地址。一般一个buffer_head也表征4K大小,这样一个buffer_head正好对应一个page。某些文件系统可能采用更小的block size,例如1K,或者512字节。这样一个page最多可以用4或者8个buffer_head结构体来描述其内存对应的物理磁盘位置。


在Linux内核中,`struct buffer_head` `struct bio` 是两个与块设备I/O操作相关的数据结构,但它们的作用使用场景有所不同。 ### `struct buffer_head` - **用途**:`buffer_head` 是早期Linux内核中用于管理块设备I/O的基本结构,主要用于缓冲区管理。 - **特点**: - 每个 `buffer_head` 结构对应一个固定大小(通常是512字节或4KB)的缓冲区。 - 它包含指向实际数据缓冲区的指针、缓冲区状态(如是否被修改、是否被锁定等)、所属的块设备信息等。 - 主要用于传统的基于缓冲区的I/O操作。 - **缺点**: - 灵活性差,难以处理大块I/O或多段I/O。 - 性能受限,尤其是在处理大文件或高并发I/O时。 ### `struct bio` - **用途**:`bio` 是为了支持更高效的I/O操作而引入的结构,用于表示一次I/O请求的数据块。 - **特点**: - `bio` 可以表示多个不连续的内存页(page),支持多段I/O(scatter-gather I/O)。 - 每个 `bio` 结构包含一个或多个 `bio_vec`,每个 `bio_vec` 描述一个内存页中的数据块。 - 与块层(block layer)紧密集成,支持异步I/O、DMA等高级特性。 - **优势**: - 更适合现代硬件的需求,尤其是支持大块I/O高性能存储设备。 - 提高了I/O吞吐量系统性能。 ### 总结对比 | 特性 | `struct buffer_head` | `struct bio` | |--------------------|--------------------------------|----------------------------------| | 数据表示 | 固定大小的缓冲区 | 支持多个不连续的内存页 | | 多段I/O支持 | 不支持 | 支持 | | 性能 | 相对较低 | 高性能 | | 使用场景 | 传统文件系统块设备操作 | 现代块设备、文件系统异步I/O操作 | ### 示例代码(`bio` 的基本使用) ```c struct bio *bio = bio_alloc(GFP_KERNEL, 1); // 分配一个bio结构 bio->bi_iter.bi_sector = sector; // 设置起始扇区 bio_set_dev(bio, bdev); // 设置块设备 bio->bi_end_io = my_end_io; // 设置I/O完成回调 bio_add_page(bio, page, len, offset); // 添加数据页 submit_bio(bio); // 提交bio ``` ### 注意事项 - `buffer_head` 已逐渐被 `bio` 取代,现代内核中更多使用 `bio` 来处理I/O请求。 - 文件系统如ext4、XFS等都使用 `bio` 来进行高效的I/O操作。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值