Linux kernel 用户进程的内核堆栈| Linux内核

Linux kernel 用户进程的内核堆栈| Linux内核,linux-kernel,Linux Kernel,据我所知,每个用户进程都有一个单独的内核堆栈 如何使用内核堆栈,为什么我们不能对所有用户进程使用一个堆栈? 这如何帮助我们抢占先机? 当内核在中断上下文中运行时,使用什么堆栈 [编辑:感兴趣的体系结构是x86] 如何使用此内核堆栈 例如,当usermode进程通过syscall进入内核时,就使用它。在内核内部的系统调用处理程序中,您将使用内核堆栈来处理局部变量 为什么我们不能对所有用户进程使用一个堆栈 但是怎么做呢?他们将如何在SMP系统上同时使用它?这将导致数据损坏 这如何帮助我们抢占先机 我

据我所知,每个用户进程都有一个单独的内核堆栈

如何使用内核堆栈,为什么我们不能对所有用户进程使用一个堆栈? 这如何帮助我们抢占先机? 当内核在中断上下文中运行时,使用什么堆栈

[编辑:感兴趣的体系结构是x86]

如何使用此内核堆栈

例如,当usermode进程通过syscall进入内核时,就使用它。在内核内部的系统调用处理程序中,您将使用内核堆栈来处理局部变量

为什么我们不能对所有用户进程使用一个堆栈

但是怎么做呢?他们将如何在SMP系统上同时使用它?这将导致数据损坏

这如何帮助我们抢占先机

我不知道你在问什么。基本上,它与优先购买权的关系非常间接。如果您被系统计时器中断,您可能会切换到具有不同内核堆栈的不同线程。上下文可以保存在堆栈的顶部(我不确定linux是否以同样的方式实现)。linux中还有一个
preempt\u计数器
,它位于内核堆栈的顶部。此变量可以通过
抢占\u禁用(启用)
递增/递减。内核线程抢占
关闭/打开
意味着什么。它被
旋转锁
广泛用于f.e

当内核在中断上下文中运行时,使用什么堆栈

在这种情况下,当我们从user->kernel进入时,会发生以下情况:

  • 使用内核堆栈。处理器切换到此堆栈,该堆栈由的
    SS0
    ESP0
    字段定义
  • 处理器将异常参数推送到内核堆栈上

             +--------------------+ KSTACKTOP             
             | 0x00000 | old SS   |     " - 4
             |      old ESP       |     " - 8
             |     old EFLAGS     |     " - 12
             | 0x00000 | old CS   |     " - 16
             |      old EIP       |     " - 20 <---- ESP 
             +--------------------+             
    
    +-------------+KSTACKTOP
    |0x00000 |旧SS |“-4
    |旧ESP |“-8
    |老埃夫拉格|“-12
    |0x00000 |旧CS |“-16
    |旧EIP |“-20
    如何使用此内核堆栈

    例如,当usermode进程通过syscall进入内核时,就使用它。在内核内部的syscall处理程序中,您将使用内核堆栈作为局部变量

    为什么我们不能对所有用户进程使用一个堆栈

    但是如何?他们将如何在SMP系统上同时使用它?这将导致数据损坏

    这如何帮助我们抢占先机

    我不知道你在问什么。基本上它与抢占非常间接地有关。如果你被系统计时器打断,你可能会切换到具有不同内核堆栈的不同线程。上下文可能保存在该堆栈的顶部(我不确定linux是否以同样的方式实现)。在linux中还有一个
    preempt\u计数器
    放在内核堆栈的顶部。这个变量可以通过
    preempt\u disable(enable)
    递增/递减。这意味着内核线程抢占
    关闭/打开
    。它被
    自旋锁广泛使用

    当内核在中断上下文中运行时,使用什么堆栈

    在这种情况下,当我们从user->kernel进入时,会发生以下情况:

  • 使用内核堆栈。处理器切换到此堆栈,该堆栈由的
    SS0
    ESP0
    字段定义
  • 处理器将异常参数推送到内核堆栈上

             +--------------------+ KSTACKTOP             
             | 0x00000 | old SS   |     " - 4
             |      old ESP       |     " - 8
             |     old EFLAGS     |     " - 12
             | 0x00000 | old CS   |     " - 16
             |      old EIP       |     " - 20 <---- ESP 
             +--------------------+             
    
    +-------------+KSTACKTOP
    |0x00000 |旧SS |“-4
    |旧ESP |“-8
    |老埃夫拉格|“-12
    |0x00000 |旧CS |“-16
    
    |旧EIP |“-20在查看您提供的链接后,我怀疑您没有完全理解我的问题,而且,您可以清楚地看到,在您的情况下,内核中只有一个堆栈用于所有进程。这个问题是针对Linux内核的。TSS段在上下文切换过程中会发生更改,因此每个进程都有不同的TSS(这意味着不同的堆栈)。我认为Linux使用同样的方法,不是吗?你能设想一下它是如何工作的吗?在查看了你提供的链接之后,我怀疑你没有完全理解我的问题,而且,你可以清楚地看到,在你的例子中,内核中只有一个堆栈用于所有进程。这个问题是针对Linux内核的。TSS段在上下文切换过程中会发生更改,因此每个进程都有不同的TSS(这意味着不同的堆栈)。我认为Linux使用同样的方法,不是吗?你能设想它是如何以其他方式工作的吗?