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

ebpf: CO-RE, BTF, and Libbpf(二)

本文内容主要来源于Learning eBPF,可阅读原文了解更全面的内容。
本文涉及源码也来自于书中对应的github:https://github.com/lizrice/learning-ebpf/

概述

上篇文章主要讲了CO-RE最关键的一环:BTF,了解其如何记录内核中的数据结构和函数信息。本文将介绍如何编写一个插入到内核中的 eBPF 程序。
示例代码使用 C 语言,编译器是 clang, 另外还需要 libbpf 库(提供一些 ebpf 程序常用的宏和函数定义)。

CO-RE eBPF 程序

一个完整的 eBPF 程序分为两个部分:用于实现具体函数功能的kernel 层的代码,文件后缀是 .bpf.c;以及用于控制 ebpf 代码的加载,卸载,生命周期等控制逻辑的用户层代码,文件后缀是.c。我们先主要看下 kernel 层代码如何编写。

下图为代码流程总览,可以看到和常规 C 程序大致相同,只是其中一些函数、结构体定义会有差异,下面将详细讲解每一部分。
在这里插入图片描述

头文件

如常规 C 文件一样,ebpf 程序也需要包含头文件,但与常规 C 程序相比要简单很多。因为内核通用的头文件都已经包含在生成的vmlinux.h了,所以对于需要用到的内核函数,我们只需要包含这一个头文件!此外,就是 bpf 需要用到的一些辅助函数的头文件,以及我们自己实现的头文件。
这里需要注意的是,vmlinux.h 并不会包含#define定义的值,所以如果需要的话需要额外包含,本文不会涉及到此类情况。

#include "vmlinux.h"
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
#include <bpf/bpf_core_read.h>
#include "hello-buffer-config.h"

定义Maps

这一部分主要是定义我们需要用到的结构体,其中有两个map,第一个是 arrary 类型的 output, 另外一个是 hash 类型的 my_config. 其中会说明map中 key, value 的类型, 大小, map 最多容纳的数量等属性.

struct {__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);__uint(key_size, sizeof(u32));__uint(value_size, sizeof(u32));
} output SEC(".maps");struct user_msg_t {char message[12];
};struct {__uint(type, BPF_MAP_TYPE_HASH);__uint(max_entries, 10240);__type(key, u32);__type(value, struct user_msg_t);
} my_config SEC(".maps");

和我们之前见到的 C 程序不同的是, 每个结构体中都用宏定义来描述其类型, 属性. 如 __uint, __type 等. 这些宏定义在 bpf_helpers.h 中, 如下所示:

#define __uint(name, val) int (*name)[val]
#define __type(name, val) typeof(val) *name
#define __array(name, val) typeof(val) *name[]

使用这些宏定义会有更好的可读性.

eBPF 程序段 (Sections)

libbpf 要求 eBPF 程序需要用 SEC() 宏来定义其程序类型, 如:

SEC("kprobe")

这将会在程序最终编译生成的 elf 对象中保留一个名为 kprobe 的 section, 以便 libbpf 知道应该将这个程序加载为 BPF_PROG_TYPE_KPROBE 类型. eBPF 程序的类型定义在 include/uapi/linux/bpf.h 中, 如下图所示.
我们可以看到一些 kernel 中常见的一些机制, 如kprobe, tracepoint, perf event, cgroup 等.
eBPF 程序都可以附加在这些功能上, 用来捕获内核中程序的运行状况.
在这里插入图片描述
还可以用 SEC() 来指名我们需要将 eBPF 程序附加在什么事件上, 然后 libbpf 会自动帮我们处理, 而不用我们在函数中设定. 例如: 如果我们需要在 arm64 架构中, 将 eBPF 程序附加在 execve 系统调用的 kprobe 上, 只需要这样:

SEC("kprobe/__arm64_sys_execve")

当然, 这需要我们熟悉当前架构的系统调用函数名, libbpf 对此做了优化, 我们只需要用 ksyscall section, libbpf 就会自动找到当前架构对应的系统调用, 如:

SEC("ksyscall/execve")

eBPF 函数代码

接下来我们看实际函数功能代码

