我正在将DMA相干内存从内核映射到用户空间。在用户级别,我使用mmap(),在内核驱动程序中,使用dma_alloc_coherent()和之后remap_pfn_range(),重新映射页面。这基本上可以正常工作,因为我可以将数据写入应用程序中的映射区域并在内核驱动程序中进行验证。
但是,尽管使用了dma_alloc_coherent(应该分配未缓存的内存),pgprot_noncached()并且内核仍通过以下dmesg输出通知我:
映射[内存0xABC-0xCBA]的pfn内存范围未缓存负值,得到了回写
以我的理解,写回是缓存的内存。但是我需要未缓存的内存来进行DMA操作。
代码(仅显示重要部分):
用户应用
fd = open(dev_fn, O_RDWR | O_SYNC);
if (fd > 0)
{
mem = mmap ( NULL
, mmap_len
, PROT_READ | PROT_WRITE
, MAP_SHARED
, fd
, 0
);
}
Run Code Online (Sandbox Code Playgroud)
为了测试目的,我使用了mmap_len = getpagesize(); 是4096。
内核驱动
typedef struct
{
size_t mem_size;
dma_addr_t dma_addr;
void *cpu_addr;
} Dma_Priv;
fops_mmap()
{
dma_priv->mem_size = vma->vm_end - vma->vm_start;
dma_priv->cpu_addr = dma_alloc_coherent ( &gen_dev
, dma_priv->mem_size …Run Code Online (Sandbox Code Playgroud)