内核栈对应的虚拟地址是如何映射的?
Posted
技术标签:
【中文标题】内核栈对应的虚拟地址是如何映射的?【英文标题】:How are virtual addresses corresponding to kernel stack mapped? 【发布时间】:2020-09-29 16:42:18 【问题描述】:每个进程的虚拟地址空间由用户空间和内核空间组成。正如许多文章所指出的,所有进程的内核空间都映射到内存中的相同物理地址,即物理内存中只有一个内核。但是每个进程都有自己的内核栈,它是内核空间的一部分。相同的映射如何适用于具有不同内核堆栈的所有进程?
【问题讨论】:
【参考方案1】:注意:这是与操作系统无关的答案。细节确实会因所讨论的操作系统(例如 Darwin 和 continuations..)以及架构(ARMv8、x86 等)实现而略有不同。
当进程执行系统调用时,会保存用户模式状态(寄存器),包括用户模式堆栈指针。此时,内核模式堆栈指针被加载,该指针通常保存在线程控制块中的某个位置。
你说只有一个内核空间是正确的。接下来是,(理论上)内核空间中的一个线程可以很容易地看到和/或篡改内核空间中的任何其他线程(就像同一进程线程可以在用户空间中“看到”彼此一样)但是,这(几乎总是)仅在理论上,因为内核代码可能尊重内存边界(如假设用户模式所做的那样,具有线程本地存储等)。也就是说,“几乎总是”,因为如果内核代码可以被利用,那么所有内核内存都将暴露给利用者,并可能被读取和/或破坏。
【讨论】:
以上是关于内核栈对应的虚拟地址是如何映射的?的主要内容,如果未能解决你的问题,请参考以下文章