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

C++函数栈帧详解

函数栈帧的创建和销毁

在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体取决于编译器的实现!

且需要注意的是,越高级的编译器越不容易观察到函数栈帧的内部的实现;

关于函数栈帧的维护这里我们要重点介绍两个寄存器:ebp和esp

这两个寄存器存放的是用来维护函数栈帧的地址!

每一个函数调用,都要在栈区创建一个空间!

问题:什么是函数栈帧?

函数栈帧实际上就是函数运行时栈上的一块空间!用于存储相对应的临时数据!

接下来讲解以x86系统为例:

这里对函数栈帧管理就是靠这两个寄存器:

  • ebp:被称为基址指针,指向栈帧的底部,(高地址处,且是固定位置!);
  • esp:被称为栈顶指针,指向栈帧的顶部,(低地址处,地址可变);

这里需要注意的是,对于栈来说,是优先使用高地址的(栈的特性!)! 

问题:那么函数的栈帧中都存放了哪些数据?

从低地址到高地址依次存放了:

  • 调用栈帧的基址指针(ebp)--- 用于函数调用后恢复栈帧状态;
  • 下一条指令的地址 --- 执行完该函数后跳转到下一条指令;
  • 被调用的函数的参数(形参) --- 需要注意的是会从右到左进行压栈;
  • 被调用函数的局部变量和临时数据;
  • 寄存器的上下文(例如调用函数期间,使用的ebx、esi、edi等寄存器);

问题:main函数会被其他函数调用吗? 

需要注意的是,main函数也是可以被其他函数调用的:

即__tmainRTStartup会调用main函数!

问题:那么哪个谁调用 __tmainRTStartup这个函数?

__tmainRTStartup会被mainCRTStartup这个函数调用!

所以,这里我们总结一下:

因此,假如说当前我们的main函数里面调用了一个简单的add函数,那么:

中间绿色的框是我们对应的main函数的调用堆栈,而在调用main函数之前,会先调用__tmainRTStartup和mainRTStartup这两个函数!

而add函数在main函数上面,也就是对应的压栈!

问题:但是函数栈帧中具体是怎么进行相关操作的?

示例代码操作

这里我们以一个简单的代码为例,讲解一下对应的相关操作:

其对应的汇编代码如下所示:

需要注意的是,在调用main函数之前,调用main函数的那两个函数的栈帧已经被创建好了!

这里我们对上面出现的汇编指令做一些简单的解释:

  • push实际上就是压栈,将对应的数据压入栈中;
  • mov:实际是就是赋值,这里mov ebp esp实际上就是把esp赋值给ebp;
  • sub:减去对应的地址;
  • lea(load effecitive address):计算内存地址并存入到寄存器当中(不访问内存,仅计算结果);

这里实际上lea到rep stos这四行汇编代码的作用就是将对应的栈的空间的数据都初始化为cc!

  • 压栈:在栈顶上放一个元素;
  • 出栈:从栈顶删除一个元素;

 截止到现在,做的都是初始化相关的任务,此时才开始到函数体内执行对应的任务;

假设每一行代表4个字节:

表示的就是将10这个值放到ebp-8的位置处;

         可以看到,也就是在ebp-8的位置上放10!

        需要注意的是,上面这里我们是把10放进入了,如果没有把10放进入,此时就是默认提供的随机值,因此在C语言中,如果我们没有进行初始化经常会打印出一堆烫烫烫烫(此时就是对应的内存栈上放的是一堆cccc)

此时可以看到对应的内存对其进行了修改(小端存储) 

接下来我们再看int b = 20;这条汇编代码:

dword ptr [ebp-14h], 14h

这段代码实际上就是在ebp-14h这个地址处,填充数字20;

对应的示意图如下所示:

 接下来我们再把int c = 0;也是在对应的栈上进行初始值:

当我们定义好对应的变量时,此时我们会调用add函数:

接下来我们按照对应的汇编代码进行分析:

  • 这里eax指向[ebp -14h],也就是让eax指向b;
  • 然后对eax进行压栈;
  • 接下来让ecx的值指向[ebp-8],也就是ecx指向a;
  • 然后在对ecx进行压栈;

即截止到现在,我们进行的任务就是我们对应的传参工作!

 接下来这里我们要调用对应的call指令:

call指令此时会跳转地址,即这里会跳转到我们对应的红色线框对应的地址!

