页面缓存和模式切换

时间:2015-02-02 20:26:03

标签: linux linux-kernel kernel context-switch page-caching

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

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

2 个答案:

答案 0 :(得分:1)

简化说明:

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

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

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

答案 1 :(得分:1)

作为示例,Linux / x86通常使用3Gb / 1Gb拆分用于用户空间/内核空间。这意味着内核可以直接访问几乎1 Gb的物理内存。

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

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