SEC("ksyscall/execve")
int BPF_KPROBE_SYSCALL(hello, const char *pathname)
{struct data_t data = {};  //用来保存最终要输出的信息struct user_msg_t *p;  //保存commanddata.pid = bpf_get_current_pid_tgid() >> 32;   //获取触发ebpf程序的piddata.uid = bpf_get_current_uid_gid() & 0xFFFFFFFF;   //获取触发ebpf程序的uidbpf_get_current_comm(&data.command, sizeof(data.command));   //获取当前commandbpf_probe_read_user_str(&data.path, sizeof(data.path), pathname);   //获取当前执行程序的路径p = bpf_map_lookup_elem(&my_config, &data.uid);  //从my_config map中寻找uid对应的messageif (p != 0) {/*如果map中有对应的值,则输出map中的message*/bpf_probe_read_kernel_str(&data.message, sizeof(data.message), p->message);} else {/*否则输出默认值: hello world*/bpf_probe_read_kernel_str(&data.message, sizeof(data.message), message); }/*将结果输出到perf buffer缓冲区中*/bpf_perf_event_output(ctx, &output, BPF_F_CURRENT_CPU, &data, sizeof(data));   return 0;
}

data_t 定义在 hello-buffer-config.h 中, 如图:
在这里插入图片描述
注意: eBPF 对于代码有严格的检查, 以防止其损坏内核的稳定性. 因此 eBPF 程序中是不能直接用常规方式访问内存的, (x = p->y这种当然是不允许的) , 需要通过BPF 辅助函数, 如 bpf_probe_read_*() 函数家族.
(当然, 还有一个非常重要的原因是, 为了支持 CO-RE, 内存访问相关的代码很可能由于内核版本的不同而需要重定位, 因为有些结构体成员有变动)

另外, 对于连续的指针访问, 如 d = a->b->c->d , 我们可以用如下方式:

bpf_core_read(&b, 8, &a->b)
bpf_core_read(&c, 8, &b->c)
bpf_core_read(&d, 8, &c->d)

但是, libbpf 对此封装了更好用的宏:

d = BPF_CORE_READ(a, b, c, d);

编译 eBPF 程序

接下来我们介绍如何编写 Makefile, 以及需要添加那些选项, 以便我们可以编译出适合 CO-RE/libbpf 的 ebpf 程序.

调试信息

我们需要给编译器传入 -g 标签, 以便最终生成的二进制文件中包含调试信息, (当然, 最重要的是包含了 BTF 信息). 然而, -g 选项会同时包含 DWARF 调试信息, 这部分对于 eBPF 程序来说是不需要的, 可以去除这部分信息来减小最终生成对象的大小

llvm-strip -g <object file>

优化选项

需要将编译器优化选项设置为 -O2 (或更高的优化等级), 这样最终生成的 BPF 字节码才能通过 eBPF 验证程序. 例如: 如果没有 -O2 选项的话, Clang 编译器处理辅助函数的调用代码时, 会默认生成 output callx <register>, 但是 eBPF 程序时不支持直接从寄存器调用函数地址的.

目标架构

如果要使用 libbpf 中定义的一些宏, 我们需要在编译时指定目标机器的架构. 因为一些函数或结构体是和体系架构强相关的. 例如我们程序中用到的 BPF_KPROBE_SYSCALL 中, 需要传入一个 pt_regs 类型的参数, 就需要读取包含 CPU 寄存器的内容, 必须要知道程序运行在哪个体系架构中. 部分代码截图如图所示:
在这里插入图片描述
此外, 及时没有使用任何宏, 也仍然需要用架构特定代码来访问寄存器信息, 所以 CO-RE 实际上应该是 (compile once per architecture, run everywhere)

Makefile

Makefile 中编译 ebpf 内核部分的程序如下所示:

%.bpf.o: %.bpf.c vmlinux.h# 使用clang编译BPF程序clang \-target bpf \               # 指定目标为BPF-D __TARGET_ARCH_$(ARCH) \  # 定义目标架构-Wall \                    # 启用所有警告-O2 -g \                   # O2优化等级,添加调试信息-o $@ -c $<                # 输出目标文件和编译# 去除DWARF调试信息(减小文件大小)llvm-strip -g $@

object 文件中的 BTF 信息

可以通过 readelf 工具来查看 object 文件中的信息.
如下图所示, readelf -S 可以查看 object 文件中的 section, 红框部分可以看到, 已经包含了我们所需要的 BTF 信息.
在这里插入图片描述
然后, 可以用 bpftool 来查看文件中包含的所有 BTF 信息, 和之前看到的一样
btf dump

BPF 重定位

libbpf 需要在 eBPF 程序运行时能根据不同的内核数据结构来做适配, 因此需要在编译过程中生成 BPF CO-RE 重定位信息.

通过指令 bpftool -d prog load hello-buffer-config.bpf.o /sys/fs/bpf/hello 可以查看加载 BPF 程序时的重定位过程, 其中与重定位有关的部分如下:
BPF relocations
可以看到, 在程序的 BTF 信息中, pt_regs BTF id 为 22, 在 vmlinux 中找到了对应的结构体, id 为7. 不过, 由于我这里编译和运行是在同一个机器上, 所以不管是数据还是指令, 其修正的 offset 都是 0 .

在上述示例中, 我们是手动将 eBPF 程序加载进内核中的, 这当然不是一个好方法, 后续我们将写用户空间的程序, 来让其完成 eBPF 程序的加载工作. 另外还有一些其他的工作要做, 例如错误处理, 控制程序生命周期等.

相关文章:

ebpf: CO-RE, BTF, and Libbpf(二)

本文内容主要来源于Learning eBPF&#xff0c;可阅读原文了解更全面的内容。 本文涉及源码也来自于书中对应的github&#xff1a;https://github.com/lizrice/learning-ebpf/ 概述 上篇文章主要讲了CO-RE最关键的一环&#xff1a;BTF&#xff0c;了解其如何记录内核中的数据结…...

RHCE第五章:NFS服务器

一、NFS&#xff08;network file system&#xff09; 网络文件系统&#xff1a;在互联网中共享服务器中的文件资源&#xff08;用于Linux主机共享文件的协议&#xff09;。 使用nfs服务需要安装:nfs-utils 以及 rpcbind nfs-utils : 提供nfs服务的程序 rpcbind &#xff1a;…...

qt(vs2010) 手动配置moc生成规则

在 Visual Studio 2010 中写QT项目时&#xff0c;有时需要 手动配置 MOC 生成规则 操作步骤&#xff1a; 右键 .h 文件 → Properties。在 Configuration Properties > Custom Build Tool 中&#xff1a; Command Line:"$(QTDIR)\bin\moc.exe" "%(FullPath)…...

mongodb 安装配置

1.下载 官网下载地址&#xff1a;MongoDB Community Download | MongoDB 2.使用解压包 解压包安装&#xff1a;https://pan.baidu.com/s/1Er56twK9UfxoExuCPlJjhg 提取码: 26aj 3.配置环境&#xff1a; &#xff08;1&#xff09;mongodb安装包位置&#xff1a; &#xf…...

Java多态课堂练习题

Java多态课堂练习题 题目&#xff1a;动物乐园的多态展示 背景设定&#xff1a; 设计一个动物乐园程序&#xff0c;展示不同类型动物的行为特点&#xff0c;要求使用多态特性实现。 1. 基础类设计&#xff08;已给出部分代码&#xff09; // 基类&#xff1a;动物 abstract…...

Android Studio 实现自定义全局悬浮按钮

文章目录 一、基础实现方案1. 使用 WindowManager 实现全局悬浮窗2. 布局文件 (res/layout/floating_button.xml)3. 圆形背景 (res/drawable/circle_background.xml)4. 启动服务 二、权限处理1. AndroidManifest.xml 中添加权限2. 检查并请求权限 三、高级功能扩展1. 添加动画效…...

Android Studio 中文字大小的单位详解

文章目录 一、Android 中的尺寸单位1. dp (Density-independent Pixels - 密度无关像素)2. sp (Scale-independent Pixels - 可缩放像素)3. px (Pixels - 像素)4. pt (Points - 磅)5. mm (Millimeters - 毫米) 和 in (Inches - 英寸) 二、文字大小单位的最佳实践1. 始终使用 sp…...

