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

uECC:超轻量级嵌入式ECC密码库实战指南

1. uECC面向资源受限嵌入式系统的轻量级椭圆曲线密码学实现uECCmicro-ECC是一个专为深度嵌入式环境设计的极简椭圆曲线密码学ECC库。它不依赖标准C库、不使用动态内存分配、无浮点运算、无递归调用全部算法以纯C语言实现代码体积可压缩至4–8 KB Flash取决于所选曲线RAM占用仅需**~200 字节栈空间 固定静态缓冲区**。该库最初由Kris Kusano开发后被广泛移植至ARM Cortex-M系列包括mbed OS平台、RISC-V MCU、8-bit AVR及MSP430等超低功耗平台在物联网终端安全启动、固件签名验证、TLS握手精简栈、LoRaWAN Join Accept解密、可信执行环境TEE密钥协商等场景中成为事实标准。与OpenSSL、mbed TLS等通用密码库不同uECC并非功能完备的协议栈而是一个专注核心数学原语的底层密码引擎。它不实现X.509证书解析、PKCS#8密钥格式、TLS记录层或任何网络I/O逻辑其唯一使命是在最小资源开销下可靠完成ECC标量乘法k·G、ECDSA签名/验签、ECDH密钥协商三项基础操作。这种“只做一件事并做到极致”的工程哲学使其成为MCU上部署公钥密码能力的首选——尤其当芯片仅有64KB Flash、8KB RAM且无硬件加密加速器时。1.1 设计哲学与工程约束uECC的设计严格遵循嵌入式底层开发的四大铁律零堆内存依赖所有缓冲区均声明为static或通过用户传入的栈/全局数组提供避免malloc()带来的碎片化与不确定性。这对FreeRTOS等实时OS至关重要——任务栈大小必须静态可知。确定性执行时间所有循环次数固定如Montgomery ladder步数曲线位宽无条件分支跳转依赖秘密数据天然抵抗时序侧信道攻击。uECC_sign()最坏情况耗时恒定适用于高安全等级场景。可配置裁剪性通过预处理器宏精细控制功能集。例如uECC_OPTIMIZATION_LEVEL控制汇编优化级别0纯C1内联汇编加速模约减uECC_SQUARE_FUNC启用专用平方函数比通用乘法快30%uECC_VLI_NATIVE_LITTLE_ENDIAN适配小端MCU避免字节序转换开销跨平台ABI稳定性API接口完全基于uint8_t数组和int返回值不使用结构体打包规避对齐差异确保在ARM GCC、IAR EWARM、Keil MDK甚至SDCC8051下二进制兼容。这种设计使uECC能无缝集成至裸机系统、CMSIS-RTOS、FreeRTOS乃至Zephyr RTOS无需修改内核配置——开发者只需关注密钥生命周期管理与业务逻辑绑定。2. 核心密码学功能与API详解uECC支持NIST P-192、P-224、P-256、P-384四条标准曲线以及secp160r1、secp192r1等旧式曲线。所有实现均通过[NIST SP 800-56A]和[ANSI X9.62]标准测试向量验证满足FIPS 140-2 Level 1安全要求。以下按功能模块解析关键API及其工程实践要点。2.1 椭圆曲线参数与上下文管理uECC不维护全局状态所有操作通过显式传递的uECC_Curve指针进行。曲线定义结构体uECC_Curve_t包含基点G的x、y坐标大端字节数组阶n私钥取值范围模数p有限域GF(p)的素数曲线方程参数a,b优化函数指针mul,sqrt,modinv等// 典型初始化选择P-256曲线最常用 #include uECC.h const uECC_Curve_t curve uECC_secp256r1();工程提示uECC_secp256r1()返回const指针其数据存储在Flash中。若需运行时切换曲线如多协议兼容应将曲线结构体复制到RAM并修改函数指针——但会增加约1KB RAM开销。2.2 密钥生成与管理私钥为[1, n-1]区间内的随机整数公钥为d·Gd为私钥G为基点。uECC提供两种生成方式2.2.1 安全随机数注入推荐uint8_t private_key[uECC_BYTES]; // uECC_BYTES32 for P-256 uint8_t public_key[uECC_BYTES * 2]; // 压缩格式0x02/0x03 x // 使用硬件TRNG如STM32 HSERNG填充 HAL_RNG_GenerateRandomNumber(hrng, (uint32_t*)private_key); // 生成公钥压缩格式输出 if (!uECC_make_key(public_key, private_key, curve)) { Error_Handler(); // 返回0表示失败如私钥为0 }关键参数说明参数类型说明public_keyuint8_t*输出缓冲区长度2*uECC_BYTES。若需非压缩格式0x04 x y需额外uECC_BYTES空间private_keyuint8_t*输入私钥大端字节数组高位补零至uECC_BYTES长度curveuECC_Curve_t曲线描述符决定密钥长度与算法2.2.2 确定性密钥派生用于HSM/SE// 从主密钥派生子密钥如BIP-32 uint8_t seed[32] { /* HSM导出的根密钥 */ }; SHA256(seed, 32, private_key); // SHA256哈希作为私钥 // 注意需确保结果 ∈ [1, n-1]否则重哈希 while (uECC_valid_private_key(private_key, curve) 0) { SHA256(private_key, 32, private_key); }安全警告直接使用rand()或LFSR生成私钥存在熵不足风险。必须使用符合FIPS 140-2的TRNG源或经密码学哈希处理的高熵种子。2.3 ECDSA数字签名与验证ECDSA流程sign(H(m), d) → (r,s)verify(H(m), Q, (r,s)) → true/false。uECC要求消息哈希值h已预先计算通常为SHA-256输出。2.3.1 签名生成uint8_t hash[32] {0}; // 消息m的SHA-256哈希 uint8_t signature[uECC_BYTES * 2]; // r||s各占uECC_BYTES字节 // 签名使用硬件加速的SHA256可在此前完成 if (!uECC_sign(private_key, hash, sizeof(hash), signature, curve)) { // 签名失败可能因随机数k生成异常或曲线无效 return ERROR_ECC_SIGN_FAIL; } // signature[0..31] r, signature[32..63] s (P-256)性能数据Cortex-M4 100MHz操作耗时说明uECC_sign()~180ms含Montgomery ladder标量乘 模逆运算uECC_verify()~320ms需两次标量乘r⁻¹·h·G r⁻¹·s·Q2.3.2 签名验证uint8_t public_key_compressed[33]; // 0x02/0x03 x uint8_t signature[64]; // r||s // 验证前需解压公钥若存储为压缩格式 uint8_t public_key_full[65]; // 0x04 x y if (!uECC_decompress_public_key(public_key_compressed, public_key_full, curve)) { return ERROR_DECOMPRESS_FAIL; } // 执行验证 if (!uECC_verify(public_key_full, hash, sizeof(hash), signature, curve)) { // 验证失败签名被篡改或公钥无效 return ERROR_SIGNATURE_INVALID; }工程陷阱uECC_verify()输入的公钥必须为非压缩格式65字节。若设备存储的是压缩公钥33字节必须调用uECC_decompress_public_key()转换否则返回0。此步骤消耗约15msP-256但不可省略。2.4 ECDH密钥协商ECDH用于建立共享密钥shared_secret d_A · Q_B d_B · Q_A。uECC仅计算d·Q标量乘不处理密钥派生函数KDF。// 设备A私钥d_A公钥Q_A设备B私钥d_B公钥Q_B uint8_t secret[uECC_BYTES]; uint8_t public_key_B[65]; // B的非压缩公钥 // A计算共享密钥d_A · Q_B if (!uECC_shared_secret(private_key_A, public_key_B, secret, curve)) { return ERROR_ECDH_FAIL; } // secret即32字节原始共享密钥需经HKDF-SHA256派生会话密钥 uint8_t session_key[16]; HKDF_SHA256(secret, uECC_BYTES, NULL, 0, AES-128-KEY, 11, session_key, 16);安全实践原始secret不可直接用作加密密钥必须通过HKDF等KDF派生以消除ECC点坐标的统计偏差并支持密钥分离如分别派生加密密钥、MAC密钥、IV。3. 在典型嵌入式平台上的集成实践3.1 STM32 HAL平台集成Cortex-M4在STM32CubeMX生成的工程中需注意三类资源协调3.1.1 时钟与中断配置uECC本身无中断依赖但若配合硬件TRNG如STM32L4的RNG外设需启用RNG时钟并处理就绪中断// MX_RNG_Init()中添加 __HAL_RCC_RNG_CLK_ENABLE(); HAL_RNG_Init(hrng); // 在RNG_IRQHandler中置位标志位供uECC密钥生成使用3.1.2 内存布局优化将uECC常量曲线参数置于Flash临时缓冲区置于RAM// uECC_config.h 中强制常量到Flash #define uECC_FLASH_CONSTANTS __attribute__((section(.flash_const))) // 链接脚本中定义.flash_const段 /* FLASH */ .flash_const (RX) : { *(.flash_const) } FLASH3.1.3 FreeRTOS任务隔离为防栈溢出为ECC任务分配充足栈空间P-256建议≥512字节void vECC_Task(void *pvParameters) { StackType_t xECCStack[512]; // 2KB栈 StaticTask_t xECCBuffer; xTaskCreateStatic( vECC_Worker, ECC_TASK, 512, NULL, tskIDLE_PRIORITY 3, xECCStack, xECCBuffer ); }3.2 mbed OS 6.x集成要点mbed OS 6默认使用Arm Mbed TLS但uECC可作为其底层加速引擎。关键步骤禁用Mbed TLS ECC模块在mbed_app.json中设置target.features_add: [UVISOR], macros: [MBEDTLS_ECP_DP_SECP256R1_ENABLED0]注册uECC为自定义ECP模块// 在main.cpp中 extern C { int mbedtls_ecp_mul(mbedtls_ecp_group *grp, mbedtls_ecp_point *R, const mbedtls_mpi *m, const mbedtls_ecp_point *P, int (*f_rng)(void *, unsigned char *, size_t), void *p_rng) { // 将mbedtls_mpi转换为uECC格式调用uECC_point_mult() return uECC_point_mult(R-X.p, R-Y.p, R-Z.p, m-p, P-X.p, P-Y.p, grp-p, grp-n); } }利用mbed TLS的硬件抽象层HAL通过mbedtls_hardware_poll()注入TRNG避免软件熵池阻塞。3.3 RISC-V平台GD32VF103适配RISC-V缺乏ARM的__CLZ指令需重写uECC_vli_numBits()// 替换uECC.c中的vli_numBits实现 static int uECC_vli_numBits(const uint8_t *vli, wordcount_t num_words) { wordcount_t i; for (i num_words; i 0; --i) { word_t word vli[(i-1)*sizeof(word_t)]; if (word) { // RISC-V查表法计算最高位 static const uint8_t bit_pos[256] { /* 0..7 for each byte */ }; return (i-1)*8 bit_pos[word 0xFF] 1; } } return 0; }4. 安全增强与抗侧信道实践4.1 时序攻击防护uECC默认启用Montgomery ladder而非NAF已消除标量乘的时序差异。但需注意私钥加载避免memcpy()导致的缓存时序泄露改用volatile循环volatile uint8_t *dst (volatile uint8_t*)private_key; for (int i 0; i uECC_BYTES; i) { dst[i] random_bytes[i]; }4.2 故障攻击防护Glitching在安全启动场景中需检测标量乘中间结果是否非法// 修改uECC_point_mult()末尾添加点有效性检查 if (!uECC_valid_point(x, y, curve)) { memset(secret, 0, sizeof(secret)); return 0; // 强制失败防止故障泄露 }4.3 密钥生命周期管理私钥永不离开安全区域在带TrustZone的Cortex-M33上将private_key变量置于Secure RAM并禁用非安全总线访问。公钥指纹校验设备启动时用ROM中烧录的CA公钥验证固件签名再用该固件中的公钥验证应用签名形成信任链。5. 性能调优与尺寸裁剪指南5.1 编译选项对照表宏定义默认值影响适用场景uECC_ENABLE_VLI_API1启用底层VLIVery Large Integer函数调试/自定义算法uECC_SQUARE_FUNC1启用专用平方函数比乘法快30%Flash充裕追求速度uECC_ENABLE_CURVE_P1920禁用P-192曲线仅需P-256时节省1.2KB FlashuECC_ENABLE_VERIFY1启用验签功能若仅需签名可设0省去3KB代码5.2 尺寸实测数据GCC 10.3, -Os配置Flash占用RAM占用说明P-256 only, no verify4.1 KB192 B最小化部署P-256 P-224 verify7.8 KB216 B多曲线兼容P-256 assembly opt4.9 KB192 B启用uECC_OPTIMIZATION_LEVEL1裁剪示例某NB-IoT模组仅需固件签名验证禁用uECC_ENABLE_SIGN0、uECC_ENABLE_ECDH0仅保留uECC_VERIFY最终代码降至3.3KB。6. 常见问题诊断与调试技巧6.1 签名验证失败的五大原因现象根本原因解决方案uECC_verify()始终返回0公钥格式错误未解压调用uECC_decompress_public_key()验证偶尔失败随机数k生成重复检查TRNG熵源添加重试机制uECC_make_key()返回0私钥为0或≥n添加uECC_valid_private_key()校验哈希值长度不匹配hash_len传入32而非sizeof(hash)使用sizeof()而非硬编码跨平台签名不一致字节序处理错误确保哈希、私钥均为大端格式6.2 调试辅助函数在uECC_debug.h中添加#ifdef DEBUG_UICC #define DUMP_HEX(name, ptr, len) do { \ printf(%s: , #name); \ for(int i0; i(len); i) printf(%02x, (ptr)[i]); \ printf(\n); \ } while(0) #endif在关键路径插入DUMP_HEX(pubkey, public_key, 65)比JTAG单步更高效定位数据流错误。7. 生产环境部署 checklist[ ] 私钥生成后立即清零memset_s(private_key, 0, sizeof(private_key))[ ] 所有uECC_*函数返回值必须检查失败时触发安全状态如禁用通信[ ] 在Bootloader中集成uECC实现Secure Boot验证App签名后再跳转[ ] 对uECC_sign()添加看门狗喂狗防死循环Montgomery ladder最大迭代次数256[ ] 使用-Wl,--defsym__stack_size0x800确保栈足够避免静默溢出uECC的价值不在其代码行数而在于它让一颗32KB Flash的MCU拥有了与云端服务器同等的密码学身份认证能力。当你的设备在野外运行五年后仍能通过一条LoRa消息证明“我是我”而非被伪造的固件劫持——这正是uECC在每一行C代码中刻下的嵌入式安全基因。

