我正在寻找一种简单的方法来触发真正的页面错误(而不是因访问已映射的地址或受保护的地址而导致的段错误。)
什么可能是一个?
我想过简单地运行
int main(void) {
int *x = 1000;
*x = 2000;
}
但它似乎不会导致页面错误,而是内存违规。
答案 0 :(得分:2)
我相信mmap()
一个磁盘文件,读取或写入它应该就足够了。至少在Linux上已经足够了。
答案 1 :(得分:2)
如果您使用的是Linux,则还可以利用fork(2)
的写时复制行为:
#include <unistd.h>
int main()
{
int pid = 0, retcode = 0, poof = 0;
if ((pid = fork()) == 0) {
poof = 1; /* Page fault */
} else {
waitpid(pid, &retcode, 0);
}
return 0;
}
另一种方法是:
#include <unistd.h>
int main()
{
long pagesize = sysconf(_SC_PAGESIZE);
unsigned char *p = malloc(pagesize + 1); /* Cross page boundaries. Page fault may occur depending on your allocator / libc implementation. */
p[0] = 0; /* Page fault. */
p[pagesize] = 1; /* Page fault. */
return 0;
}
答案 2 :(得分:1)
如果您使用的是Linux,则可以通过向进程发送信号来模拟分段错误和总线错误。请参阅man signal。
要使用pid = 1234模拟进程的分段错误,请键入终端:
kill -s 11 1234
要使用pid = 1234模拟进程的总线错误,请键入终端:
kill -s 10 1234
#include <sys/types.h>
#include <signal.h>
int main() {
raise(SIGBUS);
return 0;
}