← 回總覽

Windows 栈限制检查回顾:amd64,即 x86-64

📅 2026-03-20 04:12 Raymond Chen 软件编程 1 分鐘 1146 字 評分: 82
Windows 内部原理 x86-64 汇编 栈探测 运行时
📌 一句话摘要 本文对 Windows x86-64 上的 “chkstk” 函数实现进行了技术分析,对比了传统与现代运行时方法,并强调了栈探测(stack probing)对于 Intel CET 兼容性的重要性。 📝 详细摘要 Raymond Chen 继续他关于 Windows 栈限制检查的回顾,这次考察的是 amd64 (x86-64) 的实现。文章对比了传统 “msvcrt” 运行时与现代 “ucrtbase” 中的 “chkstk” 函数,指出虽然逻辑基本相同,但探测机制有所不同(读取与写入)。文中解释了这些函数在不调整栈指针的情况下验证栈空间,将该责任留给调用者,以确保符合

📌 一句话摘要

本文对 Windows x86-64 上的 “chkstk” 函数实现进行了技术分析,对比了传统与现代运行时方法,并强调了栈探测(stack probing)对于 Intel CET 兼容性的重要性。

📝 详细摘要

Raymond Chen 继续他关于 Windows 栈限制检查的回顾,这次考察的是 amd64 (x86-64) 的实现。文章对比了传统 “msvcrt” 运行时与现代 “ucrtbase” 中的 “chkstk” 函数,指出虽然逻辑基本相同,但探测机制有所不同(读取与写入)。文中解释了这些函数在不调整栈指针的情况下验证栈空间,将该责任留给调用者,以确保符合 Intel 的控制流强制技术(CET)。文章包含了汇编代码示例和使用模式,简要介绍了 Windows 底层运行时的内部机制。

💡 主要观点

- 栈检查的双重实现方法。 传统 “msvcrt” 和现代 “ucrtbase” 运行时在探测机制上对 “chkstk” 的实现不同,后者使用写入操作而非读取。

验证与分配的分离。 “chkstk” 的设计目的是在不调整栈指针的情况下验证栈的可用性,这是一种为了保持 ABI 稳定性和安全性而刻意为之的设计选择。
符合 Intel CET 标准。 将验证与分配分离的特定设计对于保持与 Intel 控制流强制技术(影子栈)的兼容性至关重要。
栈分配的标准使用模式。 标准工作流程要求调用 “chkstk” 来验证空间,随后手动执行 “sub rsp, rax” 指令来分配栈帧。

💬 文章金句

- 在这两种情况下,该函数都确保栈已经扩展了必要的量,但将调用返回后调整栈的责任留给了调用者。

  • 这种设计保留了与影子栈(Intel 称之为控制流强制技术,即 CET)的兼容性。
  • 一个在 msvcrt 中,即传统运行时…… 另一个在 ucrtbase 中,即所谓的通用运行时。

📊 文章信息

AI 评分:82

来源:The Old New Thing

作者:Raymond Chen

分类:软件编程

语言:英文

阅读时间:2 分钟

字数:343

标签: Windows 内部原理, x86-64, 汇编, 栈探测, 运行时

阅读完整文章

查看原文 → 發佈: 2026-03-20 04:12:36 收錄: 2026-03-20 08:00:22

🤖 問 AI

針對這篇文章提問,AI 會根據文章內容回答。按 Ctrl+Enter 送出。