相关文章:

uECC:超轻量级嵌入式ECC密码库实战指南

1. uECC:面向资源受限嵌入式系统的轻量级椭圆曲线密码学实现uECC(micro-ECC)是一个专为深度嵌入式环境设计的极简椭圆曲线密码学(ECC)库。它不依赖标准C库、不使用动态内存分配、无浮点运算、无递归调用,全…...

性能测试有哪些?

一、按测试目的与策略分类1.负载测试定义:模拟系统在预期正常workload下的表现。逐步增加并发用户数或数据量,观察系统性能指标(响应时间、吞吐量、资源利用率)是否满足预设的“性能阈值”。目的:验证系统在生产环境预…...

架构演进之 DDD:从 CRUD 到领域驱动设计

前言:每一个贫血模型背后,都有一个渐行渐远的业务在软件开发的早期阶段,我们通常从一个简单的 CRUD 应用开始。随着业务逻辑日益复杂,代码库逐渐膨胀,我们开始面临一个普遍的问题:业务逻辑散落在各处&#…...

003 TimeTagger 时间跟踪工具本地部署与开机自启

TimeTagger 本地部署与开机自启手册 一、TimeTagger 产品介绍 TimeTagger 是一款轻量级、开源免费的Web端时间跟踪工具,基于PythonWeb技术开发,支持本地离线运行、时间记录分类、数据统计分析,无需云端账号即可实现数据本地持久化存储&#…...

