- 论坛徽章:
- 0
|
原帖由 scutan 于 2009-3-12 12:19 发表 ![]()
所以我的理解是, 楼主是不是想知道, 这个处于运行队列中的进程, 在上次被切换出去的时候, 是从哪个状态被切换出去的? 如果是用户态, 那就可能是先被中断了, 再切换出去. 如果是内核态, 那就可能是该进程先执行了系统调用, 在内核态运行时由于时间片到了, 再被切换出去的.
大致是这个意思,但未必是指``上次''被切换出去的进程,也可以是正在运行于某个cpu上的进程(smp 系统),也就是所有处于 RUNNING 状态的进程,无论当前是否在 CPU 上,都需要知道它``当前'' (如果被切换,就是被切换前) 处于内核态还是用户态。
EIP 看来是不可行了。
albcamus 的一个建议:``当前tss_struct里的东西就是保存在其thread_struct里的''感觉可行,不过我没找到在 thread_struct 的哪个成员反映了这个进程被切换前所处的是内核态还是用户态。
scutan 的建议:``查看某个进程的内核栈, 看内核栈上的相应位置保存的值是系统调用号还是(中断号-256)'' 这个比较直观,直接可以得到内核栈的地址,问题是然后呢? ... 内核栈的什么位置是存放系统调用号或是中断号的?如果不总是在固定位置,或者这个位置因内核版本是会改动的,那么这个方案还是有点 hackish,是吧?
请大家继续支招,多谢多谢! |
|