我读到,当执行操作系统调用时,进程仅经历模式切换,而不是上下文切换。根据我的理解,这将提升进程的特权并允许它访问映射到其虚拟地址空间的内核代码。 (我相信这需要使用陷阱门更换安全环)。但是,如果此操作系统调用要执行 IO,则可能需要使用页面缓存。如果没有上下文切换,这是如何发生的?或者页面缓存也映射到每个进程的虚拟地址空间?
我上面的一些描述可能是错误的。如果我是的话请纠正我。我正在尝试将其拼凑起来。另外,我对Linux内核更感兴趣。
最佳答案
简单的解释:
当您更改为内核模式时,页面映射不会更改。但是,内核自己的内存空间变得可以访问(由于环更改)。当处于内核模式时,仍然可以访问进程的用户空间内存。因此,对于标准 I/O 调用,无需执行任何操作 - 用户空间可以直接访问。然而,在许多情况下,这不是一个好主意,因为传递的指针可能指向未映射的内存、或调出的内存、或在调用过程中消失。因此,通常使用 copy_to_user
和 copy_from_user
。
可能有一些系统调用会更改内存映射。例如,fork()
创建页面映射的 CoW 副本。 exec
和 friend 将页面重新映射到磁盘上的可执行文件。然而,这些都是异常(exception)。
此外,系统调用可能会进行上下文切换。例如,sleep()
几乎可以保证。但是,这并不是为了访问调用程序的内存。
关于linux - 页面缓存和模式切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28286116/