HMC5883L磁力计驱动开发与航向解算实战

1. HMC5883L电子罗盘芯片技术解析与嵌入式驱动开发实践HMC5883L是由Honeywell公司推出的三轴磁力计(Magnetometer),专为高精度地磁方向检测而设计。尽管其已逐步被更新型号(如QMC5883L、AK09916等)替代,但在…...

别再暴力删括号了:一道“删除无效括号”,看懂搜索本质与剪枝思维

别再暴力删括号了:一道“删除无效括号”,看懂搜索本质与剪枝思维 大家好,我是Echo_Wish。 今天聊一道很多人“看着简单,写起来崩溃”的经典题—— 👉 删除无效的括号(Remove Invalid Parentheses) 这题我第一次做的时候,说实话,脑子里只有一个想法: 👉 “不就…...

Audio Pixel Studio新手指南:MP3/WAV/OGG多格式兼容性测试与编码建议

Audio Pixel Studio新手指南:MP3/WAV/OGG多格式兼容性测试与编码建议 1. 认识Audio Pixel Studio Audio Pixel Studio是一款基于Streamlit开发的轻量级音频处理Web应用,专为需要快速处理音频内容的创作者设计。它集成了两大核心功能:Edge-T…...

BBDown:告别在线观看限制,打造你的专属B站离线视频库

