在 ARM64 架构上,通过 `vm_page_prot` 属性可以修改 `UIO` 映射内存的访问权限及缓存策略,常见的有非缓存(Non-cached)、写合并(Write Combine)等。下面是 ARM64 常用的 `vm_page_prot` 设置及其对应的操作方式。
### 1. **非缓存模式 (`pgprot_noncached`)**
ARM64 系统通常使用 `pgprot_noncached` 来设置非缓存模式,适用于访问要求严格顺序且不使用缓存的设备内存,例如 MMIO 区域。
#### 用法
```c
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
```
此设置确保所有访问都是直接进行,不经过 CPU 缓存,以避免数据不一致的问题。
### 2. **写合并模式 (`pgprot_writecombine`)**
对于一些需要快速写入、但不强制严格顺序的设备内存(如帧缓冲区),可以使用 `pgprot_writecombine` 设置写合并模式。在写合并模式下,写操作会被合并以提高性能,但数据写入顺序不保证严格一致。
#### 用法
```c
vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
```
写合并模式适合需要高效写入的数据区域,但在读写时要注意顺序一致性问题。
### 3. **默认缓存模式(`pgprot_cached`)**
在 ARM64 上,`pgprot_cached` 是内存的默认缓存模式,适合普通的内存映射,不适合 MMIO 等不要求缓存的设备。通常情况下,`UIO` 映射设备内存时不使用此模式,但有些驱动需要时也可以指定:
```c
vma->vm_page_prot = pgprot_cached(vma->vm_page_prot);
```
### 4. **完全禁