什么是触发页面错误的简单方法?

时间:2014-02-28 09:47:53

标签: c memory-management

我正在寻找一种简单的方法来触发真正的页面错误(而不是因访问已映射的地址或受保护的地址而导致的段错误。)

什么可能是一个?

我想过简单地运行

int main(void) {
    int *x = 1000;
    *x = 2000;
}

但它似乎不会导致页面错误,而是内存违规。

3 个答案:

答案 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

在c中,您可以使用raise()kill()功能

#include <sys/types.h>
#include <signal.h>

int main() {
    raise(SIGBUS);

    return 0;
}