当前位置: 首页 > article >正文

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


http://www.kler.cn/a/390303.html

相关文章:

  • 设计模式-七个基本原则之一-迪米特法则 + 案例
  • Qt 获取当前系统中连接的所有USB设备的信息 libudev版
  • Linux设置Nginx开机启动
  • 第二节 OSI-物理层
  • 【入门篇】A+B Problem——多语言版
  • vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)
  • 测试用例设计方法之判定表
  • 使用Matlab建立决策树
  • 「QT」几何数据类 之 QVector3d 三维向量类
  • C++优选算法十一 字符串
  • 【React】条件渲染——逻辑与运算符
  • 在心理学研究中实施移动眼动追踪:实用指南
  • C# 操作Rabbitmq
  • MIT 6.S081 Lab1: Xv6 and Unix utilities翻译
  • Nginx中实现流量控制(限制给定时间内HTTP请求的数量)示例
  • ChatGLM2-6B微调记录【2】
  • React Native 全栈开发实战班 - 核心组件与导航
  • 【系统架构设计师-2024下半年真题】综合知识-参考答案及部分详解(完整回忆版)
  • C++ 二叉搜索树
  • 设计模式(Unity)——更新中
  • FPGA实现以太网(二)、初始化和配置PHY芯片
  • 攻防世界36-fakebook-CTFWeb
  • 苍穹外卖 数据可视化
  • 标准化 Git 提交信息的约定
  • 17RAL_Visual-Inertial Monocular SLAM with Map Reuse
  • 基础算法练习--滑动窗口(已完结)