c - 上下文保存——如何读取 C 中的段寄存器和指令指针?
问题描述
你好。我想创建一个程序来保存寄存器集——进程上下文。当我尝试读取 CS 寄存器时,我的编译器和 IDE 告诉我,该寄存器“CS”不存在。
register int *cs asm ("cs");
我做对了吗?保存进程上下文意味着保存每个寄存器——尤其是代码段(以及其他段)——需要这些寄存器来恢复进程映像并从上次执行停止的地方开始执行。
解决方案
保存进程上下文意味着保存每个寄存器
当然你可以保存cs
和eip
。然而 ...
...这两个寄存器包含当前正在执行的指令的位置(地址)。
这意味着这些寄存器将始终包含保存上下文寄存器的代码的地址。
当这些寄存器总是包含相同的值时,为什么要存储这些信息?
...您认为恢复这些寄存器时会发生什么?
因为这两个寄存器包含当前正在执行的指令的地址,所以“恢复”这两个寄存器的唯一方法是跳转到保存寄存器值的指令。
你会陷入无限循环......
这真的是你想做的吗?
我想创建一个程序来保存寄存器集——进程上下文。
register int *cs asm ("cs");
现在它变得非常可怕:
如果您真的想编写一些代码来保存 CPU 上下文(例如,在“低级”C 中手动实现try
-机制),您应该在汇编程序中编写完整的函数。catch
不要尝试在 C 函数中使用内联汇编来编写它!
否则你不知道“编译”的 C 代码将如何与汇编代码交互;您的程序很可能无法运行。
推荐阅读
- java - 使用方法时“Int 无法转换为字符串”
- go - Golang 短变量声明显示错误未解决
- node.js - Pycharm with Electron - runnerw.exe:CreateProcess 失败,错误 193:%1 不是有效的 Win32 应用程序
- django - Django 使用 URL 参数在基于类的视图中查询数据库
- sql - 如何在 Maximo CMMS SQL where 子句中获取最新日期?
- javascript - 如何选择 FileReader 读取方法?
- python - 对低质量数字图像进行 OCR 的预处理方法?
- python - 如何将变量转换为 keras 层
- python - 循环数组集的问题
- godot - 运动状态实施