Сохранение контекста - как читать регистры сегментов в C и указатель инструкций? - PullRequest
0 голосов
/ 02 февраля 2019

Hell'o.Я хочу создать программу, которая сохраняет набор регистров - контекст процесса.Когда я пытаюсь прочитать регистр CS, мой компилятор и IDE сообщают мне, что этот регистр "CS" не существует.

    register int *cs asm ("cs");

Я правильно делаю?Сохранение контекста процесса означает сохранение каждого регистра - особенно сегмента кода (и других сегментов) - эти регистры необходимы для восстановления образа процесса и начала выполнения с того места, где было остановлено последнее выполнение.

1 Ответ

0 голосов
/ 02 февраля 2019

Сохранение контекста процесса означает сохранение каждого регистра

Конечно, вы можете сохранить cs и eip.Однако ...

  • ... эти два регистра содержат местоположение (адрес) выполняемой в данный момент инструкции.

    Это означает, что эти регистры всегда будут содержатьадрес кода, который сохраняет регистры контекста.

    Почему вы хотите хранить эту информацию, когда эти регистры всегда содержат одно и то же значение?

  • ... что делатьВы думаете, что происходит, когда вы восстанавливаете эти регистры?

    Поскольку эти два регистра содержат адрес выполняемой в данный момент инструкции, единственный способ «восстановить» эти два регистра - перейти к инструкции, которая сохранила значениярегистра.

    Вы попадете в бесконечный цикл ...

    Это действительно то, что вы хотите сделать?

Я хочу создать программу, которая сохраняет набор регистров - контекст процесса.

register int *cs asm ("cs");

Теперь это становится очень страшным:

Если вы действительно хотите написать некоторый код, который сохраняетCPВ контексте (например, для ручной реализации механизма try - catch в «низкоуровневом» C), вы должны написать полную функцию в ассемблере.

Не пытайтесь писать это, используя встроенную сборкувнутри функций C!

В противном случае вы не знаете, как «скомпилированный» код C будет взаимодействовать с кодом ассемблера;весьма вероятно, что ваша программа не будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...