若bio中存在数据处于高端内存时,外设无法在此高端内存上执行DMA,这里需要创建反弹缓冲区,将处于高端内存的缓存区和反弹缓冲区之间进行数据的复制。此过程称为bounce过程。但对于大部分驱动来説,并不需要考虑。
过程如下所示:
流程如下:
- 对bio中每个segment,检查数据所对应的内存是否在高端内存区,若不存在,直接返回,不需要作bounce过程;
- 若bio存在数据在高端内存区,且存在segment数目过多时,将原bio进行切分,将切分后的第二部分通过submit_bio()再次下发;
- 分配新的bio,将原bio的第一部分相关信息拷贝到新的bio中;
- 遍历新的bio每个segment,若segment对应的页为高端内存,分配新的页,让新的bio指向此页;若操作为写时,将原来在高端内存区的数据拷贝到新的页中;
- 设置bio->bi_end_io,对于操作为读时,将反弹缓冲区的数据拷贝到高端内存区。
如下图所示,origin bio存在3个bio_vec,其中bvec 0处于高端内存区,此时bounce过程会生成新的new bio,在低端内存区分配新的内存区0'(反弹缓存区),在读写时,会将数据在原内存区和bounce缓冲区进行拷贝。