Project ERROR: liblightdm-qt5-3 development package not found问题的解决方法

问题描述&#xff1a;使用make命令进行ukui-greeter-Debian构建时出现Project ERROR: liblightdm-qt5-3 development package not found错误&#xff0c;具体如图&#xff1a; 问题原因&#xff1a;缺乏liblightdm-qt5-3 development软件包 解决方法&#xff1a;安装liblightd…...

基于QT(C++)+SQLServer实现(WinForm)超市管理系统

超市库存管理系 使用 QT 开发&#xff0c;SQLserver 数据库配置 ODBC 数据源&#xff1a;QSQLServer 超市库存管理系统需求规格说明书 1 引言 校园超市的库存物资管理往往是很复杂、很繁琐的。由于所掌握的物资种类众多,订货、管理的渠道各有差异,各个校园超市之间的管理体制…...

06 - 多线程-JUC并发编程-原子类(二)

上一章&#xff0c;讲解java &#xff08;java.util.concurrent.atomic&#xff09; 包中的 支持基本数据类型的原子类&#xff0c;以及支持数组类型的原子类&#xff0c;这一章继续讲解支持对实体类的原子类&#xff0c;以及原子类型的修改器。 还有最后java &#xff08;java…...

HTML:网页的骨架 — 入门详解教程

HTML&#xff1a;网页的骨架 — 入门详解教程 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是构建网页的基础语言&#xff0c;负责定义网页的结构和内容。无论是简单的个人博客&#xff0c;还是复杂的企业网站&#xff0c;HTML都是不可或…...

Oracle 分析函数(Analytic Functions)

Oracle 的分析函数&#xff08;Analytic Functions&#xff09;是一类特殊的函数&#xff0c;用于在查询结果的窗口&#xff08;window&#xff09;内执行计算&#xff08;如排名、累计求和、移动平均等&#xff09;&#xff0c;不会聚合结果行&#xff0c;而是为每一行返回一个…...

全新电脑如何快速安装nvm,npm,pnpm

以下是全新电脑快速安装 nvm、npm 和 pnpm 的详细步骤&#xff0c;覆盖 Windows/macOS/Linux 系统&#xff1a; 一、安装 nvm&#xff08;Node Version Manager&#xff09; 1. Windows 系统 下载安装包&#xff1a; 访问 nvm-windows 官方仓库&#xff0c;下载 nvm-setup.ex…...

风丘年度活动:2025年横滨汽车工程展览会

| 展会简介&#xff1a; 2025年横滨汽车工程展览会&#xff0c;是由日本汽车工程师学会&#xff08;JSAE&#xff09;精心主办的一场行业盛会。预计届时将汇聚超550家参展商&#xff0c;设置1300个展位&#xff0c;展览面积超过20000平方米。展会受众广泛&#xff0c;面向汽车…...

springBoot接入文心一言

文章目录 效果接入步骤项目接入配置类&#xff1a;WenXinYiYan前端vue代码js代码 后端mapper层service层controller层 测试代码 效果 先来看一下最后实现的效果 &#xff08;1&#xff09;未点击前的功能页面 &#xff08;2&#xff09;点击后的页面 &#xff08;3&#xff…...

力扣HOT100——无重复字符的最长子字符串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 思路&#xff1a; 滑动窗口。遍历整个字符串&#xff0c…...

Python高级爬虫之JS逆向+安卓逆向1.4节:数据运算

目录 引言&#xff1a; 1.4.1 赋值运算 1.4.2 算术运算 1.4.3 关系运算 1.4.4 逻辑运算 1.4.5 标识运算 1.4.6 爬虫接单赚了10块钱 引言&#xff1a; 大神薯条老师的高级爬虫安卓逆向教程&#xff1a; 这套爬虫教程会系统讲解爬虫的初级&#xff0c;中级&#xff0c;高…...

微信小程序无缝衔接弹幕效果纯CSS

效果图 主要运用蒙层、动画延迟 .wxml <view wx:for"{{detail}}" wx:key"{{index}}" class"container" style"--s:{{item.s}}s" ><view wx:for"{{2}}" wx:key"{{index}}" class"container-item&q…...

