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

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

相关文章:

arm64架构的linux 配置vm_page_prot方式

在 ARM64 架构上,通过 vm_page_prot 属性可以修改 UIO 映射内存的访问权限及缓存策略,常见的有非缓存(Non-cached)、写合并(Write Combine)等。下面是 ARM64 常用的 vm_page_prot 设置及其对应的操作方式。…...

vue3 + naive ui card header 和 title 冲突 bug

背景描述 最近发现一个 naive ui 上的问题,之前好好的,某一次升级后就出现了一个 bug,Modal 使用 card 布局后,Header Solt 下面的内容不见了,变成了 title,因为这个 solt 里面是有操作 action 的&#xf…...

Ubuntu 22.04.5 LTS配置 bond

本次纯实验,不会讲解bond功能,配置bond mode 1 和 mode 4 如何配置 确定内核模块是否加载 实验使用root用户权限,非root用户使用sudo 调用root权限 rootubuntu22:~# lsmod | grep bonding rootubuntu22:~# modprobe bonding rootubuntu22:~# …...

100种算法【Python版】第58篇——滤波算法之卡尔曼滤波

本文目录 1 算法步骤2 算法示例2.1 示例描述2.2 python代码3 算法应用:二维运动目标跟踪问题滤波算法是用于从信号中提取有用信息、去除噪声或估计系统状态的技术。在时间序列分析、信号处理和控制系统中,滤波算法起着关键作用。 1 算法步骤 卡尔曼滤波(Kalman Filter)的…...

关于几种卷积

1*1卷积 分组卷积&深度可分离卷积 空洞卷积、膨胀卷积 转置卷积 https://zhuanlan.zhihu.com/p/80041030 https://yinguobing.com/separable-convolution/#fn2 11的卷积可以理解为对通道进行加权,对于一个通道来说,每个像素点加权是一样的&am…...

51单片机教程(五)- LED灯闪烁

1 项目分析 让输入/输出口的P1.0或P1.0~P1.7连接的LED灯闪烁。 2 技术准备 1、C语言知识点 1 运算符 1 算术运算符 #include <stdio.h>int main(){// 算术运算符int a 13;int b 6;printf("%d\n", ab); printf("%d\n", a-b); printf("%…...

VUE3中Element table表头动态展示合计信息(不是表尾合计)

一、背景 原型上需要对两个字段动态合计&#xff0c;输出摘要信息 原先想到是的Element的 :summary-method&#xff0c;发现不是动态&#xff0c;所以换监听来实现 二、vue代码 <el-table v-model"loading" :data"itemList"><el-table-column la…...

git重置的四种类型(Git Reset)

git区域概念 1.工作区:IDEA中红色显示文件为工作区中的文件 (还未使用git add命令加入暂存区) 2.暂存区:IDEA中绿色(本次还未提交的新增的文件显示为绿色)或者蓝色(本次修改的之前版本提交的文件但本次还未提交的文件显示为蓝色)显示的文件为暂存区中的文件&#xff08;使用了…...

【Java集合面试1】说说Java中的HashMap原理?

Java中的HashMap是一种基于哈希表的Map接口实现&#xff0c;它存储的内容是键值对&#xff08;key-value&#xff09;映射。HashMap允许空键&#xff08;null&#xff09;和空值&#xff08;null&#xff09;&#xff0c;并且它的键值对没有顺序。以下是HashMap的一些关键工作原…...

万字长文解读机器学习——决策树

&#x1f33a;历史文章列表&#x1f33a; 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…...

内网环境,基于k8s docer 自动发包

背景&#xff1a;生产环境是内网&#xff0c;无法连接外部git环境&#xff0c;需要上传tar包打成镜像&#xff0c;然后发布。 简单写了个脚本&#xff0c;记录下方便复用。 将tar包和脚本拷贝到同一个目录下。 使用方式&#xff1a; tar 包名称格式&#xff1a;服务名-版本号…...

