arm64架构的linux 配置vm_page_prot方式

在 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. **完全禁用缓存和写缓冲**

在一些特殊情况下,可能需要完全禁用缓存和写缓冲,这可以通过 `pgprot_device` 来实现。这种模式下,所有的读写顺序和数据完整性都严格受控,适合敏感的硬件寄存器访问。

用法

```c

vma->vm_page_prot = pgprot_device(vma->vm_page_prot);

```

示例:ARM64 `UIO` 驱动中配置 `vm_page_prot`

下面是一个在 `UIO` 驱动 `mmap` 函数中,根据设备需要设置 `vm_page_prot` 属性的示例:

```c

static int my_uio_mmap(struct uio_info *info, struct vm_area_struct *vma)

{

// 设置非缓存模式,适用于 MMIO 区域

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);

// 配置权限

vma->vm_flags |= (VM_READ | VM_WRITE);

// 映射物理地址

if (remap_pfn_range(vma, vma->vm_start,

info->mem[0].addr >> PAGE_SHIFT,

vma->vm_end - vma->vm_start,

vma->vm_page_prot)) {

return -EAGAIN;

}

return 0;

}

```

注意事项

  • **根据设备需求选择合适的模式**:例如,对于顺序要求严格的设备寄存器,使用非缓存模式(`pgprot_noncached`)或设备模式(`pgprot_device`)。

  • **确保页面对齐**:`remap_pfn_range` 中的物理地址和大小应按页面大小对齐,以避免 `bus error`。

  • **调整权限和缓存模式**:根据具体需求配置 `vm_page_prot`,以满足设备内存的访问需求。

相关推荐
cxr8284 小时前
SPARC方法论在Claude Code基于规则驱动开发中的应用
人工智能·驱动开发·claude·智能体
sukalot12 小时前
window显示驱动开发—显示适配器的子设备
驱动开发
Evan_ZGYF丶21 小时前
【RK3576】【Android14】如何在Android14下单独编译kernel-6.1?
linux·驱动开发·android14·rk3576
sukalot2 天前
window显示驱动开发—视频呈现网络简介
驱动开发
sukalot2 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(二)
驱动开发
zwhSunday2 天前
Linux驱动开发(1)概念、环境与代码框架
linux·运维·驱动开发
sukalot3 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(三)
驱动开发
sukalot3 天前
window显示驱动开发—为头装载和专用监视器生成自定义合成器应用(一)
驱动开发
cxr8284 天前
基于Claude Code的 规范驱动开发(SDD)指南
人工智能·hive·驱动开发·敏捷流程·智能体
zwhSunday4 天前
Linux驱动开发(2)进一步理解驱动
linux·驱动开发