vue3:十一、主页面布局(增加左上角系统名称)

一、实现效果 侧边栏可平滑折叠/展开&#xff0c;带有过渡动画 折叠时隐藏Logo文字&#xff0c;只显示图标 优化滚动区域&#xff0c;避免标题栏随菜单滚动 解决折叠/展开时出现的滚动条闪烁问题 二、 实现 1、可以使用 SCSS&#xff08;Sass 的一种语法&#xff09; 首先…...

孟加拉slot游戏出海代投FB脸书广告策略

对于在孟加拉进行游戏出海代投的广告策略&#xff0c;可以考虑以下方面&#xff1a; 定位目标受众&#xff1a;确定目标受众群体&#xff0c;包括他们的年龄、兴趣爱好、消费习惯等信息&#xff0c;以便精准定位广告投放对象。 优质创意设计&#xff1a;设计吸引人眼球的广告素…...

算法题(125):子集

审题&#xff1a; 本题需要我们将题目给定数组的所有子集枚举起来 思路&#xff1a; 方法一&#xff1a;二进制枚举 枚举对象&#xff1a;0到1<<n -1的整形数据 枚举顺序&#xff1a;顺序 枚举方式&#xff1a;二进制枚举 在解释二进制枚举的方法之前&#xff0c;我们先看…...

深度学习中的数值稳定性处理详解:以SimCLR损失为例

文章目录 1. 问题背景SimCLR的原始公式 2. 数值溢出问题为什么会出现数值溢出&#xff1f;浮点数的表示范围 3. 数值稳定性处理方法核心思想数学推导 4. 代码实现分解代码与公式的对应关系 5. 具体数值示例示例&#xff1a;相似度矩阵方法1&#xff1a;直接计算exp(x)方法2&…...

查看linux中是否安装了tiktoken

在 Linux 中检查 tiktoken 是否安装的完整方法‌ 通过 pip 命令检查‌ 查看已安装的 Python 包列表‌&#xff1a; pip list | grep tiktoken 若输出包含 tiktoken&#xff0c;则表示已安装‌。 获取包详细信息‌&#xff1a; pip show tiktoken 若显示包版本、安装路径…...

从源码看无界 1.0.28:为何说它是 qiankun 的 “轻量化替代方案”(二)

我们接着上一节的《从源码看无界 1.0.28:为何说它是 qiankun 的 “轻量化替代方案”》内容继续往下。 生命周期图 sandbox.active 方法 我们找到 packages/wujie-core/src/sandbox.ts 文件的第 275 行: //.../** 激活子应用* 1、同步路由* 2、动态修改iframe的fetch* 3、准…...

SQL注入之时间盲注攻击流程详解

目录 一、时间盲注原理 二、完整攻击流程 1. 注入点确认 2. 基础条件判断 3. 系统信息收集 &#xff08;1&#xff09;获取数据库版本 &#xff08;2&#xff09;获取当前数据库名 4. 数据提取技术 &#xff08;1&#xff09;表名枚举 &#xff08;2&#xff09;列名猜…...

【NIO番外篇】之组件 Selector

目录 一、Selector&#xff1a;网络世界的“机场管制塔” / “总机接线员” &#x1f4e1;什么是 Selector&#xff1f;它的作用是什么&#xff1f; 二、Selector 的工作流程&#xff1a;塔台是怎么指挥飞机的&#xff1f;1. 飞机就位 (准备 Channel)&#xff1a;2. 向塔台报到…...

对接印度尼西亚股票数据源API

随着对东南亚市场的关注增加&#xff0c;获取印度尼西亚&#xff08;IDX&#xff09;股票市场的实时和历史数据变得尤为重要。本文将指导您如何使用Spring Boot框架对接一个假定的印尼股票数据源API&#xff08;例如&#xff0c;StockTV&#xff09;&#xff0c;以便开发者能够…...

SQL(9):创建数据库,表,简单

1、创建数据库&#xff0c;一句SQL语句搞定 CREATE DATDBASE 数据库名 CREATE DATABASE my_db;2、创建表 CREATE TABLE 表名(字段名 类型) CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255)…...

医学成像中的对比语言-图像预训练模型(CLIP):一项综述|文献速递-深度学习医疗AI最新文献

