BLOCK层代码分析(5)IO下发之BIO bounce过程

        若bio中存在数据处于高端内存时,外设无法在此高端内存上执行DMA,这里需要创建反弹缓冲区,将处于高端内存的缓存区和反弹缓冲区之间进行数据的复制。此过程称为bounce过程。但对于大部分驱动来説,并不需要考虑。

        过程如下所示:

流程如下:

  1. 对bio中每个segment,检查数据所对应的内存是否在高端内存区,若不存在,直接返回,不需要作bounce过程;
  2. 若bio存在数据在高端内存区,且存在segment数目过多时,将原bio进行切分,将切分后的第二部分通过submit_bio()再次下发;
  3. 分配新的bio,将原bio的第一部分相关信息拷贝到新的bio中;
  4. 遍历新的bio每个segment,若segment对应的页为高端内存,分配新的页,让新的bio指向此页;若操作为写时,将原来在高端内存区的数据拷贝到新的页中;
  5. 设置bio->bi_end_io,对于操作为读时,将反弹缓冲区的数据拷贝到高端内存区。

        如下图所示,origin bio存在3个bio_vec,其中bvec 0处于高端内存区,此时bounce过程会生成新的new bio,在低端内存区分配新的内存区0'(反弹缓存区),在读写时,会将数据在原内存区和bounce缓冲区进行拷贝。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值