我想询问/验证与struct scatterlist
映射的blk_rq_map_sg
数组是否至少在虚拟地址域中都是连续的。我们都知道分散列表主要用于DMA,其中每个分散 - 聚集(sg)数组元素描述一块内存,并且这些块在其物理地址中是不连续的。
我正在写一个块设备驱动程序。假设我从request_queue接收结构请求,并且我想对我的请求所持有的I / O数据执行某些操作,例如memcpy
将它们放到某处。该操作将需要虚拟地址和长度参数。现在我所知道的是,我可以通过辅助函数blk_map_rq_sg()
映射的散列表访问请求的数据。我的假设是正确的,那些sg元素在虚拟中是连续的,我可以通过sg_virt()
获取数据地址,并使用memcpy
的地址和总长度?或者它们在虚拟中是不连续的,我必须遍历每个sg数组元素和memcpy
到/从每个sg内存块(虚拟)中更难?
答案 0 :(得分:0)
像writev这样的函数允许提交不连续的请求,高内存中的页面没有开始的虚拟地址。
要使用CPU访问SG列表内容,请使用sg_copy_from_buffer
之类的内容,这会自动暂时映射页面。