linux - 页面缓存和模式切换

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

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

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

最佳答案

简单的解释:

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

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

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

关于linux - 页面缓存和模式切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28286116/

相关文章:

c - 为什么 mmap() 会因文件复制程序的目标文件的权限被拒绝而失败?

linux - 使用 Centos Linux、8GB PAE 和 MySQL 5.0.77 时严重的 mysqldump 性能下降

linux - 一些内核ARM代码

linux - 如何在不运行 uname 或 proc/version 的情况下找到正在运行的内核版本?

c - 在没有先调用 munmap() 的情况下关闭文件描述符后,mmap() 指针的行为是什么?

linux - 使用 shell 脚本从 pstree 获取指定进程名称的 pid

使用链接器部分创建全局注册表

c - 如何在 Linux 内核空间使用 ioctl()?

linux - 为什么 sk_buff 没有 spin_lock 或 mutex

c - Linux内核的ip_output.c中的简单内存malloc和free