块设备分析

本文深入探讨了Linux内核中的块设备,包括扇区、块、块设备缓冲区(buffer_head结构体)、通用块层核心数据结构bio、磁盘对象描述符gendisk、请求队列request_queue以及请求描述符request等关键概念。详细解析了这些结构的功能和作用,如数据传输的基本单位、内存管理、I/O操作的调度和控制等。
摘要由CSDN通过智能技术生成

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];    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值