Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel 是否可以使用dma_set_mask()告诉内核不要使用4G以下的内存_Linux Kernel_Linux Device Driver_Kernel Module_Dma_Pci E - Fatal编程技术网

Linux kernel 是否可以使用dma_set_mask()告诉内核不要使用4G以下的内存

Linux kernel 是否可以使用dma_set_mask()告诉内核不要使用4G以下的内存,linux-kernel,linux-device-driver,kernel-module,dma,pci-e,Linux Kernel,Linux Device Driver,Kernel Module,Dma,Pci E,我的pcie设备有一个错误,它无法dma到4G以下的地址,我应该使用什么掩码与dma_设置_掩码一起告诉内核?查看一下,似乎需要dma_设置_掩码_和_相干(dev,dma_BIT_掩码(64))来启用>32位映射地址。特别是(对于一致映射): 对于非空dev,一致的DMA映射接口将由 默认返回32位可寻址的DMA地址。即使 设备指示(通过DMA掩码)它可以寻址高32位, 一致分配仅在以下情况下返回DMA的>32位地址 一致DMA掩码已通过显式更改 dma_设置_相干_掩码()。dma_池接口也

我的pcie设备有一个错误,它无法dma到4G以下的地址,我应该使用什么掩码与dma_设置_掩码一起告诉内核?

查看一下,似乎需要
dma_设置_掩码_和_相干(dev,dma_BIT_掩码(64))
来启用>32位映射地址。特别是(对于一致映射):

对于非空dev,一致的DMA映射接口将由 默认返回32位可寻址的DMA地址。即使 设备指示(通过DMA掩码)它可以寻址高32位, 一致分配仅在以下情况下返回DMA的>32位地址 一致DMA掩码已通过显式更改 dma_设置_相干_掩码()。dma_池接口也是如此 嗯

但是,这个(dma_set_mask_和_coherent()调用)不能保证工作(有关更多详细信息,请参阅HOWTO)。此外,您可能需要多次调用
dma\u alloc\u coherent()
,直到获得大于4GB的dma地址


我不知道有什么方法可以强制特定映射超过32位。

否。
pci\u set\u dma\u mask()
的作用与您想要的正好相反:它告诉内核不要使用更高的地址

最简单的方法可能是在引导时保留高内存,并仅使用该内存。请看一下
linux/include/linux/dma continuous.h
以获得灵感。特别是
dma\u declare\u continuous()

如果不能尽早分配内存,事情会变得更加棘手。在这种情况下,您必须通读“正常”PCI分配代码的功能,然后自己滚动


我从去年的嵌入式Linux会议中发现了深刻的见解。它们当然包含许多指向有用的头文件和源代码的指针,以便通读

不,你不能。DMA掩码定义从地址0x00000000开始的区域。您指的是soc侧的DMA还是外部设备侧的DMA?在使用DMA_alloc_相干()之后,我应该使用DMA_map_single()吗?或者我的设备是否已经dma到返回的总线地址?