BBDown:告别在线观看限制,打造你的专属B站离线视频库 【免费下载链接】BBDown Bilibili Downloader. 一款命令行式哔哩哔哩下载器. 项目地址: https://gitcode.com/gh_mirrors/bb/BBDown 你是否曾经遇到过这样的情况:想要收藏B站上的精…...

Java集合入门必看:ArrayList与LinkedList常用方法详解(附实战案例)

在Java开发中,集合是日常使用频率极高的工具,而ArrayList和LinkedList作为List接口的两大核心实现类,分别适用于不同的业务场景。很多初学者在使用时,常常混淆两者的方法用法,不清楚何时该用ArrayList、何时该用Linked…...

本地大模型系列:2.通过API让本地大模型为你服务

上一篇我们介绍了ollama和lmstudio,这两个工具都是个人版的运行大模型的工具,可以用来运行本地小参数的LLM(所谓小参数一般指不超过27B的4bit量化LLM,按照1B参与大约需要0.7G显存加载进行预测,加上其他开销月1-1.5G&am…...

Spring AI Alibaba MCP协议实战:模型上下文协议集成与工具调用

Spring AI Alibaba MCP协议实战:模型上下文协议集成与工具调用 导读:MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年末发布的开放标准,旨在解决 AI 工具调用的碎片化问题。Spring AI …...

嵌入式信号发生器库:高精度方波生成与载波调制

1. SignalGenerator 库概述SignalGenerator 是一个轻量级、可移植的嵌入式信号发生器开源库,专为资源受限的微控制器设计。其核心目标是在任意 GPIO 引脚上生成高精度、可编程的方波信号,同时支持载波调制(Carrier Modulation)功能…...

XPath 语法完全指南:从基础语法到 SQL 注入中的应用

爬虫、处理过配置文件、或者接触过 MySQL 的 XML 函数的一定都见过 XPath 这个名词。它是一种专门用来在 XML 文档中“寻址”的语言,语法像文件路径一样直观。同时,XPath 是 Web 安全领域中 SQL 报错盲注中的关键角色。一、XPath 是什么?XPat…...

南北阁 Nanbeige 4.1-3B 企业应用方案:私有化部署+对话记忆管理+审计日志扩展接口

南北阁 Nanbeige 4.1-3B 企业应用方案:私有化部署对话记忆管理审计日志扩展接口 想在企业内部部署一个既智能又安全的对话AI吗?今天我们来聊聊如何基于南北阁 Nanbeige 4.1-3B 模型,打造一个功能完备的企业级对话应用。这个方案不仅支持纯本…...

保姆级教程:用Python+Robotics Toolbox搞定Panda机械臂的DH建模与正逆解(附避坑指南)

从零实现Panda机械臂运动学:Python Robotics Toolbox实战指南 机械臂控制是机器人领域的核心技术之一,而运动学建模则是实现精准控制的基础。本文将带您使用Python的Robotics Toolbox,一步步完成Franka Emika Panda机械臂的DH参数建模、正运动…...

【JSReverser-MCP】一句话逆向猿人学21题

近期听闻AI可以做逆向了,于是赶紧来试一试。 相关参考: vibe coding 氛围编程 Vibe coding 用 AI 做 JS 逆向食用教程 JSReverser-MCP 源:https://github.com/NoOne-hub/JSReverser-MCP 安装 环境要求 nodejs v22及以上 已部署Claude code或codex…...

GLM-TTS语音克隆实测:5分钟搞定方言克隆,效果惊艳!

GLM-TTS语音克隆实测:5分钟搞定方言克隆,效果惊艳! 1. 引言:语音克隆技术的新突破 在数字内容爆炸式增长的今天,个性化语音合成技术正成为内容创作者、企业客服、教育机构等领域的刚需。传统语音克隆方案往往需要数小…...

Adafruit ICM20X库详解:ICM20649与ICM20948驱动开发指南

1. 项目概述 Adafruit ICM20X 是 Adafruit 官方维护的 Arduino 兼容库,专为 TDK InvenSense 公司推出的 ICM20649 与 ICM20948 两款高性能 MEMS 运动传感器设计。该库并非通用型 ICM20X 系列驱动,而是聚焦于 Adafruit 自行设计并销售的硬件模块——即 I…...

计算机视觉进阶教学之Mediapipe库(一)

目录 简介 一、Mediapipe Python的安装和应用 二、手部检测 1. 导入必要的库 2. 初始化 MediaPipe 组件 3. 配置并创建手部检测模型实例 4. 启动摄像头并进入主循环 5. 绘制检测结果 三、手势识别 1. 手势识别核心逻辑 a. 计算基准距离 (Base Distance) b. 计算各手…...

Alpamayo-R1-10B开源模型价值:降低L4研发门槛,让算法团队专注因果逻辑而非工程胶水

Alpamayo-R1-10B开源模型价值:降低L4研发门槛,让算法团队专注因果逻辑而非工程胶水 1. 项目概述 Alpamayo-R1-10B是NVIDIA推出的自动驾驶专用开源视觉-语言-动作(VLA)模型,作为一套完整的自动驾驶研发工具链&#xf…...

SmolVLA参数详解:256×256输入分辨率对边缘计算设备的友好性分析

SmolVLA参数详解:256256输入分辨率对边缘计算设备的友好性分析 1. 引言:为什么边缘设备需要紧凑的视觉语言动作模型 在机器人技术和边缘计算领域,我们经常面临一个核心矛盾:强大的AI能力需要大量计算资源,而边缘设备…...

论文AI率突然从20%涨到50%怎么办?紧急处理攻略

论文AI率突然从20%涨到50%怎么办?紧急处理攻略 上周五,一个学妹发消息给我,语气挺崩溃的:“学长,我的论文上个月查AI率才18%,今天重新查直接变成52%了,后天就要交终稿,怎么办啊&…...

密码学算法 - 连分数算法

当你在计算某个数的近似值时🔍,或者在求解某个方程的根时🧮,连分数算法 就像一把神奇的放大镜🔎,能帮你逐步逼近那个隐藏在数字背后的真相。 欢迎来到《密码学核心算法实战》的连分数专题!这里…...

Linux内核构建三要素:Makefile、Kconfig与.config协同机制

1. Linux内核构建系统核心机制解析:Makefile、Kconfig与.config的协同关系在嵌入式Linux开发实践中,内核编译常被视为一道技术门槛。开发者面对庞大的源码树(以Linux-3.4.2为例,包含超过2.5万文件),往往陷入…...

DIY四足机器人入门:用开源项目打造你的第一个仿生机器狗

DIY四足机器人入门:用开源项目打造你的第一个仿生机器狗 四足机器人正从实验室走向创客空间。想象一下,周末午后在自家工作台上组装出一台能行走、奔跑甚至跳舞的机器狗——这不再是科幻场景。得益于MIT Mini Cheetah等开源项目的出现,普通爱…...

HAR实战指南:从Kinetics-400数据集获取到视频帧预处理全流程解析

1. Kinetics-400数据集入门指南 第一次接触Kinetics-400数据集时,我被它庞大的规模震撼到了。这个包含40万段视频片段的数据集,涵盖了从"打篮球"到"刷牙"等400种日常动作,是训练人体动作识别(HAR)模型的黄金标准。但随之…...

通义千问3-Reranker-0.6B模型压缩:基于TensorRT的推理加速

通义千问3-Reranker-0.6B模型压缩:基于TensorRT的推理加速 1. 为什么需要对Qwen3-Reranker做TensorRT优化 你可能已经试过直接加载Qwen3-Reranker-0.6B跑重排序任务,但很快会发现:推理速度不够快,显存占用偏高,尤其在…...

2026年AI提示词(Prompt)终极指南:国内聚合站实战技巧

在AI应用日益深入的2026年,能否写出高质量的提示词(Prompt),直接决定了你从GPT、Claude、Gemini等大模型中获得价值的效率与深度。对于国内用户,学习和实践提示词工程的最佳平台是聚合型AI镜像站。目前,通过…...

大模型学习笔记------SAM模型架构拆解与实战指南

1. SAM模型架构全景拆解 第一次接触SAM模型时,我被它"分割一切"的野心震撼到了。这就像给计算机视觉领域扔下了一颗原子弹——传统需要专门训练的分割任务,现在通过提示词就能实时完成。在实际部署医疗影像标注系统时,我发现理解这…...

读了Linux内核slab源码,发现Linus在20年前就写出了比std::pmr更高效的内存池——内核内存管理的4个设计模式

一、C++的内存池,和内核比差在哪? C++程序员对内存管理不陌生。从最基本的new/delete,到C++17引入的std::pmr::polymorphic_allocator,再到各种第三方库的对象池实现,我们一直在和内存分配器打交道。 但你有没有想过一个问题:为什么C++标准库直到2017年才搞出std::pmr这…...