2017-04-23 97 views
0

根据我的理解,每个用户进程都有独立的内核堆栈。用户进程的内核堆栈| Linux内核

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

[编辑:感兴趣的结构是86]

回答

2

如何这个内核栈用于

它用于例如当用户模式过程中,通过系统调用进入内核。在内核的系统调用处理程序中,您将使用内核堆栈来存储局部变量。

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

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

这是如何帮助我们抢占?

我不确定你在问什么。基本上它与非常间接的抢先有关。如果你被系统定时器中断,你可能会切换到不同内核堆栈的不同线程。上下文可以保存在堆栈的顶部(我不确定是否以相同的方式实现它)。 Linux中还有一个preempt_counter的东西,放在内核堆栈的顶部。该变量可以增加/减少preempt_disable(enable)。什么意思是内核线程抢占switched off/on。它被广泛使用f.e.通过spinlocks

当内核在中断环境中运行时,使用了什么栈?

当我们从用户去 - >内核在这种情况下,下面是发生了:

  1. 内核栈。处理器切换到由TSSSS0ESP0字段定义的此堆栈。
  2. 处理器推动内核栈上的异常参数

      +--------------------+ KSTACKTOP    
         | 0x00000 | old SS |  " - 4 
         |  old ESP  |  " - 8 
         |  old EFLAGS  |  " - 12 
         | 0x00000 | old CS |  " - 16 
         |  old EIP  |  " - 20 <---- ESP 
         +--------------------+    
    
  3. 处理器读取IDT入口N(取决于哪个IRQ或异常出现),并且将CS:EIP以指向所描述的处理函数入口。

  4. 处理函数接受控制并处理异常。

来源:https://pdos.csail.mit.edu/6.828/2016/labs/lab3/

+0

审查您所提供的链接后,我怀疑你没有听明白我的问题, 此外,你可以清楚地看到你的情况是存在的内核中只有一个堆所有进程。 这个问题是特定于Linux内核的。 –

+0

TSS段在上下文切换期间发生更改,因此每个进程都有不同的TSS(这意味着不同的堆栈)。我认为Linux使用相同的方法,不是吗?你能否以其他方式假设它是如何工作的? –