Linux 内核堆栈虚拟地址

Linux 内核堆栈虚拟地址,linux,kernel,osdev,Linux,Kernel,Osdev,linux内核堆栈在每个进程上下文中是否位于相同的虚拟地址 在回答之前,请注意我指定了内核堆栈,而不是用户空间堆栈。如果您只有一个内核,那么您只需要一个内核堆栈。如果您有多个内核,那么两个或多个内核将执行内核代码,因此如果两个内核使用相同的堆栈,则会出现问题。当然,内核必须将所有堆栈映射到所有虚拟地址空间,因为不同的堆栈是每个cpu,而不是每个进程,并且一个进程可能由两个cpu不同时运行,它们需要在每个进程虚拟地址空间找到自己的堆栈。如果您只有一个内核,那么您只需要一个内核堆栈。如果您有多个内核

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


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

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

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

每个内核线程都有自己的堆栈。因为整个内核共享相同的虚拟地址空间,所以不同线程的内核堆栈应该不同。我推断所有进程内核堆栈都映射到同一个虚拟地址。同意吗?我不明白你的意思。让内核线程T1具有堆栈S1,线程T2具有堆栈S2。如果您谈论不同线程的单堆栈,那么是的,堆栈S1对于T1和T2都具有相同的虚拟地址。若你们谈论它们自己线程的堆栈地址,那个么S1的地址和S2的地址不同。好的,我试着重新解释一下。单独使用线程,并考虑在单核cpu中运行的两个进程任务—无多线程和SMP。它们在两个不同的物理地址上有两个不同的物理堆栈。我想知道物理地址是否映射到同一虚拟地址。我想知道物理地址是否映射到同一虚拟地址。-没有。正如我在第一条评论中解释的,所有内核线程都位于同一个虚拟地址空间中。在该空间中,不同的物理地址不能映射到同一虚拟地址。创建这样的地址空间是不可能的,每个内核线程都有自己的堆栈。因为整个内核共享相同的虚拟地址空间,所以不同线程的内核堆栈应该不同。我推断所有进程内核堆栈都映射到同一个虚拟地址。同意吗?我不明白你的意思。让内核线程T1具有堆栈S1,线程T2具有堆栈S2。如果您谈论不同线程的单堆栈,那么是的,堆栈S1对于T1和T2都具有相同的虚拟地址。若你们谈论它们自己线程的堆栈地址,那个么S1的地址和S2的地址不同。好的,我试着重新解释一下。单独使用线程,并考虑在单核cpu中运行的两个进程任务—无多线程和SMP。它们在两个不同的物理地址上有两个不同的物理堆栈。我想知道物理地址是否映射到同一虚拟地址。我想知道物理地址是否映射到同一虚拟地址。-没有。正如我在第一条评论中解释的,所有内核线程都位于同一个虚拟地址空间中。在该空间中,不同的物理地址不能映射到同一虚拟地址。根本不可能创建这样的地址空间。