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

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)

文章目录

  • 1. 背景
  • 2. 设置参数的主要流程
    • 2.1 初始化
    • 2.2 注册某个params的处理方式以及回调函数
    • 2.4 定义好前面的params以及init指定config地点后start处理argv
  • 3. 其他
  • 4. DOCA ARGP包相关
    • 4.1 主要接口
    • 4.2 DOCA ARGP的2个rpm包
      • 4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm
      • 4.2.2 doca-sdk-argp-devel-2.9.0072-1.el8.x86_64.rpm
      • 4.2.3 头文件和so库
  • 5. 综述

1. 背景

DOCA: Data Center-on-a-Chip Architecture,片上数据中心架构。是NVIDIA针对DPU的软件框架。DOCA之于DPU,就相当于CUDA之于GPU。本文介绍的是DOCA SDK中的DOCA ARGP模块的机制原理,他是DOCA程序的一个标准参数处理框架。

DOCA ARGP (DOCA Arg Parser)是doca中给用户程序提供的一个处理用户参数的模块。基本原理是提供一个后端处理服务,将-v -vv这种参数以及遇到这种参数给一个回调函数(该回调函数用户提供),然后在回调函数中将用户输入数据存入正确的config数据中。
在doca argp中主要有2种内存,一个是config内存(就是用户在整个模块中的config参数);另一个是params内存,这个内存是用来给argp用的,它定义了多个参数匹配模式元组的表示,也就是后面提到的params的多个接口设置的目的。
然后doca argp使用多个API接口,注册用户期望的多个params,然后根据用户输入的多个参数一一的进入用户定制的处理函数将数据存入用户config空间。
要真正理解本文的流程建议拿一个实际的DOCA samples进行查看。本文使用的源码是doca sapmle中的\doca\samples\doca_devemu\devemu_pci_device_dma\dpu\devemu_pci_device_dma_dpu_main.c

全局关键点预览:
在这里插入图片描述

2. 设置参数的主要流程

  • 先创建一个 param的句柄: doca_argp_param_createstruct doca_argp_param *param。 doca_argp后端提供这个服务,让后端创建相关资源。这里doca后端应该仅仅是使用类似malloc创建资源,后面整整reg才会初始化。可以看到这些params的的本质是KV的方式,key就是前面几个set的key,v是存在通过param_create的内存中。
  • 然后设置参数的几件套:包括-x,–xxx这些指定方式。其中 -x短模式用:doca_argp_param_set_short_name,长模式用:doca_argp_param_set_long_name
  • 然后设置这个参数的description:doca_argp_param_set_description
  • 指定函数处理的调用函数:毁掉函数中从params中指定的参数,送到config中去。也就可以直接从输入参数拷贝到创建的params的资源中去。
  • 设置param的参数类型
  • 指定这些参数后,就能够使用doca_argp_register_param将指定的几个参数赋值到create的资源里面去。并且应该后台有一个-和–的全局链,然后给后面匹配的时候遍历对比。

那么接下来的问题是,在argp后端创建了资源,也给资源进行了赋值。用户程序如何将运行时刻的参数赋值到这些资源上呢?
答案是:doca_argp_start(argc, argv);
当程序运行后,指定了类似–vuid之后,doca_argp_start会从argc和argv中获取这些参数,然后判断比如和前面register的-或者–的参数对比,如果对比上了,就会调用对应的param注册的callback,然后callback中将参数给到用户程序的config里面。这里callback的函数调用的时候,因为有指定param的参数类型,会作为参数传入callback的第二个参数,另外就是前面

那么用户程序的config里面是如何存储到用户参数的呢?

doca_argp_param_create
doca_argp_param_set_short_name
doca_argp_param_set_long_name
doca_argp_param_set_description
doca_argp_param_set_callback
doca_argp_param_set_type
doca_argp_init
将定义的buf注册到argp后端
后端在遍历回调的时候config内存点
doca_argp_register_param
指定参数-x或者--xx
doca_argp_start
将数据给argp后端
memory
【param】test_reg_params1
参数kv结构化表示数据
主要目的是通过-等找到callback
经过callback设置到config
short
-u
long
--vuid
desc
this is a test vuid
callback
function_xxx(params, config)
type
string
argp_backend
argp后端的大概结构
test_reg_params2
test_reg_params1
【config】全局配置数据
参数结构:struct devemu_pci_cfg
APP
APP被调用
argc_argv
将用户输入argc argv的值从params匹配后
配置到config中
回调函数中使用config的结构转义出来

