内核栈对应的虚拟地址是如何映射的?
How are virtual addresses corresponding to kernel stack mapped?
每个进程的虚拟地址space包括用户space和内核space。正如许多文章指出的那样,所有进程的内核 space 都映射到内存中的同一物理地址,即物理内存中只有一个内核。但是每个进程都有自己的内核堆栈,它是内核的一部分space。相同的映射如何适用于具有不同内核堆栈的所有进程?
注意:这是 OS 不可知论者的答案。细节确实与 OS 有问题(例如达尔文和延续......),并且可能与架构(ARMv8,x86 等)实现略有不同。
当进程执行系统调用时,用户模式状态(寄存器)被保存,包括用户模式堆栈指针。在那一点上,一个内核模式堆栈指针被加载,它通常被维护在线程控制块的某个地方。
你说只有一个内核是正确的space。接下来是,(理论上)内核 space 中的一个线程可以很容易地看到 and/or 篡改内核 space 中的任何其他线程(就像相同的进程线程可以 "see" 每个other in user space) 然而,这(几乎总是)只是理论上的,因为内核代码可能会遵守内存边界(就像假设的用户模式一样,具有线程本地存储等)。也就是说,"almost always",因为如果内核代码可以被利用,那么所有内核内存都将暴露给利用者,并可能读取 and/or 受损。
每个进程的虚拟地址space包括用户space和内核space。正如许多文章指出的那样,所有进程的内核 space 都映射到内存中的同一物理地址,即物理内存中只有一个内核。但是每个进程都有自己的内核堆栈,它是内核的一部分space。相同的映射如何适用于具有不同内核堆栈的所有进程?
注意:这是 OS 不可知论者的答案。细节确实与 OS 有问题(例如达尔文和延续......),并且可能与架构(ARMv8,x86 等)实现略有不同。
当进程执行系统调用时,用户模式状态(寄存器)被保存,包括用户模式堆栈指针。在那一点上,一个内核模式堆栈指针被加载,它通常被维护在线程控制块的某个地方。
你说只有一个内核是正确的space。接下来是,(理论上)内核 space 中的一个线程可以很容易地看到 and/or 篡改内核 space 中的任何其他线程(就像相同的进程线程可以 "see" 每个other in user space) 然而,这(几乎总是)只是理论上的,因为内核代码可能会遵守内存边界(就像假设的用户模式一样,具有线程本地存储等)。也就是说,"almost always",因为如果内核代码可以被利用,那么所有内核内存都将暴露给利用者,并可能读取 and/or 受损。