CPU 如何定位内核堆栈以便在中断处理期间将寄存器压入其中?
How does the CPU locate the kernel stack in order to push registers onto it during interrupt handling?
一个线程用 INT 80 陷入内核;中断门用于改变特权环和CS:RIP;旧值被推送到 'stack'.
我发现了这个:
'When a thread enters the kernel, the current value of the user-mode stack (SS:ESP) and instruction pointer (CS:EIP) are saved to the thread's kernel-mode stack, and the CPU switches to the kernel-mode stack - with the int syscall mechanism, this is done by the CPU itself. The remaining register values and flags are then also saved to the kernel stack.'
CPU 如何知道线程的内核模式堆栈的地址以便执行此操作?我唯一能想到的存储线程的内核模式堆栈指针的地方是在 TCB 中,但是 CPU 如何知道将当前线程的 TCB 定位到哪里。它指的是固定且已知位置的单个 TCB 吗?
注意:这都是“特定于 80x86”(不同的 CPU,如 ARM,是不同的),对于 80x86,保护模式(在实践中很小)之间存在差异(用于 32 位内核)和长模式(用于 64 位内核)。
CPU 有一个任务寄存器,用于跟踪称为任务状态段的结构的(虚拟)地址。对于长模式;此结构包含在更改为更高权限级别和使用 CPU 的中断堆栈 Table 功能时加载到 RSP 中的值。
当任何中断发生时,CPU从中断描述符Table中的相应条目获取信息(包括确定要切换到哪个特权级别以及中断是否正在使用中断堆栈Table 特征);然后(如果堆栈正在更改)使用任务状态段中的适当字段(通过任务寄存器找到)来确定要加载到 RSP
.
中的内容
在引导期间,内核为 CPU(IDT、TSS)创建这些数组和结构并设置任务寄存器;在任务切换期间,内核修改 TSS 中的 RSP0
字段(当 CPU 从较低特权级别切换到 CPL=0 时,它决定加载到 RSP
中的内容)以便它是每个任务的不同值(这样每个任务都有不同的内核堆栈)。在内核内部会有一些其他数据结构 ("task control block") 跟踪在任务切换期间复制到 RSP0
字段的值。
一个线程用 INT 80 陷入内核;中断门用于改变特权环和CS:RIP;旧值被推送到 'stack'.
我发现了这个:
'When a thread enters the kernel, the current value of the user-mode stack (SS:ESP) and instruction pointer (CS:EIP) are saved to the thread's kernel-mode stack, and the CPU switches to the kernel-mode stack - with the int syscall mechanism, this is done by the CPU itself. The remaining register values and flags are then also saved to the kernel stack.'
CPU 如何知道线程的内核模式堆栈的地址以便执行此操作?我唯一能想到的存储线程的内核模式堆栈指针的地方是在 TCB 中,但是 CPU 如何知道将当前线程的 TCB 定位到哪里。它指的是固定且已知位置的单个 TCB 吗?
注意:这都是“特定于 80x86”(不同的 CPU,如 ARM,是不同的),对于 80x86,保护模式(在实践中很小)之间存在差异(用于 32 位内核)和长模式(用于 64 位内核)。
CPU 有一个任务寄存器,用于跟踪称为任务状态段的结构的(虚拟)地址。对于长模式;此结构包含在更改为更高权限级别和使用 CPU 的中断堆栈 Table 功能时加载到 RSP 中的值。
当任何中断发生时,CPU从中断描述符Table中的相应条目获取信息(包括确定要切换到哪个特权级别以及中断是否正在使用中断堆栈Table 特征);然后(如果堆栈正在更改)使用任务状态段中的适当字段(通过任务寄存器找到)来确定要加载到 RSP
.
在引导期间,内核为 CPU(IDT、TSS)创建这些数组和结构并设置任务寄存器;在任务切换期间,内核修改 TSS 中的 RSP0
字段(当 CPU 从较低特权级别切换到 CPL=0 时,它决定加载到 RSP
中的内容)以便它是每个任务的不同值(这样每个任务都有不同的内核堆栈)。在内核内部会有一些其他数据结构 ("task control block") 跟踪在任务切换期间复制到 RSP0
字段的值。