Linux kernel 用户进程的内核堆栈| Linux内核
据我所知,每个用户进程都有一个单独的内核堆栈 如何使用内核堆栈,为什么我们不能对所有用户进程使用一个堆栈? 这如何帮助我们抢占先机? 当内核在中断上下文中运行时,使用什么堆栈 [编辑:感兴趣的体系结构是x86] 如何使用此内核堆栈 例如,当usermode进程通过syscall进入内核时,就使用它。在内核内部的系统调用处理程序中,您将使用内核堆栈来处理局部变量 为什么我们不能对所有用户进程使用一个堆栈 但是怎么做呢?他们将如何在SMP系统上同时使用它?这将导致数据损坏 这如何帮助我们抢占先机 我不知道你在问什么。基本上,它与优先购买权的关系非常间接。如果您被系统计时器中断,您可能会切换到具有不同内核堆栈的不同线程。上下文可以保存在堆栈的顶部(我不确定linux是否以同样的方式实现)。linux中还有一个Linux kernel 用户进程的内核堆栈| Linux内核,linux-kernel,Linux Kernel,据我所知,每个用户进程都有一个单独的内核堆栈 如何使用内核堆栈,为什么我们不能对所有用户进程使用一个堆栈? 这如何帮助我们抢占先机? 当内核在中断上下文中运行时,使用什么堆栈 [编辑:感兴趣的体系结构是x86] 如何使用此内核堆栈 例如,当usermode进程通过syscall进入内核时,就使用它。在内核内部的系统调用处理程序中,您将使用内核堆栈来处理局部变量 为什么我们不能对所有用户进程使用一个堆栈 但是怎么做呢?他们将如何在SMP系统上同时使用它?这将导致数据损坏 这如何帮助我们抢占先机 我
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使用同样的方法,不是吗?你能设想它是如何以其他方式工作的吗?