我正在开发一个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之前,这种情况并没有发生。