如果问题的答案是否定的,为什么这样做不是一个好主意?内核不能处理和修复内核模式下发生的页面错误吗?如果使用可分页内存的代码仅作为中断下半部分的一部分执行,答案是否会改变?
谢谢!
如果问题的答案是否定的,为什么这样做不是一个好主意?内核不能处理和修复内核模式下发生的页面错误吗?如果使用可分页内存的代码仅作为中断下半部分的一部分执行,答案是否会改变?
谢谢!
Linux 内核可以为自己的缓冲区使用可分页(可交换)内存吗?
“通常,在内核模式下运行时发生的页面错误会导致内核 oops。不过也有例外;在用户空间和内核空间之间复制数据的函数就是一个例子。” (来源:https ://lwn.net/Articles/270339/ )
为什么这样做不是一个好主意?
在用户空间中,您可以简单地暂停用户进程并继续前进,而不会造成任何问题。但是在内核空间中,您的线程可能已经占用了很多锁,或者禁用了中断。如果你不得不停下来处理页面错误,那么你有一个选择:
1)让整个系统在从磁盘加载该页面时停止数百万条指令。这将导致糟糕的表现。
2)增加复杂性,以便在任何时候,锁/中断都可以“解开”,允许其他内核线程继续进行。
内核不能处理和修复内核模式下发生的页面错误吗?
是的,您可能有故障,但仅限于特殊情况。即调用“get_user_page”时不允许有锁。这让内核“切换”离开任务,就好像它处于用户模式一样。如果您关闭了中断或取出锁,内核的其余部分将无法运行。
如果使用可分页内存的代码仅作为中断下半部分的一部分执行,答案是否会改变?
不。
问题的另一半是“通过允许内核被分页,你有什么收获”?通常,内核内存只是整体内存的一小部分。
内核内存不能交换,唯一产生页面错误的内核内存是vmalloc内存