我使用 sigaction 来处理缺页异常,处理函数定义如下:
void sigaction_handler(int signum, siginfo_t *info, void *_context)
所以通过阅读info->si_addr很容易得到缺页地址。
问题是,如何知道这个操作是内存READ还是WRITE?
我发现_context参数的类型是在/usr/include/sys/ucontext.h中定义的ucontext_t
在mcontext_t中定义了一个 cr2 字段,但不幸的是,它仅在未定义x86_64时可用,因此我无法使用 cr2 来识别读/写操作。
另一方面,在 /usr/include/bits/sigcontext.h中定义了一个名为sigcontext的结构, 该结构包含cr2字段。但我不知道从哪里得到它。