这里需要注意的是,call完成了两个任务:

  • 将下一条指令的地址(00C21450)进行压栈,压入到栈中;
  • 跳转到对应的地址执行函数体;

接下来就跳转到对应的函数体当中:

其中,上面一堆的逻辑和main函数一样,都是开辟对应的空间,然后进行初始化;

实际上代码逻辑和我们上面讲的是一样的;

此时,我们依然假设每一行是4个字节,即此时每一行可以代表一个整形:

接下来我们依次看对应的汇编代码:

int z = 0;
mov dword ptr [ebp-8,0]

 这里实际上就是把ebp-8指向的这个空间初始化为0;

然后这里把[ebp+8]的值赋值给eax当中:

这里[ebp+8]的值实际上就是之前我们的ecx的值也就是10!

然后再加上[ebp+och]的值,och换算为10进制为12,也就是这里我们之前eax的值!

加完之后,再把算出来的结果返回到ebp-8当中,也就是z!

问题:我们在函数栈帧中有创建对应的形参吗?

没有!在我们call进入函数体之前,我们就通过形参压栈到对应的栈帧当中!

并且参数的压栈顺序是从右向左!

问题:如何再理解形参是实参的一份临时拷贝呢?

这里我们在梳理下逻辑:

  • 在调用add函数之前,会对形参从右到左进行一份拷贝;
  • 而形参是调用函数之前,从main函数里面拷贝的实参!

可以看到上面的ecx和eax是对应的a和b的一份临时拷贝!

所以改变形参不会改变对应的实参!

接下来我们再回到上面对应的代码当中:上面我们只是把计算的值写入到了z当中;

这里我们重点看return z的汇编代码:

mov eax,dword ptr[ebp-8]

这里是把对应的返回值存入到了eax寄存器当中;

需要注意的是寄存器的值不会随着函数栈帧被销毁而丢失!

接下来执行pop对应的汇编代码,这里也就是出栈,对应的esp栈顶指针会进行移动:

由于此时结果已经运行出来,保存到了eax寄存器当中,所以这里接下来直接对栈帧销毁即可!

这里直接进行:

mov ebp,esp

此时栈顶指针直接指向栈底指针!

然后让栈底指针进行出栈:

pop ebp

 实际上就是将add函数的栈底指针出栈,恢复到main函数当中;

pop:不仅对应的空间进行出栈,此时esp还需要+4个字节的地址;

ret

 ret指令实际上就是从栈顶跳出之前call的下一条指令的地址,然后跳转过去;

需要注意的是:ebp和esp维护的是当前执行的函数的栈帧空间,而不是整个程序的栈帧空间!

接下来就返回到执行call之后的部分:

这里执行对esp执行add,实际上就是将对应的压栈的形参进行销毁;

此时上面压栈的两个形参也会被销毁掉; 

然后将eax的值赋值给[ebp - 20h]这个位置!

那么这个ebp-20是什么呢?

实际上就是我们对应的参数c的值,这里把计算返回的值交到c当中!

讲到这里,我们就实现了从计算值然后从函数栈帧返回出来的处理;

main函数的函数栈帧和add的大同小异,所以这里我们就不再过多介绍了!

所以接下来我们就可以回答一些问题了:

问题:为什么局部变量不初始化的时候是随机值呢?

因为这里的局部变量是我们按要求设置的,例如vsstudio都初始化为cc;

问题:函数是如何进行传参的?

实际上当我们还没有调用函数的时候,此时形参就进行从右到左依次进行压栈处理(临时拷贝一份);

问题:函数调用的结果怎么返回?

值保存到寄存器当中,例如eax当中;且call会对下一条指令的地址进行压栈,运行结束后再取出地址;

相关文章:

C++函数栈帧详解

函数栈帧的创建和销毁 在不同的编译器下,函数调用过程中栈帧的创建是略有差异的,具体取决于编译器的实现! 且需要注意的是,越高级的编译器越不容易观察到函数栈帧的内部的实现; 关于函数栈帧的维护这里我们要重点介…...

Wireshark抓账号密码