也就是说当doca_argp_start执行后,从用户-等参数就设置到init指定的地址里面。

2.1 初始化

使用doca_argp_init会创建argp的资源
用法:

	result = doca_argp_init("doca_devemu_pci_device_dma_dpu", &devemu_pci_cfg);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to init ARGP resources: %s", doca_error_get_descr(result));goto sample_exit;}

定义:

struct devemu_pci_cfg {char devemu_manager_pci_address[DOCA_DEVINFO_PCI_ADDR_SIZE]; /* Emulated device manager PCI address */char dma_dev_name[DOCA_DEVINFO_IBDEV_NAME_SIZE];	     /* DMA device name */char vuid[DOCA_DEVINFO_REP_VUID_SIZE];			     /* VUID of emulated device */uint64_t host_dma_mem_iova;				     /* IOVA of host DMA memory */char write_data[MEM_BUF_LEN];				     /* Data to write to host memory */
};

2.2 注册某个params的处理方式以及回调函数

	result = register_vuid_param("DOCA Devemu emulated device VUID.", vuid_callback);if (result != DOCA_SUCCESS)return result;doca_error_t register_vuid_param(const char *description, doca_argp_param_cb_t vuid_callback)
{struct doca_argp_param *param;doca_error_t result;/* Create and register VUID param */result = doca_argp_param_create(&param);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to create ARGP param: %s", doca_error_get_descr(result));return result;}doca_argp_param_set_short_name(param, "u");doca_argp_param_set_long_name(param, "vuid");doca_argp_param_set_description(param, description);doca_argp_param_set_callback(param, vuid_callback);doca_argp_param_set_type(param, DOCA_ARGP_TYPE_STRING);result = doca_argp_register_param(param);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to register program param: %s", doca_error_get_descr(result));return result;}return DOCA_SUCCESS;
}## 2.3 回调函数:
static doca_error_t vuid_callback(void *param, void *config)
{struct devemu_pci_cfg *conf = (struct devemu_pci_cfg *)config;const char *vuid = (char *)param;return parse_vuid(vuid, conf->vuid);
}

2.4 定义好前面的params以及init指定config地点后start处理argv

从入参中直接赋值到定义的参数中:

	result = doca_argp_start(argc, argv);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to parse sample input: %s", doca_error_get_descr(result));goto argp_cleanup;}if (*devemu_pci_cfg.vuid == 0) {DOCA_LOG_ERR("The VUID parameter is missing");goto argp_cleanup;}

3. 其他

该文章中主要的主要流程的全流程代码

