Linux 页面缓存和模式切换

Linux 页面缓存和模式切换,linux,linux-kernel,kernel,context-switch,page-caching,Linux,Linux Kernel,Kernel,Context Switch,Page Caching,我读到,当一个操作系统调用被执行时,进程只经历一个模式切换,而不是上下文切换。据我所知,这将提高进程的权限,并允许它访问映射到其虚拟地址空间的内核代码。(我相信这需要使用陷阱门更换安全环)。但是,如果此操作系统调用要执行IO,则可能需要使用页面缓存。如果没有上下文切换,这是如何发生的?或者页缓存也映射到每个进程的虚拟地址空间 我上面的一些描述可能是错的。如果我是,请纠正我。我正试着把它拼凑起来。另外,我对Linux内核更感兴趣。一个简单的解释: 更改为内核模式时,页面映射不会更改。但是,内核自己

我读到,当一个操作系统调用被执行时,进程只经历一个模式切换,而不是上下文切换。据我所知,这将提高进程的权限,并允许它访问映射到其虚拟地址空间的内核代码。(我相信这需要使用陷阱门更换安全环)。但是,如果此操作系统调用要执行IO,则可能需要使用页面缓存。如果没有上下文切换,这是如何发生的?或者页缓存也映射到每个进程的虚拟地址空间


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

一个简单的解释:

更改为内核模式时,页面映射不会更改。但是,内核自己的内存空间变得可访问(由于环的改变)。在内核模式下,仍然可以访问进程的用户空间内存。因此,对于标准I/O调用,无需做任何事情—可以直接访问用户空间。但是,在许多情况下,这不是一个好主意,因为传递的指针可能指向未映射的内存,或调出内存,或在调用过程中消失。因此,通常使用
copy_to_user
copy_from_user

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


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

例如,Linux/x86通常使用3Gb/1Gb的用户空间/内核空间分割。这意味着内核可以直接访问接近1GB的物理内存

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


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

你说的“页面缓存”到底是什么意思?IO操作需要该缓存做什么?我只是想确保我理解你的问题。我说的是操作系统缓冲缓存。缓存将缓冲读取和写入(作为脏页)。希望有帮助。