首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无映射的Linux流DMA ReMapping

无映射的Linux流DMA ReMapping
EN

Stack Overflow用户
提问于 2015-01-18 01:31:06
回答 1查看 467关注 0票数 1

我注意到pci_unmap_sg的签名(我显示了dma_unmap_sg_attrs,它是由pci_unmap_sg通过两个宏调用并具有明确的参数命名)包含方向和属性。

代码语言:javascript
复制
static inline void dma_unmap_sg_attrs(
   struct device *dev,
   struct scatterlist *sg, 
   int nents,
   enum dma_data_direction dir, 
   struct dma_attrs *attrs)

我想知道为什么有必要知道取消映射的方向和属性。起初,我认为映射有点像mallocfree。但看到这一点,我想知道这样的事情是否合法:

代码语言:javascript
复制
dma_map_sg_attrs(..., dir=DMA_BIDIRECTIONAL,...);
...
dma_unmap_sg_attrs(..., dir=DMA_FROM_DEVICE ,...);
//continue use in TO_DEVICE direction

代码语言:javascript
复制
dma_map_sg_attrs(..., dir=DMA_TO_DEVICE,...);
...
dma_map_sg_attrs(..., dir=DMA_FROM_DEVICE ,...);
//start bidirectional use

此外,我还可以这样做(通过DMA将数据从一个设备传输到另一个设备,如果它们之间不能直接交互):

代码语言:javascript
复制
dma_map_sg_attrs(dev1, ..., dir=DMA_FROM_DEVICE ,...);
dma_map_sg_attrs(dev2, ..., dir=DMA_TO_DEVICE ,...);

我试着深入了解这个函数,但是以get_dma_ops结尾,它从全局获取函数指针。但是如何进一步遵循这段代码是另一个问题

更新

我发现同步api更令人困惑:

代码语言:javascript
复制
pci_dma_sync_sg_for_cpu(
  struct pci_dev *hwdev,
  struct scatterlist *sg,
  int nelems,
  int direction
)

这个api知道方向的原因是什么?api没有办法记住原始的映射方向,如果我们只映射为sync_for_cpu,那么它是否可以单独列出DMA_TO_DEVICE呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-18 12:53:27

答案将是简单和有力的同时。这取决于您对正在使用的CPU体系结构的了解程度。DMA的问题是CPU缓存。对于DMA来说,CPU缓存必须是一致的。因此,我们在同步API中有不同的方向,因为我们可以访问来自DMA和CPU的数据。正如您已经知道的,同步API是映射API中方向参数的一个原因。

无论如何,这不是一个全面的答案。为此,您必须阅读特定的文献和文档。我建议你从Documentation/DMA*.txt文件开始。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28006268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档