gpt4 book ai didi

上下文保存——如何读取C中的段寄存器和指令指针?

转载 作者:行者123 更新时间:2023-11-30 19:03:10 25 4
gpt4 key购买 nike

你好。我想创建一个保存寄存器集 - 进程上下文的程序。当我尝试读取 CS 寄存器时,我的编译器和 IDE 告诉我,该寄存器“CS”不存在。

    register int *cs asm ("cs");

我做得对吗?保存进程上下文意味着保存每个寄存器 - 特别是代码段(以及其他段) - 需要这些寄存器来恢复进程镜像并在上次执行停止的地方开始执行。

最佳答案

Saving process context means saving every register

当然你可以保存cseip。然而...

  • ...这两个寄存器包含当前正在执行的指令的位置(地址)。

    这意味着这些寄存器将始终包含保存上下文寄存器的代码的地址。

    当这些寄存器总是包含相同的值时,为什么要存储这些信息?

  • ...您认为恢复这些寄存器后会发生什么?

    因为这两个寄存器包含当前正在执行的指令的地址,所以“恢复”这两个寄存器的唯一方法就是跳转到保存寄存器值的指令。

    你会陷入无限循环......

    这真的是你想做的吗?

I want to create a program which saves register set – process context.

register int *cs asm ("cs");

现在变得非常可怕:

如果您确实想编写一些保存 CPU 上下文的代码(例如,在“低级”C 中手动实现 try-catch 机制),您可以应该用汇编程序编写完整的函数。

不要尝试在 C 函数中使用内联汇编来编写此代码!

否则你不知道“编译”的C代码将如何与汇编代码交互;您的程序很可能无法运行。

关于上下文保存——如何读取C中的段寄存器和指令指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54488861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com