IST(Interrupt Stack Table,中断栈表)
当嵌套中断发生时如果当前CPU正在运行中断处理程序而另一个更高优先级的中断到来CPU需要使用独立的栈来保存上下文避免破坏当前正在执行的处理程序的栈帧。ISTInterrupt Stack Table中断栈表正是x86_64架构为解决这一问题提供的硬件机制。一、为什么需要IST1. 普通中断栈的问题如果所有中断都使用同一个内核栈如TSS.RSP0当嵌套中断发生时时间线 1. 中断A触发 → CPU切换到TSS.RSP0压栈保存上下文 2. 中断A处理程序正在执行 3. 中断B更高优先级触发 → CPU再次使用TSS.RSP0 4. 中断B的压栈会覆盖中断A的上下文 → 栈被破坏 5. 中断A返回时RIP/RFLAGS被覆盖 → 系统崩溃2. IST的解决方案每个CPU核心有一个TSS任务状态段其中包含7个IST入口IST1~IST7每个入口是一个独立的栈指针64位地址。当某个中断门Interrupt Gate被配置为使用特定的IST时CPU在处理该中断时会自动切换到对应的IST栈从而与普通内核栈和其他中断隔离。二、IST的硬件结构TSS中的IST字段x86_64struct tss_struct { uint32_t reserved1; uint64_t rsp0; // 普通内核栈ring 0 uint64_t rsp1; // ring 1 栈一般不用 uint64_t rsp2; // ring 2 栈一般不用 uint64_t reserved2; uint64_t ist1; // IST1 栈指针 uint64_t ist2; // IST2 栈指针 uint64_t ist3; // IST3 栈指针 uint64_t ist4; // IST4 栈指针 uint64_t ist5; // IST5 栈指针 uint64_t ist6; // IST6 栈指针 uint64_t ist7; // IST7 栈指针 // ... 其他字段 };IDT门描述符中的IST字段每个中断门Interrupt Gate描述符中有一个3位的IST字段bits 32-34IDT Gate Descriptor (16字节x86_64): ------------------------------------ | offset 63..48 | IST (3 bits) | - 指定使用哪个IST ------------------------------------ | offset 47..32 | P | DPL | 类型 | ------------------------------------ | offset 31..16 | 段选择子 (CS) | ------------------------------------ | offset 15..0 | 保留 | ------------------------------------IST 0使用TSS.RSP0普通内核栈IST 1~7分别使用TSS.ist1~TSS.ist7三、IST的工作流程以嵌套中断为例场景NMI不可屏蔽中断嵌套在普通中断中初始状态 - 当前运行在用户态 (ring 3) - TSS.RSP0 内核栈A - TSS.ist1 NMI专用栈 (独立8KB) - IDT中的NMI门 IST字段 1步骤1普通中断如定时器触发1. CPU从用户态切换到内核态 2. 使用 TSS.RSP0 → 切换到内核栈A 3. 压栈SS, RSP用户态, RFLAGS, CS, RIP用户态 4. 执行中断处理程序步骤2NMI中断嵌套进来1. NMI触发更高优先级 2. CPU检查NMI门描述符IST字段 1 3. CPU读取 TSS.ist1 → 切换到NMI专用栈B而不是内核栈A 4. 在NMI栈B上压栈SS, RSP内核栈A, RFLAGS, CS, RIP 5. 执行NMI处理程序 6. NMI处理完成 → iretq → 从NMI栈B弹出上下文 7. 恢复RSP指向内核栈A 8. 继续执行原来的定时器中断处理程序关键点NMI使用了独立的IST栈因此不会破坏定时器中断的栈帧嵌套层次越深每次切换到一个新的IST栈如果配置了多个IST如果中断门配置了ISTCPU完全忽略当前的RSP直接使用IST指定的栈四、IST的实际应用场景中断类型典型IST配置原因NMI不可屏蔽中断IST1NMI随时可能发生必须使用独立栈防止破坏其他中断栈#DF双重故障IST2双重故障通常意味着栈已损坏需要独立栈来记录错误#MC机器检查IST3硬件错误可能需要独立栈来保存错误状态#DB调试异常可选IST4调试器需要隔离环境普通IRQIST0使用RSP0大多数中断共享普通内核栈Linux内核中的配置// Linux arch/x86/include/asm/irq_vectors.h #define NMI_VECTOR 0x02 #define MCE_VECTOR 0x12 #define DB_VECTOR 0x01 // Linux arch/x86/kernel/entry_64.S // NMI使用 IST1 idtentry NMI do_nmi asm_nmi has_error_code0 ist1 // #DF使用 IST2 idtentry DOUBLEFAULT do_double_fault asm_double_fault has_error_code1 ist2 // #MC使用 IST3 idtentry MCE do_mce asm_mce has_error_code0 ist3五、IST的局限与注意事项1. IST栈的大小固定每个IST栈通常分配8KB或16KB。如果嵌套中断过多极端情况仍然可能栈溢出。// Linux 中 IST 栈大小定义 #define IST_STACK_SIZE (PAGE_SIZE * 2) // 通常 8KB2. 仅适用于x86_64长模式IST是x86_64长模式特有的功能在32位保护模式下不存在32位使用TSS的esp0单栈机制。3. 配置错误会引发#GP如果在IDT中设置IST7但TSS中ist7未正确初始化触发该中断时会引发通用保护故障#GP。4. 需配合SWAPGS使用在内核入口处通常需要执行SWAPGS交换GS基址来访问内核数据结构IST栈切换本身不会自动处理GS需要手动管理。六、完整中断栈切换流程含IST中断触发 ↓ CPU从IDT读取门描述符 ↓ 检查门描述符中的 IST 字段 ↓ ------------------------------------ | IST ! 0 | IST 0 | ------------------------------------ ↓ ↓ 从 TSS.istN 加载 RSP 从 TSS.RSP0 加载 RSP ↓ ↓ 切换到IST专用栈 切换到普通内核栈 ↓ ↓ 压栈SS, RSP, RFLAGS, CS, RIP ↓ 执行中断处理程序 ↓ iretq弹出上下文恢复RSP七、实际代码示例定义IST栈section .data align 16 nmi_stack_bottom: times 8192 db 0 ; 8KB NMI专用栈 nmi_stack_top: section .text extern tss_struct ; 初始化TSS中的ist1 mov rax, nmi_stack_top mov [tss_struct TSS_IST1], raxIDT条目设置IST1; 设置NMI中断门向量2IST1 mov rax, (nmi_handler 0xFFFFFFFF) ; 低32位偏移 mov [idt 2*16 0], ax mov [idt 2*16 2], KERNEL_CS ; 段选择子 mov word [idt 2*16 4], (1 9) | 0x8E00 ; IST1, 中断门 shr rax, 16 mov [idt 2*16 6], ax shr rax, 16 mov [idt 2*16 8], eax八、总结问题答案为什么需要IST防止嵌套中断破坏正在执行的中断栈帧IST在哪里配置TSS任务状态段中的ist1~ist7字段如何指定使用ISTIDT门描述符中的3位IST字段1~7IST0表示什么使用TSS.RSP0普通内核栈谁使用ISTNMI、#DF、#MC等关键异常普通IRQ通常不用IST与RSP0的区别IST是专用栈RSP0是普通内核栈IST用于关键/嵌套场景

相关新闻

MSPM0 SWD锁死救砖指南:利用BSL恢复调试接口

MSPM0 SWD锁死救砖指南:利用BSL恢复调试接口

调试 MSPM0 系列 MCU 时,最让人头疼的莫过于 SWD 接口突然无法连接,Keil 里一片“No Cortex-M Device found”的红色报错。芯片仿佛“变砖”,之前的代码无法更新,新的程序也烧不进去,项目进度瞬间卡住。很多开发者第一…

2026/10/20 13:30:02 阅读更多 →
ZenlessZoneZero-OneDragon:免费开源的全自动《绝区零》游戏助手完整指南

ZenlessZoneZero-OneDragon:免费开源的全自动《绝区零》游戏助手完整指南

ZenlessZoneZero-OneDragon:免费开源的全自动《绝区零》游戏助手完整指南 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDr…

2026/10/17 10:36:39 阅读更多 →
如何快速配置英雄联盟Akari助手:面向玩家的完整游戏效率工具指南

如何快速配置英雄联盟Akari助手:面向玩家的完整游戏效率工具指南

如何快速配置英雄联盟Akari助手:面向玩家的完整游戏效率工具指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 英雄联盟Akari助手…

2026/10/20 9:32:36 阅读更多 →

最新新闻

mootdx bestip 完整上手指南:一行命令测出最快的 5 台通达信行情服务器

mootdx bestip 完整上手指南:一行命令测出最快的 5 台通达信行情服务器

mootdx bestip 完整上手指南:一行命令测出最快的 5 台通达信行情服务器 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 通达信的行情服务器有上百台,哪台响应最快&#xff…

2026/10/21 1:13:55 阅读更多 →
Gamdl + Wrapper 完全指南:3 步搞定 Apple Music 的 ALAC 无损下载

Gamdl + Wrapper 完全指南:3 步搞定 Apple Music 的 ALAC 无损下载

Gamdl Wrapper 完全指南:3 步搞定 Apple Music 的 ALAC 无损下载 【免费下载链接】gamdl A command-line app for downloading Apple Music songs, music videos and post videos. 项目地址: https://gitcode.com/GitHub_Trending/ga/gamdl Apple Music 标着…

2026/10/21 1:13:55 阅读更多 →
CVE-2024-1086本地提权漏洞:触发机制与修复清单

CVE-2024-1086本地提权漏洞:触发机制与修复清单

CVE-2024-1086本地提权漏洞:触发机制与修复清单 【免费下载链接】CVE-2024-1086 Universal local privilege escalation Proof-of-Concept exploit for CVE-2024-1086, working on most Linux kernels between v5.14 and v6.6, including Debian, Ubuntu, and Kerne…

2026/10/21 1:13:55 阅读更多 →
Android 14文件管理革命:awesome-shizuku如何突破系统限制 [特殊字符]

Android 14文件管理革命:awesome-shizuku如何突破系统限制 [特殊字符]

Android 14文件管理革命:awesome-shizuku如何突破系统限制 🚀 在 Android 14 系统中,Google 进一步加强了文件访问权限管理,特别是对 /Android/data 和 /Android/obb 目录的访问限制,这让许多用户感到困扰。&#x1f…

2026/10/21 1:13:55 阅读更多 →
部署HyLo-Llama-14MLA14GDN-64K-SFT避坑指南:max_position_embeddings陷阱与研究许可须知

部署HyLo-Llama-14MLA14GDN-64K-SFT避坑指南:max_position_embeddings陷阱与研究许可须知

【免费下载链接】HyLo-Llama-14MLA14GDN-64K-SFT 项目地址: https://ai.gitcode.com/hf_mirrors/amd/HyLo-Llama-14MLA14GDN-64K-SFT 点击查看 免费下载 HyLo-Llama-14MLA14GDN-64K-SFT 是 AMD 发布的混合架构长文本大模型:14 层 MLA 14 层 Gated Delt…

2026/10/21 1:13:55 阅读更多 →
戴森球计划工厂蓝图仓库FactoryBluePrints:如何5分钟导入一条完整产线

戴森球计划工厂蓝图仓库FactoryBluePrints:如何5分钟导入一条完整产线

戴森球计划工厂蓝图仓库FactoryBluePrints:如何5分钟导入一条完整产线 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints 是游戏《戴森球计划》…

2026/10/21 1:12:55 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →