【发布时间】:2011-01-17 06:35:43
【问题描述】:
进程的内核模式堆栈中存储了什么样的数据?进程“用户模式”调用链是否存储在内核堆栈中?
谢谢, 维杰
【问题讨论】:
标签: linux linux-kernel linux-device-driver
进程的内核模式堆栈中存储了什么样的数据?进程“用户模式”调用链是否存储在内核堆栈中?
谢谢, 维杰
【问题讨论】:
标签: linux linux-kernel linux-device-driver
Linux 内核本身就是一个线程程序,它通过切换堆栈来工作。
所以,假设您使用read(0, space, 100);,或者只是c = getchar();,最终会变成read()。
当 linux 获得控制权时,它将开始进行函数调用,自然会使用内核堆栈。它将使内核中的调用越来越低,直到最终到达 tty 或网络层。
但是你还没有输入任何东西!
所以它只是切换到另一个进程,一个真正可运行的进程,并将所有这些函数调用激活帧留在堆栈上。最终你输入一些东西,内核发现你的进程现在是可运行的,当它切换回来时,再次切换堆栈,所有实现你的 read(2) 的函数调用现在可以展开并最终返回到用户模式。
【讨论】:
当进程进入内核模式时使用进程的内核模式堆栈[由于系统调用或故障等异常,或由于硬件中断]。进程从进入内核模式到离开内核模式所执行的步骤序列称为内核控制路径。内核控制路径的状态信息存储在进程的内核模式堆栈中。另外,比如由于时间片过期,如果发生上下文切换,进程-cpu 寄存器的状态会存储在内核模式堆栈中,以便在进程在 cpu 上重新调度时可以检索它们。
由于内核模式堆栈仅在进入内核模式时使用,因此“用户模式”调用链不会存储在此堆栈中。
【讨论】:
This question 显示进程从用户模式转换到内核模式时存储在内核堆栈中的值
【讨论】: