【问题标题】:Kernel Stack Virtual Address内核栈虚拟地址
【发布时间】:2018-02-23 04:57:52
【问题描述】:

linux 内核栈在每个进程上下文中是否位于相同的虚拟地址?

在回答之前,请注意我已经指定了内核堆栈而不是用户空间堆栈。

【问题讨论】:

  • 每个内核线程都有自己的堆栈。由于整个内核共享相同的虚拟地址空间,因此不同线程的内核堆栈应该不同。
  • 假设我有一个单线程 CPU。我推断所有进程内核堆栈都映射到相同的虚拟地址。同意吗?
  • 不懂你。让内核线程T1有栈S1,线程T2有栈S2。如果您谈论不同线程的单个堆栈,那么是的,堆栈S1对于T1T2。如果您谈论他们自己线程的堆栈地址,那么S1的地址与S2之一不同。
  • 好的,我尝试重新阐述。单独生活线程并考虑在单个核心 cpu 中运行的两个进程(任务)(没有多线程,也没有 SMP)。它们在两个不同的物理地址有两个不同的物理堆栈。我想知道物理地址是否映射到相同的虚拟地址。
  • I was wondering if the physical addresses are mapped to the same virtual address. - 不。正如我在第一条评论中解释的那样,所有内核线程都存在于相同的虚拟地址空间中。在那个空间内,不同的物理地址不能映射到同一个虚拟地址。根本不可能创建这样的地址空间。

标签: linux kernel osdev


【解决方案1】:

如果您只有一个内核,那么您只需要一个内核堆栈。如果您有多个内核,则可能有两个或更多内核执行内核代码,因此如果两个内核使用相同的堆栈,则会出现问题。当然,内核必须将所有堆栈映射到所有虚拟地址空间,因为不同的堆栈是每个 cpu 而不是每个进程,一个进程可能由两个 cpu 运行(不是同一时间),他们需要在每个进程的虚拟地址空间中找到他的自己的堆栈。

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2012-02-01
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2018-07-09
    • 2012-01-18
    相关资源
    最近更新 更多