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

ARM 汇编启动代码详解:从中断向量表到中断处理

ARM 汇编启动代码详解:从中断向量表到中断处理

引言

在嵌入式系统开发中,ARM 处理器(如 Cortex-A 系列)的启动代码是系统初始化和运行的基础。启动代码通常包括中断向量表的创建、初始化硬件状态(如关闭缓存和 MMU)、设置栈指针以及处理各种中断(如 IRQ、FIQ 等)。本文将详细解析一段典型的 ARM 汇编启动代码,涵盖 _start 函数、中断向量表、复位处理程序(Reset_Handler)以及 IRQ 中断处理程序(IRQ_Handler)。代码参考了 ARM Cortex-A(armV7)编程手册和 Cortex-A7 技术参考手册,确保内容准确且实用。


1. 代码概述

以下是完整代码的结构:

.global _start  				/* 全局标号 *//** 描述:_start函数,首先是中断向量表的创建* 参考文档:ARM Cortex-A(armV7)编程手册V4.0.pdf P42,3 ARM Processor Modes and Registers(ARM处理器模型和寄存器)* 		 	ARM Cortex-A(armV7)编程手册V4.0.pdf P165 11.1.1 Exception priorities(异常)*/
_start:ldr pc, =Reset_Handler        /* 复位中断 */    ldr pc, =Undefined_Handler    /* 未定义中断 */    ldr pc, =SVC_Handler          /* SVC(Supervisor)中断 */    ldr pc, =PrefAbort_Handler    /* 预取终止中断 */    ldr pc, =DataAbort_Handler    /* 数据终止中断 */    ldr pc, =NotUsed_Handler      /* 未使用中断 */    ldr pc, =IRQ_Handler          /* IRQ中断 */    ldr pc, =FIQ_Handler          /* FIQ(快速中断)未定义中断 *//* 复位中断 */    
Reset_Handler:cpsid i                       /* 关闭全局中断 *//* 关闭 I、D Cache 和 MMU */mrc p15, 0, r0, c1, c0, 0     /* 读取 CP15 的 C1 寄存器到 R0 中 */    bic r0, r0, #(0x1 << 12)      /* 清除 C1 寄存器的 bit12 位 (I 位),关闭 I Cache */    bic r0, r0, #(0x1 << 2)       /* 清除 C1 寄存器的 bit2 (C 位),关闭 D Cache */    bic r0, r0, #0x2              /* 清除 C1 寄存器的 bit1 (A 位),关闭对齐 */    bic r0, r0, #(0x1 << 11)      /* 清除 C1 寄存器的 bit11 (Z 位),关闭分支预测 */    bic r0, r0, #0x1              /* 清除 C1 寄存器的 bit0 (M 位),关闭 MMU */    mcr p15, 0, r0, c1, c0, 0     /* 将 r0 寄存器中的值写入到 CP15 的 C1 寄存器中 */#if 0/* 汇编版本设置中断向量表偏移 */ldr r0, =0X87800000dsbisbmcr p15, 0, r0, c12, c0, 0dsbisb
#endif/* 设置各个模式下的栈指针 *//* 进入 IRQ 模式 */mrs r0, cpsrbic r0, r0, #0x1f             /* 将 r0 寄存器中的低 5 位清零,也就是 cpsr 的 M0~M4 */    orr r0, r0, #0x12             /* r0 或上 0x12, 表示使用 IRQ 模式 */    msr cpsr, r0                  /* 将 r0 的数据写入到 cpsr_c 中 */    ldr sp, =0x80600000           /* 设置 IRQ 模式下的栈首地址为 0X80600000, 大小为 2MB *//* 进入 SYS 模式 */mrs r0, cpsrbic r0, r0, #0x1f             /* 将 r0 寄存器中的低 5 位清零 */    orr r0, r0, #0x1f             /* r0 或上 0x1f, 表示使用 SYS 模式 */    msr cpsr, r0                  /* 将 r0 的数据写入到 cpsr_c 中 */    ldr sp, =0x80400000           /* 设置 SYS 模式下的栈首地址为 0X80400000, 大小为 2MB *//* 进入 SVC 模式 */mrs r0, cpsrbic r0, r0, #0x1f             /* 将 r0 寄存器中的低 5 位清零 */    orr r0, r0, #0x13             /* r0 或上 0x13, 表示使用 SVC 模式 */    msr cpsr, r0                  /* 将 r0 的数据写入到 cpsr_c 中 */    ldr sp, =0X80200000           /* 设置 SVC 模式下的栈首地址为 0X80200000, 大小为 2MB */cpsie i                       /* 打开全局中断 */#if 0/* 使能 IRQ 中断 */mrs r0, cpsr                  /* 读取 cpsr 寄存器值到 r0 中 */    bic r0, r0, #0x80            /* 将 r0 寄存器中 bit7 清零,也就是 CPSR 中的 I 位清零,表示允许 IRQ 中断 */    msr cpsr, r0                 /* 将 r0 重新写入到 cpsr 中 */    
#endifb main                        /* 跳转到 main 函数 *//* 未定义中断 */
Undefined_Handler:ldr r0, =Undefined_Handlerbx r0/* SVC 中断 */
SVC_Handler:ldr r0, =SVC_Handlerbx r0/* 预取终止中断 */
PrefAbort_Handler:ldr r0, =PrefAbort_Handler    bx r0/* 数据终止中断 */
DataAbort_Handler:ldr r0, =DataAbort_Handlerbx r0/* 未使用的中断 */
NotUsed_Handler:ldr r0, =NotUsed_Handlerbx r0/* IRQ 中断!重点!!!!! */
IRQ_Handler:push {lr}                    /* 保存 lr 地址 */    push {r0-r3, r12}           /* 保存 r0-r3,r12 寄存器 */mrs r0, spsr                /* 读取 spsr 寄存器 */    push {r0}                   /* 保存 spsr 寄存器 */mrc p15, 4, r1, c15, c0, 0 /* 从 CP15 的 C0 寄存器内的值到 R1 寄存器中 */                            add r1, r1, #0X2000         /* GIC 基地址加 0X2000,也就是 GIC 的 CPU 接口端基地址 */    ldr r0, [r1, #0XC]          /* GIC 的 CPU 接口端基地址加 0X0C 就是 GICC_IAR 寄存器 */    push {r0, r1}               /* 保存 r0, r1 */cps #0x13                   /* 进入 SVC 模式,允许其他中断再次进去 */push {lr}                   /* 保存 SVC 模式的 lr 寄存器 */    ldr r2, =system_irqhandler  /* 加载 C 语言中断处理函数到 r2 寄存器中 */    blx r2                      /* 运行 C 语言中断处理函数,带有一个参数,保存在 R0 寄存器中 */pop {lr}                    /* 执行完 C 语言中断服务函数,lr 出栈 */    cps #0x12                   /* 进入 IRQ 模式 */    pop {r0, r1}                str r0, [r1, #0X10]         /* 中断执行完成,写 EOIR */pop {r0}                    msr spsr_cxsf, r0           /* 恢复 spsr */pop {r0-r3, r12}            /* r0-r3, r12 出栈 */    pop {lr}                    /* lr 出栈 */    subs pc, lr, #4             /* 将 lr-4 赋给 pc *//* FIQ 中断 */
FIQ_Handler:ldr r0, =FIQ_Handler    bx r0

