我正在开发一个LKM,并在分配之后将一个8192字节的vmalloc'ed区域归零。我知道我可以使用vzalloc(),但这让我很困惑,如果我这样做了为什么:

pmem = vmalloc(8192);
ret = safe_zero(pmem, 8192);

当它超过第2页时,虚拟机崩溃。我是说它被堵住了。SSH会话断开连接,我必须重新启动。
我不明白为什么。
safe_zero函数是:
int safe_readwrite(void *dst, void *src, size_t len) {
    size_t i = 0;
    char *cdst = dst, *csrc = src;

    pagefault_disable();
    for (; i < len; i++) {
        cdst[i] = csrc[i];
        if (cdst[i] != csrc[i]) {
            return -1;
        }
    }
    pagefault_enable();
    return 0;
}

int safe_zero(void *dst, size_t len) {
    char zero = 0;
    size_t i = 0;
    int ret = 0;
    char *cdst = dst;

    for(; i < len; i++) {
        //pinfo("writing %d byte(s) at %p\r", sizeof(zero), &cdst[i]);
        ret = safe_readwrite(&cdst[i], &zero, sizeof(zero));
        if (ret != 0) {
            return ret;
        }
    }
    //pinfo("\n");

    return 0;
}

谢谢!

最佳答案

我想那是毫无意义的错误。我测试了通过迭代来做一个伪睡眠。问题出在零点之后。我正在使用sys_write打印到stdout中,它似乎在通过SSH传输之前崩溃。
对不起的。在从分立的GPU转换到集成的GPU之前,这种情况并没有发生。

09-05 20:37