Joh*_*n P 3 linux kernel memory virtual-memory
这是我上一个问题的后续问题。
根据答案,系统调用是我们跳转到进程虚拟内存的内核部分的一个示例。
除了系统调用之外,正常进程(非内核)使用这部分虚拟内存的其他示例还有哪些?就像有没有任何函数调用可以直接跳转到这个内核部分或者..?
当我们跳转到这部分内存时,处理器是否会自动将内核模式位设置为1以便我们的进程访问这部分内存,或者不需要设置该位?
该内核部分内部的所有执行是否都不需要上下文切换到内核进程?
(我不想在评论中提出这些后续问题,所以我打开了另一个线程。)
在用户模式下运行的进程根本无法访问内核\xe2\x80\x99s 地址空间。处理器可以通过多种方式切换到内核模式并运行内核代码,但它们都是由内核设置并在明确定义的上下文中发生:运行系统调用、响应中断或处理故障。系统调用 don\xe2\x80\x99t 涉及直接调用内核代码;它们涉及一种特定于体系结构的机制,要求 CPU 将控制权转移到内核,以代表调用进程运行由其编号标识的特定系统调用。LWN 有一系列文章解释其工作原理:系统调用剖析 第一部分、第二部分和其他内容。
\n\n如果一个进程试图访问kernel\xe2\x80\x99s地址空间中的内存,它会切换到内核模式,但是由于故障;然后,内核将因分段违规而终止该进程 ( SIGSEGV)。
在 32 位 x86 上,有一种机制可以使用远调用、调用门切换到内核模式;但 Linux 不\xe2\x80\x99 不使用它。(它们依赖于特殊的代码段描述符,而不是调用内核地址。)
参见上文:您可以\xe2\x80\x99t 跳转到内核内存。在上述情况下,当转换到内核模式时,CPU 检查是否允许转换,如果允许,则使用适合所使用的体系结构的任何机制切换到内核模式。在 x86 Linux 上,这意味着从环 3 切换到环 0。
转换到内核模式并不涉及进程的更改,所以是的,所有这一切都在没有上下文切换的情况下发生(由内核计算)。