2. 代码功能详解

2.1 _start:程序入口和中断向量表

_start 是程序的入口点,它首先创建中断向量表。ARM 处理器在启动或发生异常时会根据向量表跳转到对应的处理程序。向量表包含 8 个条目,每个条目对应一种异常或中断:

  • 复位中断(Reset):系统上电或复位后执行。
  • 未定义中断(Undefined):执行了未定义的指令。
  • SVC 中断(Supervisor Call):软件触发系统调用。
  • 预取终止中断(Prefetch Abort):指令预取失败。
  • 数据终止中断(Data Abort):数据访问失败。
  • 未使用中断(Not Used):保留,未定义。
  • IRQ 中断(Interrupt Request):外部设备请求的中断。
  • FIQ 中断(Fast Interrupt Request):快速中断,通常用于高优先级任务。

代码使用 ldr pc, =handler 将每个处理程序的地址加载到程序计数器 pc,实现跳转。例如:

ldr pc, =Reset_Handler    /* 复位中断 */

这表示当发生复位时,处理器会跳转到 Reset_Handler 执行。


2.2 Reset_Handler:复位处理程序

Reset_Handler 是系统启动后的第一个执行函数,负责初始化硬件状态。以下是其主要步骤:

(1) 关闭全局中断
cpsid i    /* 关闭全局中断 */
  • 使用 cpsid i 关闭所有 IRQ 中断,确保初始化过程中不受干扰。
