页面缓存和模式切换

Page Cache and Mode Switch

我读到,当执行 OS 调用时,进程只进行模式切换,而不是上下文切换。根据我的理解,这将提升进程的特权并允许它访问映射到它的虚拟地址 space 的内核代码。 (我相信这将需要使用陷阱门更改安全环)。但是,如果此 OS 调用要执行 IO,则可能需要使用页面缓存。如果没有上下文切换,这是如何发生的?或者页面缓存是否也映射到每个进程的虚拟地址space?

我上面的一些描述可能是错误的。如果我是,请纠正我。我正在尝试将其拼凑起来。另外,我对 Linux 内核更感兴趣。

一个简单的解释:

当您更改为内核模式时,页面映射不会更改。但是,内核自己的内存 space 变得可以访问(由于环的变化)。在内核模式下,仍然可以访问进程的 userspace 内存。因此,对于标准 I/O 调用,无需执行任何操作 - 可以直接访问 userspace。然而,在许多情况下,这不是一个好主意,因为传递的指针可能指向未映射的内存,或调出内存,或在调用中途消失。因此通常使用 copy_to_usercopy_from_user

可能有一些系统调用改变了内存映射。例如,fork() 创建页面映射的 CoW 副本。 exec 和朋友将页面重新映射到磁盘上的可执行文件。然而,这些是例外。

此外,系统调用可能会进行上下文切换。例如 sleep() 几乎可以保证。但是,这不是为了访问调用程序的内存。

例如,Linux/x86 通常为 userspace/kernelspace 使用 3Gb/1Gb 拆分。这意味着内核可以直接访问近 1 Gb 的物理内存。

要访问更多内存,将使用高端内存(即:反弹缓冲区)。

当然,4Gb/4Gb 拆分(可以在内核配置中配置)需要上下文切换。