Я использую sigaction для обработки исключения ошибки страницы, и функция обработчика определяется следующим образом:
void sigaction_handler(int signum, siginfo_t *info, void *_context)
Таким образом, легко получить адрес ошибки страницы, прочитав info->si_addr.
Вопрос в том, как узнать, является ли эта операция памятью READ или WRITE?
Я обнаружил, что тип параметра _context — это ucontext_t, определенный в /usr/include/sys/ucontext.h
В mcontext_t определено поле cr2, но, к сожалению, оно доступно только тогда, когда x86_64 не определено, поэтому я не мог использовать cr2 для идентификации операций чтения/записи.
С другой стороны, существует структура с именем sigcontext, определенная в /usr/include/bits/sigcontext.h Эта структура содержит поле cr2. Но я не знаю, где его взять.