(2) 关闭缓存和 MMU
mrc p15, 0, r0, c1, c0, 0    /* 读取 CP15 的 C1 寄存器到 R0 */
bic r0, r0, #(0x1 << 12)     /* 关闭 I Cache */
bic r0, r0, #(0x1 << 2)      /* 关闭 D Cache */
bic r0, r0, #0x2             /* 关闭对齐 */
bic r0, r0, #(0x1 << 11)     /* 关闭分支预测 */
bic r0, r0, #0x1             /* 关闭 MMU */
mcr p15, 0, r0, c1, c0, 0    /* 将修改写入 CP15 C1 */
  • CP15 协处理器:CP15 负责系统配置,这里读取其控制寄存器 C1。
  • 位操作:使用 bic 清除特定位,分别关闭指令缓存(I Cache)、数据缓存(D Cache)、内存管理单元(MMU)等功能。这是“读-改-写”模式,确保初始状态干净。
(3) 设置中断向量表偏移(可选)
#if 0
ldr r0, =0X87800000
dsb
isb
mcr p15, 0, r0, c12, c0, 0
dsb
isb
#endif
  • 这部分被禁用(#if 0),用于将中断向量表基址设置为 0x87800000,常见于需要调整向量表位置的场景(如从 Flash 移动到 SRAM)。dsbisb 确保操作同步。
(4) 设置不同模式的栈指针

ARM 处理器有多种工作模式(如 IRQ、SVC、SYS),每个模式需要独立的栈。代码为 IRQ、SYS 和 SVC 模式设置栈指针:

/* 进入 IRQ 模式 */
mrs r0, cpsr
bic r0, r0, #0x1f    /* 清零模式位 */
orr r0, r0, #0x12    /* 设置为 IRQ 模式 */
msr cpsr, r0
ldr sp, =0x80600000  /* 设置栈顶为 0x80600000,大小 2MB *//* 进入 SYS 模式 */
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0x1f    /* 设置为 SYS 模式 */
msr cpsr, r0
ldr sp, =0x80400000  /* 设置栈顶为 0x80400000 *//* 进入 SVC 模式 */
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0x13    /* 设置为 SVC 模式 */
msr cpsr, r0
ldr sp, =0x80200000  /* 设置栈顶为 0x80200000 */
  • 模式切换:使用 mrs 读取当前程序状态寄存器(CPSR),bic 清零模式位(低 5 位),orr 设置新模式,msr 写入回 CPSR。
  • 栈设置:栈指针 sp 指向内存区域(这里是 DDR 范围 0x80000000~0x9FFFFFFF),栈向下增长,必须 4 字节对齐。
(5) 打开全局中断并跳转
cpsie i    /* 打开全局中断 */
b main     /* 跳转到 main 函数 */
  • cpsie i 重新启用中断。
  • b main 跳转到 C 语言的 main 函数,标志着初始化完成。

2.3 其他中断处理程序

除了 Reset_Handler,代码还定义了其他中断处理程序,但大多数只是简单地进入死循环:

Undefined_Handler:ldr r0, =Undefined_Handlerbx r0SVC_Handler:ldr r0, =SVC_Handlerbx r0PrefAbort_Handler:ldr r0, =PrefAbort_Handler    bx r0DataAbort_Handler:ldr r0, =DataAbort_Handlerbx r0NotUsed_Handler:ldr r0, =NotUsed_Handlerbx r0FIQ_Handler:ldr r0, =FIQ_Handler    bx r0
  • 这些处理程序使用 ldr 加载自身地址到 r0,然后 bx r0 跳转回去,形成死循环。这是一种简单处理方式,实际应用中可能需要更复杂的逻辑。

2.4 IRQ_Handler:IRQ 中断处理

IRQ_Handler 是代码中的重点,负责处理外部设备的中断。以下是详细解析:

(1) 保存上下文
push {lr}                    /* 保存返回地址 */
push {r0-r3, r12}           /* 保存通用寄存器 */
  • 保存中断前的 lr(返回地址)和 r0-r3, r12(可能被使用的寄存器)。
(2) 保存状态
mrs r0, spsr                /* 读取 spsr */
push {r0}                   /* 保存 spsr */
  • spsr 存储中断前的处理器状态,需保存以便返回。
(3) 获取 GIC 中断号
mrc p15, 4, r1, c15, c0, 0 /* 从 CP15 读取 GIC 基址 */
add r1, r1, #0X2000         /* 计算 GIC CPU 接口地址 */
ldr r0, [r1, #0XC]          /* 从 GICC_IAR 读取中断号 */
push {r0, r1}               /* 保存中断号和基址 */
  • 通过 CP15 获取 GIC 基址,偏移 0x2000 得到 CPU 接口地址,从 GICC_IAR 寄存器读取当前中断号。
(4) 模式切换和调用 C 函数
cps #0x13                   /* 切换到 SVC 模式 */
push {lr}                   /* 保存 SVC 模式下的 lr */
ldr r2, =system_irqhandler  /* 加载 C 函数地址 */
blx r2                      /* 调用 C 中断处理函数 */
  • 切换到 SVC 模式,调用 C 语言的 system_irqhandler 函数,r0 作为参数传递中断号。
(5) 清理和返回
pop {lr}                    /* 恢复 SVC 模式 lr */
cps #0x12                   /* 切换回 IRQ 模式 */
pop {r0, r1}                
str r0, [r1, #0X10]         /* 写 EOIR 标记中断结束 */
pop {r0}                    
msr spsr_cxsf, r0           /* 恢复 spsr */
pop {r0-r3, r12}            /* 恢复寄存器 */
pop {lr}                    /* 恢复 lr */
subs pc, lr, #4             /* 返回 */
  • 恢复所有状态,通知 GIC 中断处理完成(写 GICC_EOIR),返回到中断前的位置。

3. 总结与应用

3.1 关键点回顾

  • 中断向量表:定义了 8 种异常的入口,启动时跳转到 Reset_Handler
  • 复位初始化:关闭中断、缓存和 MMU,设置栈指针,跳转到 main
  • IRQ 处理:通过 GIC 获取中断号,调用 C 函数处理,恢复现场返回。

3.2 应用场景

这段代码适用于嵌入式系统(如基于 Cortex-A7 的开发板),用于启动操作系统或裸机程序。理解这些内容有助于调试硬件初始化问题、优化中断响应以及开发低级驱动。

3.3 扩展阅读

  • 参考文档:ARM Cortex-A(armV7)编程手册、Cortex-A7 技术参考手册。
  • 相关知识:CP15 协处理器、GIC 中断控制器、ARM 模式切换。

4. 附录:常见问题解答

  • 为什么关闭缓存和 MMU? 为了确保启动时硬件状态干净,避免缓存或虚拟内存的残留影响。
  • 栈指针为何向下增长? ARM 栈通常向下增长,方便压栈和出栈操作。
  • GIC 是什么? 通用中断控制器,管理多个设备的中断请求。

相关文章:

ARM 汇编启动代码详解:从中断向量表到中断处理

ARM 汇编启动代码详解&#xff1a;从中断向量表到中断处理 引言 在嵌入式系统开发中&#xff0c;ARM 处理器&#xff08;如 Cortex-A 系列&#xff09;的启动代码是系统初始化和运行的基础。启动代码通常包括中断向量表的创建、初始化硬件状态&#xff08;如关闭缓存和 MMU&a…...

笔试专题(七)

文章目录 乒乓球筐&#xff08;哈希&#xff09;题解代码 组队竞赛题解代码 删除相邻数字的最大分数&#xff08;线性dp&#xff09;题解代码 乒乓球筐&#xff08;哈希&#xff09; 题目链接 题解 1. 两个哈希表 先统计第一个字符串中的字符个数&#xff0c;再统计第二个字…...

React基础知识(一)

文章目录 概念特点React基本使用hello_react案例虚拟DOM的两种创建方式使用jsx创建使用js创建 虚拟DOM和真实DOM React jsxXMLjsx语法规则作用基本语法规则js语句和js代码babel.js作用 模块与组件模块组件 React面向组件编程函数式组件类组件 概念 react是一个将数据渲染为Htm…...

红黑树(Red-Black Tree)核心知识点与面试高频问题

红黑树&#xff08;Red-Black Tree&#xff09;核心知识点与面试高频问题 一、红黑树的核心性质 红黑树是一种自平衡的二叉搜索树&#xff0c;通过以下规则确保平衡性&#xff1a; 节点颜色&#xff1a;每个节点是红色或黑色。 根节点&#xff1a;根必须是黑色。 叶子节点&a…...

SpringBoot整合SSM

一、SpringBoot整合SSM SpringBoot整合SpringSpringBoot整合SpringMVCSpringBoot整合MyBatis&#xff08;主要&#xff09; 步骤一&#xff1a;创建SpringBoot工程&#xff0c;添加druid依赖 <!-- todo 1 添加druid连接池依赖--> <dependency><groupId>co…...

set/multiset容器

1.概念 所有元素会在插入时自动排序 set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现。 set不允许重复元素&#xff0c;multiset允许重复元素。 2. set构造和赋值 set<T> st; set(const set &st);// 拷贝构造函数 set& operator(const set &a…...

vim 编辑器 使用教程

Vim是一款强大的文本&#xff08;代码&#xff09;编辑器&#xff0c;它是由Bram Moolenaar于1991年开发完成。它的前身是Bill Joy开发的vi。名字的意义是Vi IMproved。 打开vim&#xff0c;直接在命令行输入vim即可&#xff0c;或者vim <filename>. Vim分为四种模式&a…...

去中心化固定利率协议

核心机制与分类 协议类型&#xff1a; 借贷协议&#xff08;如Yield、Notional&#xff09;&#xff1a;通过零息债券模型&#xff08;如fyDai、fCash&#xff09;锁定固定利率。 收益聚合器&#xff08;如Saffron、BarnBridge&#xff09;&#xff1a;通过风险分级或博弈论…...

Python高阶函数-filter

1. 基本概念 filter() 是Python内置的高阶函数&#xff0c;用于过滤序列中的元素。它接收一个函数和一个可迭代对象作为参数&#xff0c;返回一个迭代器&#xff0c;包含使函数返回True的所有元素。 filter(function, iterable)2. 工作原理 惰性计算&#xff1a;filter对象是…...

hive/doris查询表的创建和更新时间

hive查询表的创建和更新时间&#xff1a; SELECT d.NAME AS database_name, t.TBL_NAME AS table_name, FROM_UNIXTIME(t.CREATE_TIME) AS create_time, FROM_UNIXTIME(tp.PARAM_VALUE) AS last_ddl_time FROM metastore.TBLS t JOIN metastore.DBS d ON t.DB_ID d.DB_ID JOIN…...

40常用控件_WindowFrame的影响

window frame 的影响 如果 widget 作为一个窗口(带有标题栏,最小化,最大化,关闭按钮),那么在计算尺寸和坐标的 时候就有两种算法.包含 window frame 和 不包含 window frame. 其中x(),y0,frameGeometry(), pos(),move() 都是按照包含 window frame 的方式来计算 的. 其中 geome…...

PCB 赋能机器人技术革新:核心功能与前沿趋势

一、智能控制中枢的异构集成 采用 20 层刚挠结合板架构&#xff0c;搭载 NVIDIA Jetson AGX Orin SoC&#xff08;100TOPS 算力&#xff09;&#xff0c;集成 64 位 ARMv8 内核与 32GB 内存&#xff0c;实现多模态传感器数据融合与实时决策。板载 128MB DDR4 缓存支持 μs 级响…...

unity 环形UI菜单实现方法2

在项目中需要一个环形UI并且循环往复的效果&#xff0c;这个方法思路为提前预设好位置&#xff0c;让UI根据坐标预设的移动&#xff0c;然后使用mask遮罩达到循环往复效果的目的。 下图分别分为了三个列表 第一个列表poslist是提前预设的位置 第二个列表为背景暂时不用看 第三个…...

Redis进阶--主从复制

目录 一、引言 二、介绍 三、解决问题 四、配置主从复制 1.复制 全量复制&#xff1a; 部分复制&#xff1a; 实时复制&#xff1a; 五、总结 一、引言 本篇文章将继续介绍Redis中的主从复制机制 二、介绍 主从复制是在分布式系统中实现的&#xff0c;希望有多个服务器…...

Redisson分布式锁:原理、使用

1. Redisson简介 Redisson是一个基于Redis的Java客户端库&#xff0c;提供了丰富的分布式对象和服务&#xff08;如分布式锁、信号量、Map等&#xff09;。其核心优势在于​​简化分布式锁的实现​​&#xff0c;并解决了原生Redis分布式锁的常见问题&#xff08;如死锁、误删…...

Java设计模式之外观、享元、组合模式《三国争霸:模式风云录》

第一章&#xff1a;乱世起&#xff08;外观初现&#xff09; 黄巾余孽张角三兄弟操控"混沌子系统"&#xff0c;各地流民不堪996劳役。观国隐士诸葛孔明出山&#xff0c;在博望坡构建首个"军师智脑"&#xff1a; /​**​* 外观模式&#xff1a;军师智…...

设计模式之解释器模式:原理、实现与应用

引言 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一种语言的文法表示&#xff0c;并提供一个解释器来解释该语言中的句子。解释器模式适用于需要解析特定语法规则的场景&#xff0c;如正则表达式、SQL解析等。本文将深入…...

redis itheima

缓存问题 核心是如何避免大量请求到达数据库 缓存穿透 既不存在于 redis&#xff0c;也不存在于 mysql 的key&#xff0c;被重复请求 public Result queryById(Long id) {String key CACHE_SHOP_KEYid;// 1. redis & mysqlString shopJson stringRedisTemplate.opsFo…...

AF3 OpenFoldDataModule类setup方法解读

AlphaFold3 data_modules 模块的 OpenFoldDataLoader 类 setup 方法用于设置数据集的关键部分,负责根据不同的模式(训练、验证或预测)生成和初始化相应的数据集。 源代码: def setup(self, stage=None):# Most of the arguments are the same for the three datasets data…...

服务器报错:xxx/libc.so.6: version `GLIBC_2.32‘ not found

/lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found (required by ./aima-sim-app-main) 解决思路 根据错误信息&#xff0c;您的应用程序 aima-sim-app-main 和 libmujoco.so.3.1.6 库依赖于较新的 GNU C Library (glibc) 版本&#xff08;如 GLIBC_2.32, GLIBC…...

FPGA状态机设计:流水灯实现、Modelsim仿真、HDLBits练习

一、状态机思想 1.概念 状态机&#xff08;Finite State Machine, FSM&#xff09;是计算机科学和工程领域中的一种抽象模型&#xff0c;用于描述系统在不同状态之间的转换逻辑。其核心思想是将复杂的行为拆解为有限的状态&#xff0c;并通过事件触发状态间的转移。 2.状态机…...

机试题——最少乘坐公交次数

题目描述 春节将近&#xff0c;小明想在节日期间逛一逛城里的 ( N ) 个著名景点。所有景点都能通过坐公交到达。需要设计一种公交路线方案&#xff0c;让小明能最快地逛完所有景点。 输入描述 第一行&#xff1a;一个整数 ( N )&#xff0c;表示景点数量&#xff0c;满足 ( …...

防孤岛保护装置在分布式光伏并网中的应用

什么是光伏的“孤岛效应” 孤岛islanding 包含负荷和电源的部分电网&#xff0c;从主网脱离后继续孤立运行的状态。孤岛可分为非计划性孤岛和计划性孤岛。 孤岛效应的危害 当电网侧停电检修&#xff0c;若并网光伏电站的逆变器仍在继续供电&#xff0c;维修人员不一定…...

记一次gitlab服务器负载过高问题处理

服务器上进程 /var/opt/gitlab/gitlab-rails/etc/unicorn.rb /opt/gitlab/embedded/service/gitlab-rails/config.ru 进程服务器cpu占用过高应该怎么处理 tail -f /var/log/gitlab/gitlab-rails/production.log调整 Unicorn 配置&#xff1a;unicorn.rb 是 Unicorn 服务器的配…...

LiT and Lean: Distilling Listwise Rerankers intoEncoder-Decoder Models

文章&#xff1a;ECIR 2025会议 一、动机 背景&#xff1a;利用LLMs强大的能力&#xff0c;将一个查询&#xff08;query&#xff09;和一组候选段落作为输入&#xff0c;整体考虑这些段落的相关性&#xff0c;并对它们进行排序。 先前的研究基础上进行扩展 [14,15]&#xff0c…...

【项目日记】高并发服务器项目总结

生活总是让我们遍体鳞伤&#xff0c; 但到后来&#xff0c; 那些受伤的地方一定会变成我们最强壮的地方。 -- 《老人与海》-- 高并发服务器项目总结 模块关系图项目工具模块缓冲区模块通用类型模块套接字socket模块信道Channel模块多路转接Poller模块 Reactor模块时间轮Tim…...

P1332 血色先锋队(BFS)

题目背景 巫妖王的天灾军团终于卷土重来&#xff0c;血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团&#xff0c;以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围&#xff0c;现在他们将主力只好聚集了起来&#xff0c;以抵…...

systemd 与 SysVinit

1. 什么是 systemd 和 SysVinit&#xff1f; systemd 和 SysVinit 都是 Linux 的初始化系统&#xff08;init system&#xff09;&#xff0c;用于管理系统启动、服务、进程和日志。 比较项SysVinitsystemd启动方式逐步启动&#xff08;串行&#xff09;并行启动&#xff08;…...

PythonWeb项目-Django+vue白酒数据推荐系统功能介绍

❥(^_-) 上千个精美定制模板,各类成品Java、Python、PHP、Android毕设项目,欢迎咨询。 ❥(^_-) 程序开发、技术解答、代码讲解、文档,💖文末获取源码+数据库+文档💖 💖软件下载 | 实战案例 💖文章底部二维码,可以联系获取软件下载链接,及项目演示视频。 本项目源…...

AWS Bedrock:开启企业级生成式AI的钥匙【深度解析】

引言&#xff1a;生成式AI的工业革命需要新基建 根据Gartner预测&#xff0c;到2026年超过80%的企业将在生产环境中部署生成式AI。而AWS Bedrock作为首个企业级生成式AI托管平台&#xff0c;正在重塑AI工业化落地的技术范式。本文将深入解构其技术架构与商业价值。 一、Bedroc…...

网络安全应急响应-文件痕迹排查

在Windows系统的网络安全应急响应中&#xff0c;文件痕迹排查是识别攻击行为的关键步骤。以下是针对敏感目录的详细排查指南及扩展建议&#xff1a; 1. 临时目录排查&#xff08;Temp/Tmp&#xff09; 路径示例&#xff1a; C:\Windows\TempC:\Users\<用户名>\AppData\L…...

【玩转全栈】—— Django 连接 vue3 保姆级教程,前后端分离式项目2025年4月最新!!!

本文基于之前的一个旅游网站&#xff0c;实现 Django 连接 vue3&#xff0c;使 vue3 能携带 CSRF Token 发送 axios 请求给后端&#xff0c;后端再响应数据给前端。想要源码直接滑倒底部。 目录 实现效果 解决跨域 获取 csrf-token 什么是 csrf-token &#xff1f; CSRF攻击的…...

网络安全·第一天·IP协议安全分析

本篇博客讲述的是网络安全中一些协议缺陷以及相应的理论知识&#xff0c;本博主尽可能讲明白其中的一些原理以及对应的防卫措施。 学习考研408的同学也能进来看看&#xff0c;或许对考研有些许帮助&#xff08;按照考研现在的趋势&#xff0c;年年都有新题目&#xff0c;本文当…...

TensorFlow深度学习实战——字符嵌入、子词嵌入、句子嵌入和段落嵌入

TensorFlow深度学习实战——字符嵌入、子词嵌入、句子嵌入和段落嵌入 0. 前言1. 字符嵌入2. 字词嵌入3. 句子嵌入和段落嵌入相关链接 0. 前言 在自然语言处理中&#xff0c;嵌入 (Embedding) 技术是将文本转化为数值向量的核心方法&#xff0c;使计算机能够理解和处理语言中的…...

剖析AI与5G:是夸大其词,还是时代变革的引擎?-优雅草卓伊凡

剖析AI与5G&#xff1a;是夸大其词&#xff0c;还是时代变革的引擎&#xff1f;-优雅草卓伊凡 在当今科技飞速发展的时代&#xff0c;AI与5G无疑是两大备受瞩目的焦点。近日&#xff0c;一个引人深思的问题浮出水面&#xff1a;“AI是不是被夸大了&#xff0c;就像当年的5G一样…...

Python Cookbook-5.7 在增加元素时保持序列的顺序

任务 你需要维护一个序列&#xff0c;这个序列不断地有新元素加入&#xff0c;但始终处于排序完毕的状态这样你可以在任何需要的时候检查或者删除当前序列中最小的元素。 解决方案 假设有一个未排序的列表&#xff0c;比如: the_list [903, 10, 35, 69, 933, 485, 519, 37…...

Ubuntu18系统安装

1、虚拟机安装 请参照之前的《虚拟机安装centos7-NAT网络模式安装》与《虚拟机安装centos7-桥接模式》 2、启动虚拟机进入系统的欢迎界面 选择English后并点击回车键(Enter) 3、进入安装页面 选择Countinue without updating并点击回车键(Enter) 4、键盘配置 选择Done并点击…...

【AIGC】零样本学习方法综述(TPAMI 2023 研究综述)

出版日期为2022年7月18日&#xff1b;工作由国家自然科学基金资助6217616年6061732011和61976141&#xff0c;部分由广东基础和应用基础研究基金资助2022A1515010791&#xff0c;部分由深圳大学自然科学基金会稳定支持计划资助号20200804193857002&#xff0c;部分由SZU的跨学科…...

Redis持久化之AOF

AOF&#xff08;Append Only File&#xff09;持久化&#xff1a;以独立日志的方式记录每次写命令&#xff0c;重启时再重新执行AOF文件中的命令达到恢复数据的目的。AOF的主要作用解决了数据持久化的实时性。 1.使用AOF 开启AOF需要设置配置文件&#xff1a; appendonly yes…...

QT6(12)3.3.1 Qt元对象系统概述:QObject 类与 QMetaObject 类,类型转换 qobject_cast<T>()。

&#xff08;33&#xff09;Qt元对象系统概述&#xff1a; QObject 类&#xff1a; 以及&#xff1a; 老师带咱们学生测试一下&#xff1a; 谢谢老师 &#xff08;34&#xff09;类型转换 qobject_cast( ) &#xff1a; 来自 一言的教导&#xff1a; &#xff08;35&#x…...

Electron使用WebAssembly实现CRC-32 STM32校验

Electron使用WebAssembly实现CRC-32 STM32校验 将C/C语言代码&#xff0c;经由WebAssembly编译为库函数&#xff0c;可以在JS语言环境进行调用。这里介绍在Electron工具环境使用WebAssembly调用CRC-32 STM32格式校验的方式。 CRC-32 STM32校验函数WebAssembly源文件 C语言实…...

C++11QT复习 (十五)

文章目录 Day10 标准模板库学习笔记&#xff08;2025.04.02&#xff09;一、函数和数组能否放入 STL 容器&#xff1f;1. 引用不能直接作为容器元素类型✅ 推荐做法&#xff1a;使用 std::reference_wrapper<T> 2. 函数不能直接作为容器元素类型✅ 推荐做法一&#xff1a…...

文件存储的路径简单分析

filename file_pic.filename pic /static/img/filename # 将文件的名称存储在数据库中&#xff0c;方便调取 p_file os.path.join(/home/enen/ee/static/img, filename) file_pic.save(p_file) # 保存文件到指定目录&#xff0c;具体项目是要根据项目的存储地址来看的…...

汽车与航空航天领域软件维护:深度剖析与未来展望

一、引言 在当今科技飞速发展的时代&#xff0c;汽车和航空航天领域的软件应用愈发广泛和深入&#xff0c;软件已成为这些行业系统的核心组成部分。从汽车的智能驾驶辅助系统到航空航天飞行器的飞行控制软件&#xff0c;软件的可靠性、安全性直接关系到整个系统的正常运行和人…...

吉利汽车采用 EMQX 与AutoMQ联合方案构建公私有云一体化的车联网核心架构

吉利汽车集团 数字化基础架构总工程师 洪旅杭 关于吉利汽车 吉利汽车集团在中国上海、宁波、以及海外等地建有造型设计和工程研发中心&#xff0c;研发实力雄厚。在中国、马来西亚建有世界一流的现代化整车和动力总成制造工厂&#xff0c;拥有各类销售网点超过 1400 多家&…...

深圳漫云科技户外公园实景儿童剧本杀小程序:开启亲子互动新纪元

在亲子娱乐需求日益增长的当下&#xff0c;深圳漫云科技推出的户外公园实景儿童剧本杀小程序&#xff0c;凭借其创新玩法与丰富功能&#xff0c;为亲子家庭带来全新体验。该小程序融合户外探险、角色扮演与逻辑推理&#xff0c;不仅满足孩子好奇心&#xff0c;更提升其思维能力…...

如何实现H5端对接钉钉登录并优雅扩展其他平台

如何实现H5端对接钉钉登录并优雅扩展其他平台 钉钉H5登录逻辑后端代码如何实现&#xff1f;本次采用策略模式工厂方式进行定义接口确定会使用的基本鉴权步骤具体逻辑类进行实现采用注册表模式&#xff08;Registry Pattern&#xff09;抽象工厂进行基本逻辑定义具体工厂进行对接…...

借助 AI 工具使用 Python 实现北京市店铺分布地理信息可视化教程

一、项目概述 本项目通过 Python 的pyecharts库&#xff0c;结合 AI 工具辅助代码编写与逻辑梳理&#xff0c;实现北京市店铺数量分布及区域连线的地理信息可视化&#xff0c;最终生成交互式地图图表。 二、准备工作 1. 环境与工具 Python 环境&#xff1a;确保已安装 Pyth…...

如何选择优质的安全工具柜:材质、结构与功能的考量

在工业生产和实验室环境中&#xff0c;安全工具柜是必不可少的设备。它不仅承担着工具的存储任务&#xff0c;还直接影响工作环境的安全和效率。那么&#xff0c;如何选择一个优质的安全工具柜呢&#xff1f;关键在于对材质、结构和功能的考量。 01材质&#xff1a;耐用与防腐 …...

使用Vue、Nodejs以及websocket搭建一个简易聊天室

简易聊天室 说在前面效果展示websocketwebsocket的由来websocket的特点 vue前端静态结构效果代码 点击切换用户以及该用户高亮实现思路效果展示 发送消息功能效果展示 连接服务端 Nodejs服务器端实现步骤代码 说在前面 在学习计算机网络的时候&#xff0c;看到了websocket这个…...