linux块设备驱动之make_request与request 分别创建内存虚拟磁盘

这篇博客详细介绍了Linux块设备驱动中如何使用make_request和request函数创建内存虚拟磁盘的过程。从APP的读写操作开始,经过VFS虚拟文件层,到块驱动核心及硬件相关驱动,展示了数据如何从文件系统通过底层驱动到达硬件。文中还解释了如何分配和填充bio,以及如何调用自定义的make_request_fn处理请求。最后,提供了两种方法的驱动程序代码示例,帮助读者理解整个流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


APP:read write 文件 保存到磁盘
--------------------------------
(文件系统)VFS虚拟文件层
--------------------------------
block块驱动 core核心驱动程序
--------------------------------
硬件相关的驱动程序,完成扇区的读写

文件系统调用底层驱动:
ll_rw_block(int rw, int nr, struct buffer_head *bhs[])
     struct buffer_head *bh = bhs[i];
    >submit_bh(WRITE, bh);
         struct bio *bio = bio_alloc(GFP_NOIO, 1);//分配bio,并根据bh填充bio
        >submit_bio(rw, bio);
            >generic_make_request(bio);
                 current->bio_list = bio->bi_next;//把bio加入到请求链表中
                >__generic_make_request(bio);
                    request_queue_t *q = bdev_get_queue(bio->bi_bdev);//获得请求队列
                   >q->make_request_fn(q, bio);//调用请求队列中的指针函数
                  
      /*
       *如是用户使用blk_alloc_queue来分配一个请求队列queue
       *使用blk_queue_make_request函数来初始化这个请求队列,则该函数会把第二个参数:函数指针
       *赋值给 q->make_request_fn,那么调用到q->make_request_fn时,就会调用用户自定义的函数
       *来处理请求。
       */
      
               >do_ramdisk_make_request_fn(request_queue_t *q,struct bio *bio)(=q->make_request_fn)
                     /*磁盘数据源*/
                     tmp_addr = v_ramdisk+bio->bi_sector*512;
                     bio_for_each_segment(bvl, bio, i)
                     {
                         /*根据bio中的页与偏移地址来映射内存 数据源缓冲区*/
                       pbuff = kmap(bvl->bv_page) + bvl->bv_offset;
                         /*数据传输的长度由 bio->bvl->bv_len 来确定一次bio数据转移的长度*/
                         /*调用数据转移函数*/
                       kunmap(bvl->bv_page);
                       tmp_addr += bvl->bv_len;//修改磁盘数据源下一次读写时的地址
                     }
                     bio_endio(bio,bio->bi_size,0);//一次请求结束,要上报
                     return 0;
      /*
       *如是用户使用blk_init_queue(do_ramdisk_request_rfn, &ramblock_lock);
       *来分配一个请求队列queue,函数的第一个参数:函数指针,会赋值给q->request_fn,别外需要
       *给该函数传入一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值