/** Sample main function** @argc [in]: command line arguments size* @argv [in]: array of command line arguments* @return: EXIT_SUCCESS on success and EXIT_FAILURE otherwise*/
int main(int argc, char **argv)
{struct devemu_pci_cfg devemu_pci_cfg;doca_error_t result;struct doca_log_backend *sdk_log;int exit_status = EXIT_FAILURE;/* Set the default configuration values (Example values) */strcpy(devemu_pci_cfg.devemu_manager_pci_address, "0000:03:00.0");strcpy(devemu_pci_cfg.dma_dev_name, "");strcpy(devemu_pci_cfg.vuid, "");strcpy(devemu_pci_cfg.write_data, "This is a sample piece of data from DPU!");devemu_pci_cfg.host_dma_mem_iova = 0x1000000;/* Register a logger backend */result = doca_log_backend_create_standard();if (result != DOCA_SUCCESS)goto sample_exit;/* Register a logger backend for internal SDK errors and warnings */result = doca_log_backend_create_with_file_sdk(stderr, &sdk_log);if (result != DOCA_SUCCESS)goto sample_exit;result = doca_log_backend_set_sdk_level(sdk_log, DOCA_LOG_LEVEL_WARNING);if (result != DOCA_SUCCESS)goto sample_exit;DOCA_LOG_INFO("Starting the sample");#ifdef DOCA_ARCH_DPUresult = doca_argp_init("doca_devemu_pci_device_dma_dpu", &devemu_pci_cfg);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to init ARGP resources: %s", doca_error_get_descr(result));goto sample_exit;}result = register_devemu_pci_params();if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to register sample command line parameters: %s", doca_error_get_descr(result));goto argp_cleanup;}result = doca_argp_start(argc, argv);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("Failed to parse sample input: %s", doca_error_get_descr(result));goto argp_cleanup;}if (*devemu_pci_cfg.vuid == 0) {DOCA_LOG_ERR("The VUID parameter is missing");goto argp_cleanup;}result = devemu_pci_device_dma_dpu(devemu_pci_cfg.devemu_manager_pci_address,devemu_pci_cfg.dma_dev_name,devemu_pci_cfg.vuid,devemu_pci_cfg.host_dma_mem_iova,devemu_pci_cfg.write_data);if (result != DOCA_SUCCESS) {DOCA_LOG_ERR("devemu_pci_device_dma_dpu() encountered an error: %s", doca_error_get_descr(result));goto argp_cleanup;}exit_status = EXIT_SUCCESS;argp_cleanup:doca_argp_destroy();#else // DOCA_ARCH_DPU(void)argc;(void)argv;DOCA_LOG_ERR("PCI Emulated Device DMA DPU can run only on the DPU");exit_status = EXIT_FAILURE;#endif // DOCA_ARCH_DPUsample_exit:if (exit_status == EXIT_SUCCESS)DOCA_LOG_INFO("Sample finished successfully");elseDOCA_LOG_INFO("Sample finished with errors");return exit_status;
}# 定义params的地方:
/** Register the command line parameters for the sample** @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise*/
static doca_error_t register_devemu_pci_params(void)
{doca_error_t result;result = register_devemu_manager_pci_address_param(pci_callback);if (result != DOCA_SUCCESS)return result;result = register_dma_device_name_param(device_name_callback);if (result != DOCA_SUCCESS)return result;result = register_vuid_param("DOCA Devemu emulated device VUID.", vuid_callback);if (result != DOCA_SUCCESS)return result;result = register_mem_address_param(mem_address_callback);if (result != DOCA_SUCCESS)return result;result = register_write_data_param(write_data_callback);if (result != DOCA_SUCCESS)return result;return DOCA_SUCCESS;
}# 将parmas存入到config中的回调函数(config是init函数的时候存入的)
/** ARGP Callback - Handle VUID parameter** @param [in]: Input parameter* @config [in/out]: Program configuration context* @return: DOCA_SUCCESS on success and DOCA_ERROR otherwise*/
static doca_error_t vuid_callback(void *param, void *config)
{struct devemu_pci_cfg *conf = (struct devemu_pci_cfg *)config;const char *vuid = (char *)param;return parse_vuid(vuid, conf->vuid);
}

4. DOCA ARGP包相关

4.1 主要接口

在这里插入图片描述

4.2 DOCA ARGP的2个rpm包

4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm

在这里插入图片描述

4.2.2 doca-sdk-argp-devel-2.9.0072-1.el8.x86_64.rpm

在这里插入图片描述

4.2.3 头文件和so库

参考doca_argp.h

5. 综述

本文拆解了argp的编程模式。本质就是一个用户态命令输入流的pipe line。并且提出了2个内存块param和config,在pipe line里面通过param中的callback进入每个param的处理流程,处理流程中就是把用户输入的param存入config中

参考:
https://docs.nvidia.com/doca/api/2.9.0/pdf/doca-libraries-api.pdf

相关文章:

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)

文章目录 1. 背景2. 设置参数的主要流程2.1 初始化2.2 注册某个params的处理方式以及回调函数2.4 定义好前面的params以及init指定config地点后start处理argv 3. 其他4. DOCA ARGP包相关4.1 主要接口4.2 DOCA ARGP的2个rpm包4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm4.2.…...

PostgreSQL高可用Patroni安装(超详细)

目录 一 安装Patroni 0 Patroni 对Python的版本要求 1 卸载原来的Python 3.6 版本 2 安装Python 3.7 之上版本 3 安装依赖 psycopg3 4 安装patroni 5 卸载 patroni 二 安装ETCD 1 使用 yum 安装 etcd 2 etcd 配置文件 3 管理 etcd 4 设置密码 5 常用命令 三 安装…...

mcu之,armv7架构,contex-M4系列,时钟树,中断,IO架构(一)

写这篇文章的目的,是记录一下arm架构的32mcu,方便记忆芯片架构原理,方便我展开对,BootLoader的研究。 arm架构,时钟树,先做个记录,有空写。...

论文解析:基于区块链的去中心化服务选择,用于QoS感知的云制造(四区)

目录 论文解析:基于区块链的去中心化服务选择,用于QoS感知的云制造(四区) 基于区块链的去中心化云制造服务选择方法 一、核心内容概述 二、核心创新点及原理与理论 三、实验与理论分析 PBFT(实用拜占庭容错) 论文解析:基于区块链的去中心化服务选择,用于QoS感知的…...

详细解析STM32 GPIO引脚的8种模式

