【问题标题】:How are virtual addresses corresponding to kernel stack mapped?内核栈对应的虚拟地址是如何映射的?
【发布时间】:2020-09-29 16:42:18
【问题描述】:

每个进程的虚拟地址空间由用户空间和内核空间组成。正如许多文章所指出的,所有进程的内核空间都映射到内存中的相同物理地址,即物理内存中只有一个内核。但是每个进程都有自己的内核栈,它是内核空间的一部分。相同的映射如何适用于具有不同内核堆栈的所有进程?

【问题讨论】:

    标签: process kernel virtual-address-space


    【解决方案1】:

    注意:这是与操作系统无关的答案。细节确实会因所讨论的操作系统(例如 Darwin 和 continuations..)以及架构(ARMv8、x86 等)实现而略有不同。

    当进程执行系统调用时,会保存用户模式状态(寄存器),包括用户模式堆栈指针。此时,内核模式堆栈指针被加载,该指针通常保存在线程控制块中的某个位置。

    你说只有一个内核空间是正确的。接下来是,(理论上)内核空间中的一个线程可以很容易地看到和/或篡改内核空间中的任何其他线程(就像同一进程线程可以在用户空间中“看到”彼此一样)但是,这(几乎总是)仅在理论上,因为内核代码可能尊重内存边界(如假设用户模式所做的那样,具有线程本地存储等)。也就是说,“几乎总是”,因为如果内核代码可以被利用,那么所有内核内存都将暴露给利用者,并可能被读取和/或破坏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2015-05-24
      • 2019-01-08
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多