Title 题目 CLIP in medical imaging: A survey 医学成像中的对比语言-图像预训练模型&#xff08;CLIP&#xff09;&#xff1a;一项综述 01 文献速递介绍 尽管在过去十年中视觉智能领域取得了重大进展&#xff08;何恺明等人&#xff0c;2016&#xff1b;塔尔瓦宁和瓦尔…...

KEGG注释脚本kofam2kegg.py--脚本010

采用kofam结合kegg官网htxt进行注释 用法&#xff1a; python kofam2kegg.py kofam.out ath00001.keg my_kegg_output code: import sys from collections import defaultdictdef parse_kofam_file(kofam_file):ko_to_genes defaultdict(list)with open(kofam_file) as f:…...

hevc编码芯片学习-VLSI实现

在Fan等工作中&#xff0c;根据特定算法设计了整像素运动估计引擎&#xff0c;最终的BD-Rate损失非常小&#xff0c;但是硬件开销比较大&#xff0c;搜索算法缺少灵活性&#xff0c;本次设计优化了硬件设计架构&#xff0c; 微代码 取像素 压缩 水平参考像素存储器 寻址控制 转…...

选导师原理

总述 一句话总结&#xff1a;是雷一定要避&#xff0c;好的一定要抢。方向契合最好&#xff0c;不契合适当取舍。 首先明确自身需求&#xff1a; 我要学东西&#xff01;青年导师&#xff0c;好沟通&#xff0c;有冲劲&#xff0c;高压力。 我要摆烂&#xff01;中老年男性教…...

2.5亿像素卷帘快门CMOS大幅面扫描相机

规格说明书 主要特征 ◎ 卷帘快门CMOS 传感器 ◎ 2.46 亿像素分辨率 ◎ 全分辨率最高帧率达5fps ◎ 高灵敏度及低噪声 ◎ ROI 区域设置 ◎ 曝光时间灵活控制&#xff08;外触发&#xff0c;自由运行&#xff09; ◎ 输出像素格式8/10/12bit 可选 ◎ 自动坏像素校正、平场校正…...

CD27.【C++ Dev】类和对象(18)友元和内部类

目录 1.友元 友元函数 几个特点 友元类 格式 代码示例 2.内部类(了解即可) 计算有内部类的类的大小 分析 注意:内部类不能直接定义 内部类是外部类的友元类 3.练习 承接CD21.【C Dev】类和对象(12) 流插入运算符的重载文章 1.友元 友元函数 在CD21.【C Dev】类和…...

企业级硬盘的测试流程

测试硬盘流程 找一个有Linux操作系统的服务器&#xff0c;配置好管理ip的接口&#xff0c;连接上linux服务器&#xff0c;执行lsblk命令来查看设备的情况 使用mkfs命令格式化要测试的硬盘&#xff0c;格式化之前务必把数据进行备份&#xff0c;可以使用blkid命令查看硬盘的文件…...

std::enable_shared_from_this 模板类的作用是什么?

我们以Connection类的shared智能指针为例说明&#xff0c;std::enable_shared_from_this<Connection> 是一个标准库模板类&#xff0c;它的作用是让一个类的对象能够安全地生成指向自身的 std::shared_ptr&#xff0c;即使该对象最初是通过普通指针或其他方式创建的。 作…...

鸿蒙开发-ArkUi控件使用

2.0控件-按钮 2.1.控件-文本框 Text(this.message).fontSize(40) // 设置文本的文字大小.fontWeight(FontWeight.Bolder) // 设置文本的粗细.fontColor(Color.Red) // 设置文本的颜色------------------------------------------------------------------------- //设置边框Tex…...

大数据学习栈记——MongoDB编程

本文介绍NoSQL技术&#xff1a;MongoDB用Java来连接数据库&#xff0c;执行常见的数据库操作&#xff0c;使用环境&#xff1a;IntelliJ IDEA、Ubuntu24.04。 配置Maven 我们需要使用“MongoDB Driver”&#xff0c;所以先打开“MongoDB Java Driver”项目&#xff0c;但是提…...

体系结构论文(六十七):A Machine-Learning-Guided Framework for Fault-Tolerant DNNs

