原帖由 albcamus 于 2009-3-12 11:19 发表
因为是在内核里判断, 所以根本不需要判断当前cpu的runlevel -- 必定是ring0。
楼主估计是要对所有的task都判断一下, 也可能是RUNNING态的task都判断一下。 不管怎样,处于睡眠态的也不需要判断, 因为 ...
原帖由 scutan 于 2009-3-12 12:50 发表
我觉得应该是看进程的thread_struct结构中的内容吧. 因为那个tss_struct是针对CPU的, 不是针对某个进程的.
说得不对还请指教.
原帖由 思一克 于 2009-3-12 16:15 发表
address = thread_struct ->cr2
if(address >= TASK_SIZE)
in kernel
else
in user
对于正在其它CPU上跑的, 如何判断?
原帖由 scutan 于 2009-3-12 16:26 发表
CR2寄存器中在发生页异常的时候存储页故障地址的, 那怎样识别系统调用的情况呢?
至于你说的正在其它CPU上跑的进程, 我觉得可以获得那个CPU上的CS寄存器来查看.
呵呵, 说得不对还请指教.
原帖由 xiegang112 于 2009-3-12 19:11 发表
我有点不明白楼主的所说的“分辨某个进程处于内核态”中的某个进程是指的任一进程吗?
如果是这样,在单cpu情况下,应该是某一时刻应该只有一个进程处于用户态。其他进程应该都在内核态吧。因为其他进程,要么 ...
原帖由 scutan 于 2009-3-12 12:19 发表
所以我的理解是, 楼主是不是想知道, 这个处于运行队列中的进程, 在上次被切换出去的时候, 是从哪个状态被切换出去的? 如果是用户态, 那就可能是先被中断了, 再切换出去. 如果是内核态, 那就可能是该进程先执行了系统调用, 在内核态运行时由于时间片到了, 再被切换出去的.
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |