内核分散列表在虚拟地址中是连续的?

时间:2014-07-12 14:18:39

标签: c linux linux-kernel linux-device-driver virtual-memory

我想询问/验证与struct scatterlist映射的blk_rq_map_sg数组是否至少在虚拟地址域中都是连续的。我们都知道分散列表主要用于DMA,其中每个分散 - 聚集(sg)数组元素描述一块内存,并且这些块在其物理地址中是不连续的。

我正在写一个块设备驱动程序。假设我从request_queue接收结构请求,并且我想对我的请求所持有的I / O数据执行某些操作,例如memcpy将它们放到某处。该操作将需要虚拟地址和长度参数。现在我所知道的是,我可以通过辅助函数blk_map_rq_sg()映射的散列表访问请求的数据。我的假设是正确的,那些sg元素在虚拟中是连续的,我可以通过sg_virt()获取数据地址,并使用memcpy的地址和总长度?或者它们在虚拟中是不连续的,我必须遍历每个sg数组元素和memcpy到/从每个sg内存块(虚拟)中更难?

1 个答案:

答案 0 :(得分:0)

writev这样的函数允许提交不连续的请求,高内存中的页面没有开始的虚拟地址。

要使用CPU访问SG列表内容,请使用sg_copy_from_buffer之类的内容,这会自动暂时映射页面。