Linux内核能否使用可分页(可交换)内存作为自己的缓冲区?

Linux内核能否使用可分页(可交换)内存作为自己的缓冲区?,linux,memory-management,paging,linux-device-driver,page-fault,Linux,Memory Management,Paging,Linux Device Driver,Page Fault,如果问题的答案是否定的,为什么这样做不是一个好主意?内核不能处理和修复内核模式下发生的页面错误吗?如果使用可分页内存的代码仅作为中断下半部分执行,答案是否会改变 谢谢 内核内存不可交换,唯一产生页面错误的内核内存是vmalloc内存 Linux内核能否使用可分页(可交换)内存作为自己的缓冲区 否。“通常,在内核模式下运行时发生的页面错误会导致内核oops。不过也有例外;在用户和内核空间之间复制数据的函数就是一个例子。”(来源:) 为什么这样做不是一个好主意 在用户空间中,您可以简单地挂起用户进程

如果问题的答案是否定的,为什么这样做不是一个好主意?内核不能处理和修复内核模式下发生的页面错误吗?如果使用可分页内存的代码仅作为中断下半部分执行,答案是否会改变


谢谢

内核内存不可交换,唯一产生页面错误的内核内存是vmalloc内存

Linux内核能否使用可分页(可交换)内存作为自己的缓冲区

否。“通常,在内核模式下运行时发生的页面错误会导致内核oops。不过也有例外;在用户和内核空间之间复制数据的函数就是一个例子。”(来源:)

为什么这样做不是一个好主意

在用户空间中,您可以简单地挂起用户进程并继续,而不会造成任何问题。但是在内核空间中,您的线程可能已经使用了许多锁,或者禁用了中断。如果您必须停止执行页面错误,则您可以选择:

1) 从磁盘加载页面时,让整个系统停止数百万条指令。这将导致糟糕的表现

2) 增加复杂性,以便在任何时候,锁/中断都可以“解除缠绕”,允许其他内核线程继续

内核不能处理和修复内核模式下发生的页面错误吗

是的,你可以有缺点,但只有特殊情况。也就是说,在调用“get_user_page”时,不允许使用锁。这使得内核可以像在用户模式下一样从任务中“切换”。如果关闭了中断或锁定,内核的其余部分将无法运行

如果使用可分页内存的代码仅作为中断下半部分执行,答案是否会改变

没有


问题的另一半是“允许调出内核会带来什么好处”?一般来说,内核内存只占总内存的一小部分。

在任何特定设备驱动程序的上下文中都会出现这个问题吗?Linux内核为应用程序提供虚拟内存,但不会自行使用。所以,不@编码员:不,一般问题适用于任何司机。@Basilestarynkevich:我知道,但问题是“为什么?”。内核可以在遇到错误时从辅助存储中获取页面,并在修复页面错误后返回到它正在执行的任何操作。我认为这将使内核的代码更加复杂,总体收益很少。这根本不值得努力。(IIRC,在20世纪90年代,一些Unix这样做了:SunOS或AIX…)内核oops:内核内存冲突导致oops,这是一个主要的内核错误。(Linux内核开发,第3版)