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`,以满足设备内存的访问需求。

相关推荐
7yewh5 小时前
嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻
驱动开发·stm32·嵌入式硬件·mcu·物联网·硬件架构·pcb工艺
TeYiToKu13 小时前
笔记整理—linux驱动开发部分(8)framebuffer类设备
linux·驱动开发·笔记·嵌入式硬件·arm
三菱-Liu1 天前
三菱MR-J4-B伺服连接器和信号排列
网络·驱动开发·硬件工程·制造·mr
lishing62 天前
Linux驱动开发(4):Linux的设备模型
linux·运维·驱动开发
TeYiToKu3 天前
笔记整理—linux驱动开发部分(10)input子系统与相关框架
linux·驱动开发·笔记·嵌入式硬件·arm·1024程序员节
TMC_LAI3 天前
采用 EtherCAT 的磁场定向控制 (FOC) 伺服运动控制器 IC-TMC8670-BI
人工智能·驱动开发·嵌入式硬件
三菱-Liu4 天前
三菱MR-J4伺服绝对位置检测系统
运维·驱动开发·嵌入式硬件·硬件工程·制造·mr
这个菠萝好咸4 天前
内核源码+vscode+bear+clang实现函数任意跳转,无缝跳转,无缝阅读,无缝开发
linux·c语言·驱动开发·后端·arm单片机
TeYiToKu5 天前
笔记整理—linux驱动开发部分(7)misc类设备(杂项设备)
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件