训练内容: 1. 安装Ethereal或者Wireshark,熟悉网络嗅探器的使用方法; 2. 实现浏览器与IIS服务器的ssl安全访问; 3. 利用网络嗅探器截获浏览器访问IIS服务器之间数据包,包括有ssl安全连接(https方式&am…...

【hot100】bug指南记录1

之前学了一阵C,还是更熟悉C的语法呀,转Java还有点不适应........ 这个系列纯纯记录自己刷题犯的愚蠢的错误......hhhh,我是人,one 愚蠢的码人...... 巩固巩固基础好吗?!编程菜鸟.......hhh,又…...

物联网从HomeAssistant开始

文章目录 一、在树梅派5上安装home-assistant二、接入米家1.对比下趋势2.手动安装插件3.配置方式 三、接入公牛1.手动安装插件2.配置方式 一、在树梅派5上安装home-assistant https://www.home-assistant.io/installation/ https://github.com/home-assistant/operating-syste…...

2025年渗透测试面试题总结-网络安全、Web安全、渗透测试笔试总结(一)(附回答)(题目+回答)

网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 网络安全、Web安全、渗透测试笔试总结(一) 1.什么是 WebShell? 2.什么是网络钓鱼? 3.你获取网络…...

C++ set和map系列(关联式容器)的介绍及使用

欢迎来到干货小仓库 "一个好汉三个帮,程序员同样如此" 1.关联式容器 STL中的容器分为两类,序列式容器和关联式容器。 序列式容器:例如STL库中的vector、list和deque、forward_list(C11)等,这些容器统称为序列式容器&…...

C#与Halcon联合编程

一、加载图片 导入并初始化 using HalconDotNet; ho_Image new HObject();需要在引用中导入 halcondotnet.dll 关联句柄 打开新窗口 //创建一个句柄变量 绑定winform 窗口 HTuple winfowFater this.pictureBox1.Handle; //打开新的窗口 HOperatorSet.SetWindowAttr(&qu…...

5.0.4 VisualStateManager(视觉状态管理器)使用说明

在 WPF 中,VisualStateManager(视觉状态管理器)是用于管理控件在不同状态下的外观变化的核心组件。它通过定义视觉状态(如按钮的默认、悬停、按下状态)和状态过渡动画,使控件在不同交互场景下动态切换样式,而无需重写整个控件模板。以下是其核心用法和示例: 1. 基本概…...

onenet连接微信小程序(mqtt协议)

一、关于mqtt协议 mqtt协议常用于物联网,是一种轻量级的消息推送协议。 其中有三个角色,Publisher设备(客户端)发布主题到服务器,其他的设备通过订阅主题,获取该主题下的消息,Publisher可以发…...

IT需求规格说明书,IT软件系统需求设计文档(DOC)

1 范围 1.1 系统概述 1.2 文档概述 1.3 术语及缩略语 2 引用文档 3 需求 3.1 要求的状态和方式 3.2 系统能力需求 3.3 系统外部接口需求 3.3.1 管理接口 3.3.2 业务接口 3.4 系统内部接口需求 3.5 系统内部数据需求 3.6 适应性需求 3.7 安全性需求 3.8 保密性需…...

探索 DevExpress:构建卓越应用的得力助手

探索 DevExpress:构建卓越应用的得力助手 在当今竞争激烈的软件开发领域,打造高效、美观且功能强大的应用程序是每个开发者的追求。而 DevExpress 作为一款备受瞩目的开发工具,为开发者们提供了实现这一目标的有力支持。在本专栏博客中&…...

康养休闲旅游住宿服务实训室:构建产教融合新标杆

随着健康中国战略的深入实施与银发经济市场的持续扩张,康养休闲旅游作为融合健康管理、文化体验与休闲度假的复合型产业,正迎来前所未有的发展机遇。北京凯禾瑞华科技有限公司依托其在智慧康养领域的技术积淀与产业洞察,创新推出“康养休闲旅…...

Python 程序设计教程:构建您的第一个计算器类

Python 程序设计教程:构建您的第一个计算器类 1. 引言:为什么要学习类? 面向对象编程 (Object-Oriented Programming, OOP) 是一种强大的编程范式,它通过将数据和操作数据的函数(方法)捆绑在一起来组织和结构化代码 1。类 (Class) 是 OOP 的核心概念,不仅在 Python 中…...

深入浅出理解常见的分布式ID解决方案

分布式ID在构建大规模分布式系统时扮演着至关重要的角色,主要用于确保在分布式环境中数据的唯一性和一致性。以下是分布式ID的几个主要作用: 确保唯一性:在分布式系统中,可能有成千上万个实例同时请求ID。分布式ID生成系统能保证即…...

mac 使用 Docker 安装向量数据库Milvus独立版的保姆级别教程

Milvus 特点:开源的云原生向量数据库,支持多种索引类型和GPU加速,能够在亿级向量规模下实现低延迟高吞吐。具有灵活的部署选项和强大的社区支持。 适用场景:适合处理超大规模数据和高性能需求的应用,如图像搜索、推荐…...

Ubuntu日志文件清空的三种方式

清空Ubuntu日志文件可以通过三种方式: 使用命令行清空日志文件:可以使用以下命令清空特定日志文件,例如清空syslog文件: sudo truncate -s 0 /var/log/syslog使用编辑器清空日志文件:可以使用文本编辑器如Nano或Vi来…...

文章记单词 | 第68篇(六级)

一,单词释义 differentiate:英 [ˌdɪfəˈrenʃieɪt] 美 [ˌdɪfəˈrenʃieɪt] ,动词,意为 “区分;辨别;使有差别;使不同;表明… 间的差别;构成… 间差别的原因”。…...

Postman最佳平替, API测试工具Bruno实用教程(一):基础篇

序言 在前文【github星标超3万!Postman最强平替Bruno你用了吗?】中,我们介绍了目前目前Github上广受关注的新锐接口测试工具Bruno,给厌倦了Postman必须在线使用限制的同学提供了一个很好的替代选择。 Bruno的核心优势,官网重点给出了如下几点: 承诺开源和可扩展,并且专…...

LabVIEW 与 NI 硬件(PXI, CompactRIO, DAQ, RF, Vision)的深度研究与未来发展趋势-分析报告

LabVIEW 与 NI 硬件(PXI, CompactRIO, DAQ, RF, Vision)的深度研究与未来发展趋势 引言 本报告旨在对 National Instruments (NI) 的 LabVIEW 软件平台及其核心硬件产品线,包括 PXI、CompactRIO、DAQ、RF 和 Vision 系列,进行深…...

上海雏鸟科技再赴越南,助力10518架无人机刷新吉尼斯记录

近日,上海雏鸟科技携手深圳大漠大、河南豆丁智能在越南胡志明市,使用10518架无人机刷新了“最多无人机同时起飞”的世界吉尼斯记录。本次无人机灯光秀表演以越南南部解放50周年为背景突出了越南历史与民族文化的主题,是一场融合了技术与艺术的…...

在云环境中部署Redis服务与自建Redis服务有啥不同?

云服务 Redis概述 常见的云服务Redis提供商有(阿里云 Redis、华为云 Redis、AWS ElastiCache for Redis等)。这些云提供商负责底层基础设施的部署、配置、维护、操作系统的管理、补丁升级、硬件故障处理等大部分繁琐的运维工作。我们只需要通过控制台或…...

C++类对象的隐式类型转换和编译器返回值优化

文章目录 前言1. 隐式类型转换1.1 单参数的隐式类型转换1.2 多参数的隐式类型转换1.3 explicit关键字 2. 编译器的优化2.1 普通构造优化2.2 函数传参优化2.3 函数返回优化 前言 在类与对象的学习过程中,一定会对隐式类型转换这个词不陌生。对于内置类型而言&#x…...

西门子 PLC 串口转网口模块

在工业自动化领域,高效稳定的通信是保障生产顺畅运行的关键。三格电子西门子 PLC 串口转网口模块,型号涵盖 SG-S7-200-ETH、SG-S7-200-ETH (2P)、SG-S7-300-ETH、SG-S7-300-ETH (2P) 网口扩展与协议支持:该系列模块专为西门子 S7-200/300 PL…...

MATLAB制作直方图

一、什么是直方图? 直方图(Histogram)是一种用于显示数据分布的图形工具。它通过将数据分成若干个区间,统计每个区间内数据的数量或频率,从而形成类似柱状图的形式。它能帮助我们直观了解数据的集中程度、分布形状、离…...

Linux NVIDIA 显卡驱动安装指南(适用于 RHEL/CentOS)

📌 一、禁用 Nouveau 开源驱动 NVIDIA 闭源驱动与开源的 nouveau 驱动冲突,需先禁用: if [ ! -f /etc/modprobe.d/blacklist-nouveau.conf ]; thenecho -e "blacklist nouveau\noptions nouveau modeset0" | sudo tee /etc/modpr…...

微机控制电液伺服拉扭疲劳试验系统

微机控制电液伺服拉扭疲劳试验系统,主要用于测定金属材料及其构件在正弦波、三角波、方波、梯形波、斜波、程序块波谱状态下进行: 拉压扭复合疲劳; 单纯的扭转疲劳试验; 拉压扭复合疲劳作用下材料的断裂韧性试验; 拉压…...

ElementUI 表格el-table自适应高度设置

el-table表格占满页面剩余的全部高度空间 首先,el-table父节点要使用flex布局和超出隐藏(overflow: hidden),设置样式如下: .list{flex: 1;display: flex;flex-direction: column;overflow: hidden; }其次&#xff0…...

深入探索Linux命名管道(FIFO):原理、实践与高级技巧

引言:跨越进程的“文件桥梁” 在Linux的进程间通信(IPC)机制中,命名管道(Named Pipe,FIFO) 是一个看似简单却功能强大的工具。它不仅保留了匿名管道的流式数据传输特性,还通过文件系…...

光伏政策“430”“531”安科瑞光储充为新能源提供解决方案有哪些?

简婷 安科瑞电气股份有限公司 上海嘉定 201801 一、政策节点“430”与“531”的含义 2025年分布式光伏行业的两大核心节点——“4月30日”(430)和“5月31日”(531),分别对应《分布式光伏发电开发建设管理办法》实施…...

VScode一直处于循环“正在重新激活终端“问题的解决方法

方法一: 键盘使用 “ctrlshiftp” 调出快捷命令,也可以按F1,并输入“>Python: Clear Cache and Reload Window ”,回车。清除 VSCode 先前的缓存内容,如下图所示。 方法二: 键盘使用 ” ctrl ,"…...

CAN报文逆向工程

在没有DBC文件的情况下解析CAN报文获取物理信息需要逆向工程和系统分析。以下是详细步骤: 1. 数据采集与基础分析 采集原始数据: 使用CAN分析工具(如PCAN-Explorer、SavvyCAN或USB-CAN适配器配套软件)记录车辆在不同状态下的CAN数…...

文件包含漏洞学习

理论 什么是文件包含漏洞 就是允许攻击者包含并执行非预期的文件。也就是通过PHP函数引入文件时,传入的文件名(或者文件内容)没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入…...

Linux基本操作——网络操作文件下载

6.网络操作文件下载 (1)在VMware Workstation中配置固定IP 配置固定IP需要的两个大步骤 VMware Workstation中的配置 步骤概述:配置IP地址、网关和网段(IP地址范围) Linux系统中的配置 步骤概述:手动修改…...

【ARM AMBA AHB 入门 3.1 -- AHB控制信号】

文章目录 AHB控制信号传送状态HTRANS[1:0]批量传送HBURST[2:0]传送方向HWRITE传送大小HSIZE[2:0]保护控制HPROT[3:0]响应信号 HRESP[1:0] AHB控制信号 传送状态HTRANS[1:0] 在AHB总线上, Master (M) 的传送状态可由HTRANS[1:0]来表示,这两位所代表的意…...

Amazing晶焱科技:系统级 EOS 测试方法 - System Level EOS Testing Method

系统上常见的EOS测试端口以AC电源、电话线(RJ11)、同轴电缆(coaxial cable)以及以太网络(RJ45)最常见,这些端口因有机会布线至户外的关系,受到EOS/Surge冲击的几率也大大提升。因此电…...

基于DR模式的LVS集群案例

一.环境描述 如上图所示,后端是一个NFS服务器实现共享文件,调度器是一个高可用的环境, 这是基于LVS的DR模式实现的一个负载均衡集群。 keepalived在于LVS结合使用的时候,会自动实现很多功能。 比如,第一点我们可以修…...

Spark jdbc写入崖山等国产数据库失败问题

随着互联网、信息产业的大发展、以及地缘政治的变化,网络安全风险日益增长,网络安全关乎国家安全。因此很多的企业,开始了国产替代的脚步,从服务器芯片,操作系统,到数据库,中间件,逐步实现信息技术自主可控,规避外部技术制裁和风险。 就数据库而言,目前很多的国产数据…...

Chain-of-Draft (CoD) 是提示工程的新王者

图像由 DALLE 3 生成 推理型大模型,是当前 AI 研究的热门话题。 我们从最早的 GPT-1 一路走到现在像 Grok-3 这样的高级推理模型。 这段旅程可以说非常精彩,过程中也发现了很多重要的推理方法。 其中之一就是 Chain-of-Thought(CoT&#xff0…...

隐私计算技术及其在数据安全中的应用:守护数据隐私的新范式

前言 在数字化时代,数据已成为企业和组织的核心资产。然而,数据的收集、存储和使用过程中面临着诸多隐私和安全问题。随着法律法规对数据隐私的监管日益严格,企业和组织需要在数据利用与隐私保护之间找到平衡。隐私计算技术作为一种新兴的数据…...

使用Milvus向量数据库构建具有长期记忆的对话机器人

一、申请Milvus试用版 快速创建Milvus实例_向量检索服务 Milvus 版(Milvus)-阿里云帮助中心 二、配置 pip3 install pymilvus tqdm dashscope 由于在下文使用的时候需要用到Milvus的公网地址,而公网地址需要我们手动开启,参考下面这篇文章开启公网地…...

[Es_1] 介绍 | 特点 | 图算法 | Trie | FST

编程就是一门不断试错的艺术。不要害怕犯错,实践才会出真知。 什么是ElasticSearch? Elasticsearch是一个分布式的免费开源搜索和分析引擎 适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。 Elasticsearch在Apache Luc…...

企业安装加密软件有什么好处

企业安装加密软件可以有效保护敏感数据安全,防止信息泄露,并满足合规要求。以下是其主要好处及具体应用场景: 1. 防止数据泄露,保护核心资产 文件加密:对敏感文件(如财务数据、客户信息、设计图纸&#xff…...

【MVCP】基于解纠缠表示学习和跨模态-上下文关联挖掘的多模态情感分析

多处可看出与同专栏下的DCCMCI很像 abstract 多模态情感分析旨在从多模态数据中提取用户表达的情感信息,包括语言、声学和视觉线索。 然而,多模态数据的异质性导致了模态分布的差异,从而影响了模型有效整合多模态互补性和冗余性的能力。此外,现有的方法通常在获得表征后直…...

2025软考【系统架构设计师】:两周极限冲刺攻略(附知识点解析+答题技巧)

距离2025上半年“系统架构设计师”考试已经只剩最后两周了,还没有准备好的小伙伴赶紧行动起来。为了帮助大家更好的冲刺学习,特此提供一份考前冲刺攻略。本指南包括考情分析、答题技巧、注意事项三个部分,可以参考此指南进行最后的复习要领&a…...

企业该如何选择合适的DDOS防护?

在互联网行业当中,大型的网络游戏和网络视频企业会经常受到DDOS攻击和CC攻击,这些网络攻击会导致服务器崩溃或者是网络中断,给企业造成巨大的经济损失,所以企业通常会配备合适的DDOS防护来进行防御,但是,对…...

CPU-GPU-NPU-TPU 概念

1.CPU 中央处理器(Central Processing Unit,简称CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。CPU自产生以来,在逻辑结构、运行效率以及功能外延上取得了巨大发展。 2.GPU GPU&#xff0…...

DELL R770 服务器,更换OCP模块!

今天接到客户报修电话,说有一台 DELL PowerEdge R770服务器,网卡出现了故障,需要更换OCP模块。顺便做一个教程,分享给有需要的小伙伴们。 这一期的教程,听起来好像很高大上,很多小伙伴可能不知道OCP是什么…...

go.mod没有自动缓存问题

今天在安装Gin框架的时候遇到了一个问题 在Terminal运行下面命令安装时,包已经被下载安装到了GoPath中的bkg/mod go get -u github.com/gin-gonic/gin但是由于使用的是Go Modules,GPT以及大多数人给的说法是 运行完这个依赖包会被自动同步更新到go.mod…...

黑电平校正(Black Level Correction, BLC)算法

黑电平校正(Black Level Correction, BLC)算法 黑电平校正(BLC)是图像传感器(如CMOS/CCD)信号处理中的一个重要步骤,主要用于消除传感器暗电流(Dark Current)导致的基线…...

Ubuntu 安装 Keepalived

Keepalived 是什么 Keepalived 是一个用于实现高可用性(High Availability, HA)的服务,是一款基于 VRRP 协议的高可用软件,常用于主备切换和虚拟IP漂移,在服务故障时自动实现故障转移。 Keepalived 的核心功能 功能说…...