UADK Engine源码解析:从引擎绑定到硬件调用的完整流程
UADK Engine源码解析从引擎绑定到硬件调用的完整流程【免费下载链接】uadk_engine项目地址: https://gitcode.com/openeuler/uadk_engine前往项目官网免费下载https://ar.openeuler.org/ar/UADK Engine是openEuler社区中一个关键的硬件加速引擎它为OpenSSL提供了对鲲鹏处理器硬件加密能力的完整支持。本文将深入解析UADK Engine的源码架构带您了解从引擎绑定到硬件调用的完整流程帮助开发者理解这一高性能加密加速方案的工作原理。 UADK Engine概述硬件加速的桥梁UADK Engine作为OpenSSL的硬件加速引擎主要作用是将OpenSSL的加密操作无缝卸载到鲲鹏处理器的硬件加速单元。通过这种方式应用程序可以获得显著的性能提升特别是在处理大量加密运算的场景下。核心架构设计UADK Engine采用模块化设计每个加密算法都有独立的实现模块密码算法模块src/uadk_cipher.c - 处理AES、SM4等对称加密摘要算法模块src/uadk_digest.c - 支持SHA、SM3等哈希算法非对称加密模块src/uadk_rsa.c - RSA算法硬件加速密钥交换模块src/uadk_dh.c - DH密钥交换支持椭圆曲线模块src/uadk_ec.c - ECC椭圆曲线加密 引擎初始化与绑定流程1. 引擎注册与发现UADK Engine的入口点位于src/e_uadk.c这是引擎的核心注册文件。当OpenSSL加载引擎时会调用bind_engine函数进行初始化static int bind_engine(ENGINE *e, const char *id) { int ret; if (!ENGINE_set_id(e, engine_uadk_id) || !ENGINE_set_name(e, engine_uadk_name) || !ENGINE_set_cmd_defns(e, g_uadk_cmd_defns) || !ENGINE_set_ctrl_function(e, uadk_ctrl) || !ENGINE_set_destroy_function(e, uadk_destroy)) { return 0; } /* 绑定各种算法实现 */ ret uadk_e_bind_cipher(e); ret | uadk_e_bind_digest(e); ret | uadk_e_bind_rsa(e); ret | uadk_e_bind_dh(e); ret | uadk_e_bind_ecc(e); return ret; }2. 环境变量配置机制UADK Engine支持通过环境变量灵活配置硬件资源分配。在src/e_uadk.c中定义了以下配置项#define UADK_CMD_ENABLE_CIPHER_ENV ENGINE_CMD_BASE #define UADK_CMD_ENABLE_DIGEST_ENV (ENGINE_CMD_BASE 1) #define UADK_CMD_ENABLE_RSA_ENV (ENGINE_CMD_BASE 2) #define UADK_CMD_ENABLE_DH_ENV (ENGINE_CMD_BASE 3) #define UADK_CMD_ENABLE_ECC_ENV (ENGINE_CMD_BASE 4)用户可以通过openssl.cnf配置文件或环境变量来启用或禁用特定算法的硬件加速实现按需分配硬件资源。⚙️ 硬件调用流程详解1. 会话创建与上下文管理当应用程序调用加密API时UADK Engine首先创建硬件会话。以对称加密为例src/uadk_cipher.c中的会话创建流程static int uadk_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc) { struct cipher_priv_ctx *priv_ctx; /* 分配私有上下文 */ priv_ctx OPENSSL_zalloc(sizeof(*priv_ctx)); /* 设置硬件会话参数 */ priv_ctx-setup.alg get_alg_by_nid(ctx-cipher-nid); priv_ctx-setup.mode get_mode_by_nid(ctx-cipher-nid); /* 创建硬件会话 */ priv_ctx-sess wd_cipher_alloc_sess(priv_ctx-setup); /* 设置密钥和初始化向量 */ wd_cipher_set_key(priv_ctx-sess, key, ctx-key_len); if (iv) memcpy(priv_ctx-iv, iv, ctx-cipher-iv_len); }2. 同步与异步模式支持UADK Engine支持两种硬件调用模式在src/uadk_async.h中定义了异步处理机制同步模式阻塞式调用适合小数据量操作异步模式非阻塞式调用适合大数据量并行处理环境变量配置示例export WD_CIPHER_CTX_NUMsync:20,async:40 export WD_DIGEST_CTX_NUMsync:22,async:423. NUMA感知的资源分配UADK Engine支持NUMA架构感知的资源分配确保硬件资源在正确的NUMA节点上分配减少跨节点访问带来的性能损耗int uadk_e_set_env(const char *var_name, int numa_id) { char env_str[ENV_STRING_LEN]; snprintf(env_str, ENV_STRING_LEN, %s%d, var_name, numa_id); return putenv(env_str); } 性能优化策略1. 小包卸载阈值UADK Engine实现了智能的小包卸载机制在src/uadk_cipher.c中定义了阈值#define SMALL_PACKET_OFFLOAD_THRESHOLD_DEFAULT 192当数据包小于阈值时使用软件实现大于阈值时使用硬件加速。这种策略避免了小包场景下硬件调用的开销。2. 平台适配与兼容性引擎支持多种鲲鹏处理器平台在src/uadk.h中定义了平台标识enum { KUNPENG920, KUNPENG930, };不同平台的硬件能力不同UADK Engine会根据检测到的平台自动选择最优的算法实现。 配置与使用指南1. 编译与安装按照README中的步骤进行编译安装# 配置时指定引擎安装路径 ./configure --libdir/usr/local/lib/engines-1.1/ --enable-kae make sudo make install2. 环境配置在openssl.cnf中添加引擎配置openssl_cnf openssl_def [openssl_def] engines engine_section [engine_section] uadk_engine uadk_section [uadk_section] UADK_CMD_ENABLE_RSA_ENV 1 UADK_CMD_ENABLE_DH_ENV 1 UADK_CMD_ENABLE_CIPHER_ENV 1 UADK_CMD_ENABLE_DIGEST_ENV 1 UADK_CMD_ENABLE_ECC_ENV 13. 队列资源配置通过环境变量配置硬件队列资源# 配置同步和异步队列数量 export WD_RSA_CTX_NUMsync:20,async:40 export WD_CIPHER_CTX_NUMsync:22,async:42 测试与验证UADK Engine提供了完整的测试套件位于test/sanity_test.sh。测试脚本会验证各种加密算法的硬件加速功能是否正常工作。 最佳实践与性能调优1. 合理配置队列资源根据应用负载特点配置同步和异步队列比例CPU密集型应用增加同步队列数量IO密集型应用增加异步队列数量2. NUMA优化配置在多NUMA节点系统中将队列分配到应用运行的NUMA节点# 在NUMA节点0上分配队列 export WD_CIPHER_CTX_NUMsync:20,async:40 # 在NUMA节点2上分配队列 export WD_DIGEST_CTX_NUMsync:22,async:423. 监控与调试UADK Engine提供了丰富的调试信息可以通过环境变量控制日志级别帮助开发者定位性能瓶颈和问题。 总结与展望UADK Engine作为openEuler生态中的重要组件为鲲鹏处理器提供了完整的OpenSSL硬件加速支持。通过本文的源码解析我们了解了引擎绑定机制如何将UADK Engine注册到OpenSSL框架硬件调用流程从软件API到硬件加速单元的完整路径性能优化策略小包卸载、异步处理等关键技术配置最佳实践如何根据应用特点进行优化配置随着鲲鹏处理器的不断发展UADK Engine将持续演进为更多加密算法提供硬件加速支持为openEuler生态的高性能计算场景提供坚实的技术基础。通过深入理解UADK Engine的源码架构开发者可以更好地利用硬件加速能力优化应用程序的加密性能构建更安全、更高效的云原生应用。【免费下载链接】uadk_engine项目地址: https://gitcode.com/openeuler/uadk_engine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考