代码之家  ›  专栏  ›  技术社区  ›  Lewis Kelsey

CPU如何定位内核堆栈,以便在中断处理期间将寄存器推送到它上面?

  •  0
  • Lewis Kelsey  · 技术社区  · 6 年前

    线程用int 80捕捉内核;中断门用于更改特权环和cs:rip;旧值被推送到“堆栈”。

    我发现这一点:

    '当线程进入内核时,用户模式堆栈(s s:esp)和指令指针(cs:eip)的当前值保存到线程的内核模式堆栈,CPU切换到内核模式堆栈-使用int$80 syscall机制,这由CPU本身完成。其余的寄存器值和标志也会保存到内核堆栈中。

    CPU如何知道线程内核模式堆栈的地址才能做到这一点?我唯一能想到的线程内核模式堆栈指针存储在TCB中的地方是,但是CPU如何知道在哪里为当前线程找到TCB。它是否指固定和已知位置的单个TCB?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Brendan    6 年前

    注意:这都是“80x86特有的”(不同的CPU,如ARM,是不同的),对于80x86,保护模式(用于32位内核)和长模式(用于64位内核)之间存在(实践中较小的)差异。

    CPU有一个任务寄存器,用来跟踪称为任务状态段的结构的(虚拟)地址。对于长模式,此结构包含在更改为更高的特权级别和使用CPU的中断堆栈表功能时加载到RSP中的值。

    当发生任何中断时,CPU从中断描述符表中的相应条目获取信息(包括确定切换到哪个特权级别以及中断是否使用中断堆栈表功能);然后(如果堆栈正在更改)使用任务状态段中的相应字段(通过找到)。任务寄存器)。 RSP .

    在引导期间,内核为CPU(IDT、TSS)创建这些数组和结构,并设置任务寄存器;在任务切换期间,内核修改 RSP0 TSS中的字段(决定加载到哪个 RSP 当CPU从较低的特权级别切换到cpl=0时,每个任务的值都不同(这样每个任务都有不同的内核堆栈)。在内部,内核将有一些其他的数据结构(“任务控制块”),用于跟踪要复制到 RSP0 任务切换期间的字段。