尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Page Fault处理函数在汇编层面如何处理错误码
在 x86_64 架构下#PFPage Fault处理函数的汇编层面处理错误码主要分两个核心部分保存现场时将它作为参数传递以及恢复现场时在iretq之前正确地跳过它。此外错误码本身包含了触发异常的关键信息。第一部分进入处理函数——保存错误码并传递当 CPU 触发#PF时它会自动完成以下操作压栈将错误码压入当前栈中。此时栈顶布局为[rsp] → 错误码 (Error Code) [rsp8] → RIP [rsp16] → CS [rsp24] → RFLAGS [rsp32] → RSP (如果发生了特权级切换) [rsp40] → SS (如果发生了特权级切换)跳转通过 IDT中断描述符表中的#PF门描述符跳转到内核注册的处理函数入口。在汇编入口处需要保存通用寄存器并将错误码作为参数传递给后续的 C 语言处理函数。; 汇编入口page_fault_handler_entry page_fault_handler_entry: ; 1. 保存所有通用寄存器以便在 C 函数中恢复 push rax push rbx push rcx push rdx push rsi push rdi push rbp push r8 push r9 push r10 push r11 push r12 push r13 push r14 push r15 ; 2. 保存当前栈指针到 rbp方便后续定位 mov rbp, rsp ; 3. 将错误码作为第一个参数传递给 C 函数 ; 注意错误码此时位于 [rbp 15*8] 处 ; 因为我们已经压入了 15 个 8 字节的通用寄存器 mov rdi, [rbp 15*8] ; rdi Error Code ; 4. 将出错的虚拟地址CR2作为第二个参数 mov rsi, cr2 ; rsi Faulting Address push rsi ; 保存 CR2 到栈上可选 ; 5. 调用 C 语言编写的核心处理函数 call do_page_fault ; void do_page_fault(unsigned long error_code, unsigned long address) ; 6. C 函数返回后恢复之前保存的寄存器 ; 注意此时 rsp 需要恢复到保存通用寄存器之后的位置 mov rsp, rbp pop r15 ; ... (按相反顺序弹出所有寄存器) pop rax ; 7. 跳过错误码并返回 add rsp, 8 iretq第二部分do_page_faultC 函数对错误码的解析C 函数do_page_fault会收到错误码并解析其位字段以决定处理方式错误码 Bit含义处理逻辑Bit 0 (P)0 页不存在1 权限违规若为 0分配物理页并建立映射若为 1检查权限。Bit 1 (W)0 读操作1 写操作确定访问类型用于 COW写时复制或只读页错误。Bit 2 (U)0 内核态1 用户态决定是内核错误panic还是用户态错误SIGSEGV。Bit 3 (RSVD)1 使用了保留位通常意味着页表损坏直接触发panic。Bit 4 (I/D)1 指令获取若为 1表示 CPU 尝试从此地址执行指令需特殊处理。第三部分返回前正确处理错误码在汇编中关键在于add rsp, 8指令的位置。它必须紧跟在iretq之前执行为什么是add rsp, 8因为错误码是 CPU 在进入处理程序时压入的它不属于iretq的正常返回栈帧。iretq期望栈顶是RIP如果不跳过iretq会尝试将错误码当作RIP使用导致系统崩溃。错误码的常见陷阱栈偏移计算错误在多级栈帧中如果你在通用寄存器压栈和call指令之间操作了栈那么错误码在栈上的偏移量会发生改变。忘记处理CR2在 64 位模式下出错的地址存放在CR2寄存器中。在调用do_page_fault之前必须将CR2的值也作为参数传递。
RELATED

相关推荐

Waifu2x-Extension-GUI终极指南:如何选择个人版与商业版实现媒体超分辨率处理

Waifu2x-Extension-GUI终极指南:如何选择个人版与商业版实现媒体超分辨率处理

Waifu2x-Extension-GUI终极指南:如何选择个人版与商业版实现媒体超分辨率处理 【免费下载链接】Waifu2x-Extension-GUI Video, Image and GIF upscale/enlarge(Super-Resolution) and Video frame interpolation. Achieved with Waifu2x, Real-ESRGAN, Real-CUGAN, …

📅 2026/9/7 9:50:08
DNA甲基化抑制剂5-azaC在果实保鲜中的应用与机制

DNA甲基化抑制剂5-azaC在果实保鲜中的应用与机制

1. 果实采后贮藏的行业痛点与科学挑战 在农产品供应链中,果实采后损失一直是困扰全球农业的顽疾。根据联合国粮农组织统计,发展中国家约40%的果蔬在采后环节因生理劣变和病原侵染而损耗。传统保鲜技术如低温贮藏、气调包装虽有一定效果,但面对…

📅 2026/9/2 12:57:03
浏览器端图像压缩技术痛点与Compressor.js解决方案深度解析

浏览器端图像压缩技术痛点与Compressor.js解决方案深度解析

浏览器端图像压缩技术痛点与Compressor.js解决方案深度解析 【免费下载链接】compressorjs JavaScript image compressor. 项目地址: https://gitcode.com/gh_mirrors/co/compressorjs 在当今Web应用中,图像处理已成为性能优化的关键瓶颈。大尺寸图像不仅拖慢…

📅 2026/9/23 20:30:44
MORE NEWS

更多资讯

📰

ponytail 插件与技能实战:从安装到工作流自动化

1. 从“ponytail”这个词说起:它到底是什么第一次看到“ponytail”这个词,很多人脑子里蹦出来的画面大概是扎起来的马尾辫。但在技术圈和效率工具圈子里,ponytail 已经悄悄变成了一个高频出现的名字,尤其是搭配上“skill”“插件”…

📰

AI编程插件系统原理:plugin.json、TS SDK与CLI三件套解析

1. 项目概述:从“plugins”这个词开始,我们到底在聊什么?“plugins”——这个词最近在开发者圈子里高频出现,但很多人点开搜索结果后反而更迷糊了:它不是某个具体工具,不是某款软件的专属功能,而…

📰

七天入门嵌入式:Arduino学习实战与踩坑全记录

第一周接触嵌入式,一头扎进Arduino的世界,从连LED都不会点亮,到能独立控制舵机、看懂寄存器配置,这七天走得不算快,但每一步都踩得很扎实。这篇文章把这一周的学习记录、踩坑经历和实操心得整理出来,给同样…

📰

awesome-free-models本地推理工具对比:Ollama、LM Studio、llama.cpp一文讲透

awesome-free-models本地推理工具对比:Ollama、LM Studio、llama.cpp一文讲透 【免费下载链接】awesome-free-models A curated list of free AI models, APIs, and tools you can use without paying a cent. 项目地址: https://gitcode.com/gh_mirrors/aw/aweso…

📰

NanoJev 专家轨迹采集实战:双环境同步 ViZDoom 如何让 AI 学会瞄准移动目标射击

NanoJev 专家轨迹采集实战:双环境同步 ViZDoom 如何让 AI 学会瞄准移动目标射击 【免费下载链接】NanoJev A nano replica of Jev: parallel decisions, dynamic candidates, and an end-to-end training pipeline. 项目地址: https://gitcode.com/gh_mirrors/na/…

📰

CIC-IDS2017数据集实战:从数据清洗到模型训练全流程解析

开头做网络安全方向研究的朋友,对CIC-IDS2017这个数据集应该都不陌生。它全称是Canadian Institute for Cybersecurity Intrusion Detection System 2017,由加拿大网络安全研究所发布,是目前学术界和工业界做入侵检测模型验证时最常被引用的公…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