0%

用户栈与内核栈

从用户态到内核态的本质

最近在重温Linux内核相关的内容,当看到用户进程通过系统调用陷入内核态时,对进程由用户态
切换到内核态过程的本质产生了疑惑,原来这和进程的用户栈与内核栈直接相关。

在进程创建时,进程的task_struct和相应的堆栈会被同时创建;每个进程都有2个栈:

  • 用户栈,位于用户空间
  • 内核栈,位于内核空间

当进程运行于用户态时,CPU堆栈寄存器存放的是用户栈地址,使用用户栈和用户虚拟地址空间;
当进程运行于内核态时,CPU堆栈寄存器存放的是内核栈地址,使用内核栈和内核地址空间;

当进程因为系统调用或中断进入内核态时,进程使用的栈从用户栈切换到内核栈;进程陷入内核态后,
先把用户栈地址保存到内核栈中,然后设置CPU堆栈寄存器内容为内核栈的地址,这样就完成了用户栈
到内核栈的转换。

当进程从内核态恢复到用户态时,把内核中保护的用户栈地址恢复到堆栈指针寄存器即可;这样就完成了
内核栈到用户栈的转换。

因此,堆栈指针寄存器在进程切换以及内核态切换中都扮演着核心作用。需要继续加深理解。