根据我的理解,每个用户进程都有独立的内核堆栈。用户进程的内核堆栈| Linux内核
如何使用这个内核堆栈,为什么我们不能只为所有用户进程使用一个堆栈? 这是如何帮助我们抢占? 当内核在中断上下文中运行时,使用了什么栈?
[编辑:感兴趣的结构是86]
根据我的理解,每个用户进程都有独立的内核堆栈。用户进程的内核堆栈| Linux内核
如何使用这个内核堆栈,为什么我们不能只为所有用户进程使用一个堆栈? 这是如何帮助我们抢占? 当内核在中断上下文中运行时,使用了什么栈?
[编辑:感兴趣的结构是86]
如何这个内核栈用于
它用于例如当用户模式过程中,通过系统调用进入内核。在内核的系统调用处理程序中,您将使用内核堆栈来存储局部变量。
为什么我们不能为所有用户进程使用一个堆栈?
但是怎么样?他们将如何在SMP系统上同时使用它?这将导致数据损坏。
这是如何帮助我们抢占?
我不确定你在问什么。基本上它与非常间接的抢先有关。如果你被系统定时器中断,你可能会切换到不同内核堆栈的不同线程。上下文可以保存在堆栈的顶部(我不确定是否以相同的方式实现它)。 Linux中还有一个preempt_counter
的东西,放在内核堆栈的顶部。该变量可以增加/减少preempt_disable(enable)
。什么意思是内核线程抢占switched off/on
。它被广泛使用f.e.通过spinlocks
。
当内核在中断环境中运行时,使用了什么栈?
当我们从用户去 - >内核在这种情况下,下面是发生了:
SS0
和ESP0
字段定义的此堆栈。处理器推动内核栈上的异常参数
+--------------------+ KSTACKTOP
| 0x00000 | old SS | " - 4
| old ESP | " - 8
| old EFLAGS | " - 12
| 0x00000 | old CS | " - 16
| old EIP | " - 20 <---- ESP
+--------------------+
处理器读取IDT入口N(取决于哪个IRQ或异常出现),并且将CS:EIP以指向所描述的处理函数入口。
审查您所提供的链接后,我怀疑你没有听明白我的问题, 此外,你可以清楚地看到你的情况是存在的内核中只有一个堆所有进程。 这个问题是特定于Linux内核的。 –
TSS段在上下文切换期间发生更改,因此每个进程都有不同的TSS(这意味着不同的堆栈)。我认为Linux使用相同的方法,不是吗?你能否以其他方式假设它是如何工作的? –