13.5.7 内核堆栈
进程要么运行在用户模式下,要么运行在内核模式下。当处于用户模式时,进程使用用户堆栈存储如参数、嵌套子程序的返回地址或过程这样的数据。当进程提交系统调用时,它开始在内核模式下运行。此时,内核在将执行该系统调用所需的参数传送到进程u区前,先使用自己的堆栈存储这些参数,同时也要保存该系统调用产生的结果。
内核从提交系统调用的进程的u区复制这些参数,将返回值(或是结果)和该系统调用产生的错误值传回进程的u区。因此,系统调用从u区(从用户堆栈将这些参数移动到的位置)获取参数,并将结果/错误值从系统调用再放入u区。内核借助内核堆栈执行系统调用。
因此,对每个进程而言,分别会有一个用户堆栈和内核堆栈。即使不同进程使用和共享同一个内核程序,每个进程都有自己的内核堆栈,用于存储参数值和返回地址/错误值。
内核将堆栈地址作为进程表中的指针进行维护,如图13-27所示。