内存映射的属性

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
image
 

6 问题简介

某款DMA buffer硬件性质:如果按照寄存器格式(pgprot_noncached: MT_DEVICE_nGnRnE)访问,则只支持page_size大小。
实现mmap的时候误用了pgprot_nocached,每次mmap得到虚拟地址,如果不以page size大小进行读(write file)写(memcpy),都会出现bus error;
修改成pgprot_writecombine,解决了此问题;同时写合并还提高了写速度。
 

posted @ 2026-02-09 16:38  moonのsun  阅读(51)  评论(0)    收藏  举报