A Machine-Learning-Guided Framework for Fault-Tolerant DNNs DATE 2024 研究动机 深度神经网络&#xff08;DNN&#xff09;虽然对某些扰动具有天然的容错性&#xff0c;但在面对硬件故障&#xff08;如软错误、老化、环境干扰等&#xff09;时&#xff0c;仍会出现输出错…...

qt designer 创建窗体选择哪种屏幕大小

1. 新建窗体时选择QVGA还是VGA 下面这个图展示了区别 这里我还是选择默认&#xff0c;因为没有特殊需求&#xff0c;只是在PC端使用...

游戏引擎学习第225天

只能说太难了 回顾当前的进度 我们正在进行一个完整游戏的开发&#xff0c;并在直播中同步推进。上周我们刚刚完成了过场动画系统的初步实现&#xff0c;把开场动画基本拼接完成&#xff0c;整体效果非常流畅。看到动画顺利呈现&#xff0c;令人十分满意&#xff0c;整个系统…...

sql工具怎么选最适合自己的?

sql工具怎么选&#xff1f; 为什么大多数主流工具又贵又难用&#xff1f;有没有一款免费好用的sql工具&#xff1f;像大多数朋友经常用的sql工具应该都遇到过这种情况&#xff0c;用着用着收到了来自品牌方的律师函&#xff0c;或者处理数据时经常卡死&#xff0c;再或者不支持…...

css实现一键换肤

实现一键换肤的时候&#xff0c;我们除了动态替换引用的css文件&#xff0c;还可以通过使用css变量的方式&#xff0c;达到所需效果。 首先我们来了解css变量&#xff0c;css变量以--开头&#xff0c;引用时va(--变量名)&#xff0c;例 :root{--default-color: #fff; } .box{b…...

波束形成(BF)从算法仿真到工程源码实现-第八节-波束图

一、概述 本节对MVDR、LCMV、LMS等算法的波束图进行仿真。 二、MVDR代码仿真 2.1 mvdr代码 clc; clear; M 18; % 天线数 lambda 10; d lambda / 2; L 100; %快拍数 thetas [10]; % 期望信号入射角度 thetai [-30 30]; % 干扰入射角度 n [0:M-1]; vs exp(-1j * 2…...

静态代码深度扫描详解

静态代码深度扫描是一种通过分析源代码结构、语法、语义及潜在逻辑&#xff0c;在不运行程序的情况下全面检测代码缺陷、安全漏洞和质量问题的技术。它通过结合数据流分析、控制流分析、符号执行等高级技术&#xff0c;实现对代码的深度理解&#xff0c;帮助开发团队在早期发现…...

LC25. K 个一组翻转链表(自己用)

25. K 个一组翻转链表 Java代码&#xff1a; 思路&#xff1a;利用虚拟头节点结合反转链表实现 Code&#xff1a; class Solution {public ListNode reverseKGroup(ListNode head, int k) {ListNode dummy new ListNode(0);if (head null || k 1)return head;ListNode…...

Spring事务同步器在金融系统中的应用:从风控计算到交易投递

一句话总结 通过 TransactionSynchronization 机制,成功将投行交易系统的可靠性提升至金融级要求,并在对公贷款风控中实现高效资源管理。未来,事务管理将不仅仅是“提交”与“回滚”的二元选择,而是向智能化、实时化演进的核心基础设施。 1. 架构设计 1.1 整体架构图 2.…...

sealos跳转到cusor安装出错

第一次打开cursor安装出错怎么办 我出现这个问题的解决方式是重新下载并且切换目录解决...

【CUDA 】第3章 CUDA执行模型——3.5循环展开(1)

CUDA C编程笔记 第三章 CUDA执行模型3.5 循环展开3.5.1 展开的规约 待解决的问题&#xff1a; 第三章 CUDA执行模型 3.5 循环展开 循环展开是一种循环优化的技术&#xff0c;通过减少分支出现频率循环维护指令。 循环主体代码被多次编写&#xff0c;任何封闭的循环可以把迭代…...

AndroidStudio编译报错 Duplicate class kotlin

具体的编译报错信息如下&#xff1a; Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21) D…...