当前位置: 代码迷 >> 综合 >> [嵌入式linux] memset操作device mem map的空间出现bus error
  详细解决方案

[嵌入式linux] memset操作device mem map的空间出现bus error

热度:75   发布时间:2024-01-30 23:17:48.0

kernel driver中用pgprot_noncached映射一片DMA内存到user space。

在应用程序中通过memeset清零时,产生Bus error.

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
....
memset(*Logical,0,Size);

原因:

在部分平台上,memset不能操作device映射的space。(根本原因和memset实现有关)

下面是ARM64的实现

/** Mark the prot value as uncacheable and unbufferable.*/
#define pgprot_noncached(prot) \__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE) | PTE_PXN | PTE_UXN)
#define pgprot_writecombine(prot) \__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN)
#define pgprot_device(prot) \__pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRE) | PTE_PXN | PTE_UXN)

可以看到pgprot_noncached其实就是和pgprot_device是相同的

fix:

做用户空间映射时将pgprot_noncached改为pgprot_writecombine

 

  相关解决方案