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

C 触发页面错误的简单方法是什么?,c,memory-management,C,Memory Management,我正在寻找一种简单的方法来触发一个真正的页面错误(而不是由于访问一个已经映射的地址或一个受保护的地址而导致的SEGFULT) 可能是什么 我想到了简单的跑步 int main(void) { int *x = 1000; *x = 2000; } 但它似乎不会导致页面错误,而是内存冲突。我相信一个磁盘文件,读或写就足够了。至少在Linux上已经足够了。如果您在Linux上,您可以通过向进程发送信号来模拟分段故障和总线错误。看 要模拟pid=1234的进程的分段故障,请键入终端:

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

可能是什么

我想到了简单的跑步

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

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

我相信一个磁盘文件,读或写就足够了。至少在Linux上已经足够了。

如果您在Linux上,您可以通过向进程发送信号来模拟分段故障和总线错误。看

要模拟pid=1234的进程的分段故障,请键入终端:

kill -s 11 1234
kill -s 10 1234
要模拟pid=1234的进程的总线错误,请键入终端:

kill -s 11 1234
kill -s 10 1234
在c中,可以使用或函数

#包括
#包括
int main(){
升起(SIGBUS);
返回0;
}

如果您在Linux上,还可以利用的“写时拷贝”行为:

#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;
}
#包括
int main()
{
int pid=0,retcode=0,poof=0;
如果((pid=fork())==0){
poof=1;/*页面错误*/
}否则{
waitpid(pid和retcode,0);
}
返回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;
}
#包括
int main()
{
long pagesize=sysconf(_SC_pagesize);
unsigned char*p=malloc(pagesize+1);/*跨页面边界。根据分配器/libc实现,可能会出现页面错误*/
p[0]=0;/*页错误*/
p[pagesize]=1;/*页面错误*/
返回0;
}

通常由操作系统处理。是的,但我自己有办法处理。我只是不知道如何触发一个。@anotherCode245你如何处理它?@anotherCode245在这种情况下,我相信
mmap()
一个文件,从中读取就足够了。我可以用它处理页面错误。要在x86_64 linux系统上执行此操作。@另一个代码245请按照我回答中的链接进行操作,该页面中有一个示例。这个想法很好,但要导致页面错误,您需要访问mmap()ed区域之外的区域。如果映射尚未在TLB中,是否会触发页面错误?因此,作为对该mmap区域的第一次访问,我应该有一个页面错误,并且页面错误处理程序将该映射放在TLB中?@Bцццћ为什么“在mmap()-ed区域之外”?返回
mmap()
后,如果文件没有实际映射,尝试访问该区域将导致一些页面错误,那么操作系统将映射该文件;如果文件已经映射,那么一些页面错误已经触发。询问者需要“页面错误”,而不是“分段错误”。@leeduhem-分段错误和总线错误是页面错误的类型。