DPU网络开发SDK—DPDK(五)

news2024/11/17 1:46:37

rte_eal_init

接上次内容继续对rte_eal_init()所做的工作进行分析。

18. 检查是否允许直接物理地址访问

rte_eal_using_phys_addrs()会去检查当前系统是否允许在进程虚拟地址空间直接访问物理地址。需要有两个支持条件:存在大页内存和能够进行虚拟地址到物理地址的转换。

  • rte_eal_has_hugepages()

该func就是检查internal_config中的no_hugetlbfs是否置位,置位表示不使用大页内存,默认情况下是不置位的,如果想置位,需要通过DPDK启动参数--no-huge来指定。

  • rte_mem_virt2phy()

该func的作用是随机传入一个进程中的虚拟内存地址,返回该虚拟内存地址映射到的物理地址。在这里,通过传入地址为0的虚拟地址,如果返回的结果不是无效的物理地址的话,则表示当前系统是允许的。

要实现从虚拟地址获得物理地址,需要借助/proc文件系统的支持。假设被寻找物理地址的虚拟地址值为virtaddr,首先要确保能够打开/proc/self/pagemap文件,获取到系统默认的页面大小pagesize。接下来获取virtaddr在虚拟地址空间的页面索引值vrit_pfn,即virt_pfn = virtaddr/pagesize。因为页面是虚拟内存映射到物理内存的最小单位,故需要获取到页面索引。

获取到virt_pfn之后,即可根据此值访问pagemap文件了。在Linux 64位操作系统中,需要54比特位空间存放物理页面的索引(参考Linux文档pagemap.txt得知),向上对齐为8字节空间。那么在pagemap中,offset为virt_pfn * 8的位置,即为索引为virt_pfn的虚拟内存页面映射到的物理内存页面的索引phy_page。

获取到phy_page之后,即可根据此值,还原出virtaddr映射到的物理地址phyaddr。特殊情况下,通过pagemap文件无法获取到phy_page的值,那么表示该系统不支持虚拟地址到物理地址的转换。

19. iova模式的处理

Internal_config中iova_mode指明设备访问物理内存的方式,一共有三种: RTE_IOVA_PA、RTE_IOVA_VA和RTE_IOVA_DC,分别表示直接访问内存物理地址,通过进程虚拟地址访问,不关心访问方式。默认情况下不关心具体访问方式,其他两种情况,需要通过DPDK启动参数--iova-mode来指定。

接下来详细介绍一下DPDK的iova模式。

DPDK是用户态的SDK,使用该SDK访问的是进程的虚拟地址,常规情况下,用户态进行IO操作需要通过系统调用进入内核态,在内核态完成设备与内存之间的交互,此种操作效率低下。为解决此问题,DPDK提供了一些API,能够实现在用户态模式下实现IO操作。然而硬件设备是不能直接操作进程的虚拟地址空间的,他能够操作的是物理地址,为此DPDK提供了IO虚拟地址IOVA来支持硬件设备可以直接操作进程的虚拟地址。

DPDK统一通过IOVA实现与硬件设备的数据交换,但需要区分IOVA是寻址的是内存物理地址还是进程的虚拟地址的情况,这就分区出了iova_pa和iova_va两种情况。

  • PA模式

该模式下,分配到DPDK存储区的iova都是实际的物理地址,当进程初始化iova时,虚拟地址空间会完成到物理内存页面的映射,这样当分配内存时,不会引发缺页异常的情况。但这种模式也存在一定的缺点,首先是需要在进程启动时需要root用户的特权,否则无法访问系统的页面映射,也就无法获取到内存区域的真实物理地址。其次是虚拟内存的分配受到物理内存的限制,当物理内存不是连续的内存片段时,iova的虚拟内存也只能是多个片段,不能在逻辑上将物理内存合并。如下图所示:

极端情况下,如果物理内存过于破碎,片段太多,会耗尽表示iova虚拟内存的数据结构,导致初始化失败。解决该问题的方法一般是使用1GB或者2MB的大页内存,并在机器启动时显式指定保留一定数量的大页内存。

  • VA模式

