1、磁盘上的数据时通过其首个扇区号和扇区数目表示的
2、扇区是硬件传送数据的基本单位,块是vfs和文件系统传送数据的基本单位
3、linux中块大小必须是2的幂且不能超过一页大小
4、块设备的块大小不是唯一的创建文件系统时可以指定
5、每个块都需要有块设备缓冲区,缓冲区首部是一个buffer_head结构体
struct buffer_head {
/* First cache line: */
unsigned long b_state; /* buffer state bitmap (see above) */
struct buffer_head *b_this_page;/* circular list of page's buffers */
struct page *b_page; /* the page this bh is mapped to */
atomic_t b_count; /* users using this block */
u32 b_size; /* block size */
sector_t b_blocknr; /* block number */
char *b_data; /* pointer to data block */
struct block_device *b_bdev;
bh_end_io_t *b_end_io; /* I/O completion */
void *b_private; /* reserved for b_end_io */
struct list_head b_assoc_buffers; /* associated with another mapping */
};
6、通用块层核心数据结构bio
struct bio {
sector_t bi_sector; //块io操作的第一个磁盘扇区
struct bio *bi_next; //链接到请求队列中的下一个bio
struct block_device *bi_bdev;//指向块设备描述符的指针
unsigned long bi_flags; //bio的状态标志
unsigned long bi_rw; //io操作的标志。或读-0或写-1
unsigned short bi_vcnt; //bi_io_vec数组中段的数目
unsigned short bi_idx; //bi_io_vec数组中当前段的索引
/* Number of segments in this BIO after
* physical address coalescing is performed.
*/
unsigned short bi_phys_segments;//合并之后bio中物理段的数目
unsigned short bi_hw_segments;//合并之后硬件段的数目
unsigned int bi_size; //需要传送的字节数
unsigned int bi_hw_front_size;//硬件段合并算法使用
unsigned int bi_hw_back_size;//硬件段合并算法使用
unsigned int bi_max_vecs; //bi_io_vec数组中允许最大段的数目
struct bio_vec *bi_io_vec; //指向bio数组中段的指针
bio_end_io_t *bi_end_io;//bio中io操作结束时回调的方法
atomic_t bi_cnt; //此bio引用计数器
void *bi_private;//通用块层完成方法使用的指针
bio_destructor_t *bi_destructor; //释放bio回调方法
struct bio_set *bi_set; //内存池相关
};
7、当通用块层启动一个新的io操作时候会调用bio_alloc分配一个新的bio结构且会分配bio_vec数组所使用空间
8、磁盘对象描述符gendisk
struct gendisk {
int major; //主设备号
int first_minor; //与磁盘关联的第一个次设备号
int minors; //次设备数量
char disk_name[32];