Я пишу программу, которая требует, чтобы регистры с плавающей запятой ([xy] mm0-15) не перезаписывались после ошибки страницы.Я написал следующий пример кода, который генерирует ошибку страницы, а затем перехватывает ее:
#include <signal.h>
#include <iostream>
using namespace std;
void handle(int, siginfo_t*, void* vcontext);
// Page fault handler. When this is called the fp registers are all zeroed
void handle(int, siginfo_t*, void* vcontext) {
cout << "Get fp reg here";
exit(0);
}
main (int argc, char *argv[]) {
// Setup sigaction handler for page fault
struct sigaction act;
act.sa_sigaction = handle;
sigaction(SIGSEGV, &act, 0);
// Generate page fault
int i = 10;
int* iPtr = &i;
iPtr += 10000;
cout << *iPtr; // This line will generate a page fault, then sigaction will redirect the program to `handle`.
}
Затем я помещаю программу в GDB и выполняю по одной инструкции за раз.Я обнаружил, что между cout << *iPtr;
и cout << "Get fp reg here";
(в handle()
) все значения регистра fp установлены на ноль.Мне нужно сохранить значения регистров, чтобы я мог использовать их в handle()
. В качестве дополнительного примечания я использую Red Hat.