相比PA模式,VA模式下虚拟内存映射物理内存不会受到物理内存片段过多的影响,DPDK的eal层会依靠内核的基础设施将多个物理内存片段映射为一个连续的虚拟内存片段,该过程不需要root权限也可以执行。如下图所示:

internal_config中的iova_mode默认为RTE_IOVA_DC,即不关心是哪种。在这种情况下,DPDK初始化过程中需要自行判断该采取哪种模式。首先调用rte_bus_get_iommu_class()来获取iova的模式,该func中遍历rte_bus_list中每个bus,如果bus定义了get_iommu_class这个方法,那么就调用该方法获取该bus需要PA还是VA。如果所有的bus都是PA或者都是VA,那么get_iommu_class就返回具体的模式,如果有的bus需要PA模式而有的需要VA模式,那么仍然是返回DC模式。

调用了get_iommu_class之后如果仍然是DC模式,那么就需要最终确定选择PA还是VA了。如果不支持直接物理地址访问,选择VA;如果内核模块rte_kni有加载,选择PA;如果iommu是使能的,选择VA;除此之外的情况,选择PA。

确定iommu是不是使能的是通过调用is_iommu_enabled()实现,该func通过打开/sys/kernel/iommu_groups目录,统计其中的文件数量在确定。

未完待续……

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智云通CRM:如何把握拓客成交的三种时间?

在我们邀约、拜访及展示产品之后,客户就一定会成为你的客户吗?当然不尽然,这取决于众多因素。任何事情都不是一蹴而就的,我们不能刚到某个场合认识了一个人,就一定要立即成交,或者反过来因为对方此时没有需…

Pytorch实战笔记(2)——CNN实现情感分析

本文展示的是使用 Pytorch 构建一个 TextCNN 来实现情感分析。本文的架构是第一章详细介绍 TextCNN(不带公式版),第二章是核心代码部分。 目录1. TextCNN2. TextCNN 实现情感分析参考1. TextCNN 相较于 LSTM 而言,我个人其实是没…

手把手教你学51单片机-C语言基础

二进制、十进制和十六进制 对于二进制来说,8 位二进制我们称之为一个字节。 我们在进行 C 语言编程的时候,我们只写十进制和十六进制,那么不带 0x 的就 是十进制,带了 0x 符号的就是十六进制。 C 语言变量类型和范围 C 语言的数据基本类型分为字符型、整型、长整型以及…

【算法题解】12. 删除链表中的节点

文章目录题目题解Java 代码实现Go 代码实现复杂度分析这是一道简单题,题目来自 leetcode 题目 给定一个单链表的 head,我们想删除它其中的一个节点 node。 只给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。 链表的所有值都是 唯一的&…

1.吴恩达机器学习课程笔记:多元梯度下降法

1.吴恩达机器学习课程笔记:多元梯度下降法 笔记来源:吴恩达机器学习课程笔记:多元梯度下降法 仅作为个人学习笔记,若各位大佬发现错误请指正 1.1 多元特征(变量) 每一列代表一个特征,例如&…

FMC子卡设计资料原理图:FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡

FMC550-基于ADRV9002双窄带宽带射频收发器FMC子卡一、产品概述 ADRV9002 是一款高性能、高线性度、高动态范围收发器,旨在针对性能与功耗系统进行优化。该设备是可配置的,非常适合要求苛刻、低功耗、便携式和电池供电的设备。ADRV9002 的工作频率为 …

计算机基础——无处不网络(2)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.计算机网络的接入方式 1

青龙脚本-稳定阅读

