Io uso sigaction per gestire un'eccezione errore di pagina, e la funzione del gestore è defind come questo:Come identificare leggere o scrivere operazioni di errore di pagina quando si utilizza gestore sigaction su SIGSEGV (LINUX)
void sigaction_handler(int signum, siginfo_t *info, void *_context)
Quindi è facile ottenere l'indirizzo di errore di pagina leggendo info-> si_addr.
La domanda è: come sapere se questa operazione è la memoria LEGGERE o WRITE?
ho trovato il tipo di _context parametro è ucontext_t definito in/usr/include/sys/ucontext.h
C'è un campo CR2 definito mcontext_t, ma unforunately, è solo avaliable quando x86_64 non è defind, quindi non ho potuto usare cr2 per identificare operazioni di lettura/scrittura.
In anotherway, v'è una struttura denominata sigcontext definito in/usr/include/bits/sigcontext.h Questo struct contiene CR2 campo. Ma non so dove trovarlo.
Le informazioni error_code sono accessibili tramite: (contesto (ucontext_t *)) -> uc_mcontext.gregs [REG_ERR]. Viene passato dall'hardware sullo stack, che viene poi passato al gestore del segnale dal kernel, poiché il kernel passa l'intero 'frame '. –
M. Alaggan, quale hardware? – osgx
L'ho provato su x86-64. –