【HCIP园区网综合拓扑实验】配置步骤与详解(已施工完毕)

一、实验要求 实验拓扑图如上图所示 1、按照图示的VLAN及IP地址需求&#xff0c;完成相关配置 2、要求SW1为VLAN 2/3的主根及主网关 SW2为vlan 20/30的主根及主网关 SW1和SW2互为备份 3、可以使用super vlan&#xff08;本实验未使用&#xff09; 4、上层…...

Qt 编写插件plugin,支持接口定义信号

https://blog.csdn.net/u014213012/article/details/122434193?spm1001.2014.3001.5506 本教程基于该链接的内容进行升级&#xff0c;在编写插件的基础上&#xff0c;支持接口类定义信号。 环境&#xff1a;Qt5.12.12 MSVC2017 一、创建项目 新建一个子项目便于程序管理【…...

Qt中 QWidget 和 QMainWindow 区别

QWidget 用来构建简单窗口 QMainWindow 用来构建更复杂的窗口&#xff0c;QMainWindow 继承自QWidget&#xff0c;在QWidget 的基础上提供了菜单栏、工具栏、状态栏等功能 菜单栏&#xff08;QMenuBar&#xff09;工具栏&#xff08;QToolBar&#xff09;状态栏&#xff08;Q…...

Kafka集群中数据的存储是按照什么方式存储的?

1&#xff09;Topic 数据的存储机制 Topic是逻辑上的概念&#xff0c;而partition是物理上的概念&#xff0c;每个partition对应于一个log文件&#xff0c;该log文件中存储的就是Producer生产的数据。Producer生产的数据会被不断追加到该log文件末端&#xff0c;为防止log文件…...

中断的硬件框架

往期内容 本专栏往期内容&#xff0c;interrtupr子系统&#xff1a; 深入解析Linux内核中断管理&#xff1a;从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…...

数据备份策略:企业防御的关键

数据备份是保护数据免受网络攻击的重要步骤。在从恶意软件或勒索软件攻击中恢复时&#xff0c;公司可以使用保存的备份将其恢复到之前的状态。但是&#xff0c;为了确保数据的完全安全&#xff0c;任何公司的备份策略都应该在其总体策略中包含多种解决方案。 根据关于创建、消…...

Baget 私有化nuget

Baget下载 1、下载运行 方法一&#xff1a;cmd运行 dotnet BaGet.dll --urls http://*:8002 http://localhost:8002 方法二&#xff1a;bat脚本运行Baget 创建Start.bat dotnet BaGet.dll --urls http://*:8002 运行Start.bat 方法三&#xff1a;部署成Window服务 NSSM部…...

前端函数的参数都有哪些?

在前端开发中&#xff0c;函数的分类可以根据不同的标准进行。以下是一些常见的函数分类方式&#xff0c;并附有相应的例子&#xff1a; 按传递方式分类&#xff1a; 按值传递&#xff1a;JavaScript 中的基本类型&#xff08;如数字、字符串、布尔值&#xff09;都是按值传递的…...

【CSS】什么是BFC?

块级格式化上下文&#xff08;Block Formatting Context&#xff0c;简称BFC&#xff09;是CSS布局中的一种重要概念&#xff0c;它决定了块级盒子如何在其容器内排列&#xff0c;以及浮动元素对其周围元素的影响。理解BFC可以帮助解决许多常见的网页布局问题&#xff0c;比如清…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

用鸿蒙HarmonyOS5实现国际象棋小游戏的过程

下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码&#xff0c;使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...

Linux中INADDR_ANY详解

在Linux网络编程中&#xff0c;INADDR_ANY 是一个特殊的IPv4地址常量&#xff08;定义在 <netinet/in.h> 头文件中&#xff09;&#xff0c;用于表示绑定到所有可用网络接口的地址。它是服务器程序中的常见用法&#xff0c;允许套接字监听所有本地IP地址上的连接请求。 关…...