内存映射的属性
1 MT_NORMAL
- 普通内存访问,无实时性要求场景
- 支持推测、缓存、乱序、合并写等功能
- 不可用于寄存器,因为寄存器对顺序有要求
2 MT_NORMAL_NC
- 无缓存
- 支持推测、乱序、合并写等功能
- 适用对缓存敏感的普通内存,如DMA共享内存
- 不可用于寄存器,因为寄存器对顺序有要求
3 MT_DEVICE_nGnRnE
- 无缓存、严格顺序、无推测、无合并写
- 适用于硬件寄存器读写
4 MT_DEVICE_nGnRE
- 无缓存、严格顺序、无推测、无合并写
- 适用于特定外设
5 arm64上对应的Linux pgprot
- Linux中的pgport主要分为pgprot_noncached、pgprot_writecombine、pgprot_device
- pgprot_noncached: MT_DEVICE_nGnRnE,寄存器
- pgprot_device: MT_DEVICE_nGnRE,特殊外设
- pgprot_writecombine: MT_NORMAL_NC,DMA内存
参考:arch/arm64/include/asm/pgtable.h

6 问题简介
某款DMA buffer硬件性质:如果按照寄存器格式(pgprot_noncached: MT_DEVICE_nGnRnE)访问,则只支持page_size大小。
实现mmap的时候误用了pgprot_nocached,每次mmap得到虚拟地址,如果不以page size大小进行读(write file)写(memcpy),都会出现bus error;
修改成pgprot_writecombine,解决了此问题;同时写合并还提高了写速度。
本文来自博客园,作者:moonのsun,转载请注明原文链接:https://www.cnblogs.com/moon-sun-blog/p/19596117

浙公网安备 33010602011771号