将vmalloc区域归零时Linux崩溃

时间:2018-01-31 02:46:57

标签: linux memory module linux-kernel dynamic-memory-allocation

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

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

当它超过第二页时,VM崩溃了。我的意思是它被封锁了。 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;
}

谢谢!

1 个答案:

答案 0 :(得分:0)

我在想这个错误是没有意义的。我测试通过迭代来做一个伪睡眠。问题出在零之后。我使用sys_write打印到stdout,看起来它在通过SSH传输之前就崩溃了。

对不起。在从离散GPU切换到集成GPU之前,这种情况并未发生。