gpt4 book ai didi

linux - 在 SIGSEGV 上使用 sigaction 处理程序时如何识别页面错误的读取或写入操作?(LINUX)

转载 作者:IT王子 更新时间:2023-10-29 00:24:08 26 4
gpt4 key购买 nike

我使用sigaction来处理page fault异常,handler函数是这样定义的:

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来识别读写操作。

另一方面,在/usr/include/bits/sigcontext.h 中定义了一个名为 sigcontext 的结构体此结构包含 cr2 字段。但是我不知道从哪里得到它。

最佳答案

您可以在 x86_64 中通过引用 ucontext 的 mcontext 结构和 err 寄存器来检查这一点:

void pf_sighandler(int sig, siginfo_t *info, ucontext_t *ctx) {
...
if (ctx->uc_mcontext.gregs[REG_ERR] & 0x2) {
// Write fault
} else {
// Read fault
}
...
}

关于linux - 在 SIGSEGV 上使用 sigaction 处理程序时如何识别页面错误的读取或写入操作?(LINUX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17671869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com