目录 一、输入浮空(Floating Input):GPIO引脚不连接任何上拉或下拉电阻,处于高阻态 1.浮空输入的定义 2.浮空输入的特点 3.浮空输入的应用场景 4.浮空输入的缺点 5.典型配置方式 6.注意事项 二、输入上拉(Inpu…...

【hacker送书第16期】Python数据分析、挖掘与可视化、AI全能助手ChatGPT职场工作效率提升技巧与案例

解锁数据分析与AI应用的双重秘密:全面推广《Python数据分析、挖掘与可视化从入门到精通》与《AI全能助手ChatGPT职场工作效率提升技巧与案例》 前言Python数据分析、挖掘与可视化从入门到精通💕内容简介获取方式 AI全能助手ChatGPT职场工作效率提升技巧与…...

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言:自2021年起,翼鸥教育便开始应用OceanBase社区版,两年间,先后部署了总计12套生产集群,其中核心集群占比超过四分之三,所承载的数据量已突破30TB。自2022年10月,OceanBase 社区发布了4.2.x 版…...

WebGIS开发中不同坐标系坐标转换问题

在 JavaScript 中,使用 proj4 库进行坐标系转换是一个非常常见的操作。proj4 是一个支持多种坐标系的 JavaScript 库,提供了从一种坐标系到另一种坐标系的转换功能。 以下是使用 proj4 进行坐标系转换的基本步骤: 1. 安装 proj4 你可以通过…...

【青牛科技】视频监控器应用

1、简介: 我司安防产品广泛应用在视频监控器上,产品具有性能优良,可 靠性高等特点。 2、图示: 实物图如下: 3、具体应用: 标题:视频监控器应用 简介:视频监控器工作原理是光&#x…...

AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS

MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦,主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以,我们只能通过创建一个独立的窗口来实现。 1. 创建窗口 我对 Object-C 不熟悉,也不熟悉 Cocoa 框架,在 ChatGPT…...

PgSQL即时编译JIT | 第1期 | JIT初识

PgSQL即时编译JIT | 第1期 | JIT初识 JIT是Just-In-Time的缩写,也就是说程序在执行的时候生成可以执行的代码,然后执行它。在介绍JIT之前,需要说下两种执行方式:解释执行和编译执行。其中解释执行是通过解释器,将代码逐…...

Go小记:使用Go实现ssh客户端

一、前言 SSH(Secure Shell)是一种用于在不安全网络上安全访问远程计算机的网络协议。它通过加密的方式提供远程登录会话和其他网络服务,保证通信的安全性和数据的完整性。 本文使用golang.org/x/crypto/ssh包来实现SSH客户端 可以通过go …...

Nginx Spring boot指定域名跨域设置

1、Nginx配置跨域: server {listen 80;server_name your-backend-service.com;location / {proxy_pass http://localhost:8080; # Spring Boot应用的内部地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-F…...

深入理解Redis(七)----Redis实现分布式锁

基于Redis的实现方式 1、选用Redis实现分布式锁原因: (1)Redis有很高的性能; (2)Redis命令对此支持较好,实现起来比较方便 2、使用命令介绍: (1)SETNX SETNX …...

Database Advantages (数据库系统的优点)

数据库管理系统(DBMS)提供了一种结构化的方式来存储、管理和访问数据,与传统的文件处理系统相比,数据库提供了许多显著的优点。以下是数据库系统的主要优势: 1. Data Integrity (数据完整性) 概念:数据完整…...

Qt桌面应用开发 第五天(常用控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…...

初识Linux · 信号处理 · 续

目录 前言: 可重入函数 重谈进程等待和优化 前言: 在前文,我们已经介绍了信号产生,信号保存,信号处理的主题内容,本文作为信号处理的续篇,主要是介绍一些不那么重要的内容,第一个…...

【Linux】虚拟地址空间,页表,物理内存

目录 进程地址空间,页表,物理内存 什么叫作地址空间? 如何理解地址空间的区域划分? 地址空间结构体 为什么要有地址空间? 页表 cr3寄存器 权限标记位 位置标记位 其他 每个存储单元是一个字节,一…...

C++ 并发专题 - 线程安全的单例模式

一:概述: 在C编程中,call_once 是一种机制,用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C11 标准中,std::call_once 是由标准库提供的…...

Spring Boot汽车世界:资讯与技术的交汇

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...

【kafka】Golang实现分布式Masscan任务调度系统

要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

基于服务器使用 apt 安装、配置 Nginx

🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...