我正在开发一个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;
}
谢谢!
答案 0 :(得分:0)
我在想这个错误是没有意义的。我测试通过迭代来做一个伪睡眠。问题出在零之后。我使用sys_write打印到stdout,看起来它在通过SSH传输之前就崩溃了。
对不起。在从离散GPU切换到集成GPU之前,这种情况并未发生。