对于使用 scatter/gather 传输的情况,request_buffer (申请的dma内存区域)里边实际上是一个数组,每一个元素都是一个 struct scatterlist 的指针,而每一个 scatterlist 指针的 page里边包含了一些 page(而不是一个 page),而 offset 里边包含的是每一个 DMA buffer 的总的偏移量,她由两部分组成,高位部分标志着 page 号,低位部分标志着具体某个 page 中的偏移量,高位低位由PAGE_SHIFT 宏来划分,不同的硬件平台 PAGE_SHIFT 值不一样,因为不同的硬件平台 page 的大小也不一样,即这里的 PAGE_SIZE 不一样,目前比较前卫的硬件平台其 page size 有 4k 或者 8k 的,而PAGE_SHIFT 也就是 12 或者 13。
4 struct scatterlist { 5 struct page *page; 6 unsigned int offset; 7 dma_addr_t dma_address; 8 unsigned int length; 9 };