[嵌入式linux] memset操作device mem map的空间出现bus error
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映
·
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
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)