稳定阅读积分 查看请求头的cookie 变量 export zzbhd 多号或换行 */ 脚本附后 /* 查看请求头的cookie 变量 export zzbhd 多号或换行*/const $ new Env(至尊宝阅读); const axios require(axios); let request require("request"); request request.defaults(…

纯手工模拟Vue中的数据劫持和代理

为什么要实现数据劫持和代理 举一个场景:比如在小程序开发中,我们需要逻辑层修改的数据能同步响应更新到视图层的页面上,那么底层框架在实现这种效果的时候,机制是什么样的呢? 其实这里的底层原理类似于Vue中的数据劫…

基于蜣螂算法优化的BP神经网络(预测应用) - 附代码

基于蜣螂算法优化的BP神经网络(预测应用) - 附代码 文章目录基于蜣螂算法优化的BP神经网络(预测应用) - 附代码1.数据介绍3.蜣螂优化BP神经网络3.1 BP神经网络参数设置3.2 蜣螂算法应用4.测试结果:5.Matlab代码摘要&am…

ClickHouse快速复习

ClickHouse​一.特性​1.列式数据库管理系统​2.数据压缩​3.数据的磁盘存储​4.支持SQL​5.索引​6.适合在线查询​7.支持数据复制和数据完整性​8.实时的数据更新​9.处理大量短查询的吞吐量​10.处理大量短查询的吞吐量​11.限制​二.数据类型​1.数字类型​2.浮点数(float)…

前端都在聊什么 - 第 1 期

Hello 小伙伴们早上、中午、下午、晚上、深夜好,我是爱折腾的 jsliang~「前端都在聊什么」是 jsliang 日常写文章/做视频/搞直播过程中,小伙伴们的提问以及我的解疑整理。本期对应 2023 年的 01.01-01.15 这个时间段。本期针对「工作」「学习」「规划」「…

迭代器、可迭代对象、生成器的区别和联系

目录1 迭代器2 可迭代对象3 生成器1 迭代器 迭代器是一种可以更新迭代的工具,迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。但是他不能像列表一样使用下标来获取数据,也就是说迭代器是不能返回的。迭代器只能往前不会…

Universal Links方式:私有化部署服务器来托管apple-app-site-association文件创建通用链接

Universal Links方式:私有化部署服务器来托管apple-app-site-association第一步:开启Associated Domains服务第二步:配置Associated Domains(域名)第三步:服务器配置apple-app-site-association文件第四步:…

java的数据类型:引用数据类型(String、数组、枚举)

2.3.3 引用数据类型 引用数据类型大致包括:类、 接口、 数组、 枚举、 注解、 字符串等 它和基本数据类型的最大区别就是: 基本数据类型是直接保存在栈中的引用数据类型在栈中保存的是一个地址引用,这个地址指向的是其在堆内存中的实际位置…

四旋翼无人机学习第22节--padstack editor创建过孔

1 首先打开padstack editor软件。 2、选择过孔,注意与前面的博客不同,这里的单位最好使用mil。 在小马哥的教程中,过孔可以分为几类,下面主要对下图的五种过孔进行设置。 3、接着对过孔的孔径进行设置。 4、不做修改。 5、修…

网络交换机常见故障及解决方法

在日常的网络故障维护中我们接触最多的设备就是交换机,特别是接入层交换机,它是连接用户和交换路由设备的桥梁。但是交换机设备无论性能多么好,都会存在潜在故障问题,就像人一样,无论多么健康,也总会出现一…

MindMaster思维导图及亿图图示会员 优惠活动

MindMaster思维导图及亿图图示会员 超值获取途径 会员九折优惠方法分享给大家!如果有需要,可以上~ 以下是食用方法: MindMaster 截图 亿图图示 截图 如果需要MindMaster思维导图或者亿图图示会员,可按照如下操作领取超值折扣优惠…

java成员变量/局部变量2023017

成员变量/局部变量 1.定义位置不同,成员变量定义在类里,局部变量定义在类的方法里。 来自网络 2.成员变量中,其中类变量从该类的准备阶段起开始存在,直到系统完全销毁这个类,类变量的作用域与这个类的生存范围相同&…

超市进销存之openGauss数据库的应用与实践

目录 一、背景 二、目的 三、什么是“进销存”,什么是超市进销存管理系统? 四、什么是openGauss数据库? 五、应用与实践(模拟超市进销存系统) 1、超市进销存数据库表设计 2、创建数据库表 3、手工插入数据 4、…