免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: vupiggy
打印 上一主题 下一主题

请问:在内核模块中如何分辨某个进程是处于内核态还是用户态 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-03-12 16:15 |只看该作者
address = thread_struct ->cr2
if(address >= TASK_SIZE)
   in kernel
else
   in user

对于正在其它CPU上跑的, 如何判断?

论坛徽章:
0
12 [报告]
发表于 2009-03-12 16:26 |只看该作者
原帖由 思一克 于 2009-3-12 16:15 发表
address = thread_struct ->cr2
if(address >= TASK_SIZE)
   in kernel
else
   in user

对于正在其它CPU上跑的, 如何判断?


CR2寄存器中在发生页异常的时候存储页故障地址的, 那怎样识别系统调用的情况呢?
至于你说的正在其它CPU上跑的进程, 我觉得可以获得那个CPU上的CS寄存器来查看.
呵呵, 说得不对还请指教.

论坛徽章:
0
13 [报告]
发表于 2009-03-12 16:39 |只看该作者
Mark.

论坛徽章:
0
14 [报告]
发表于 2009-03-12 16:43 |只看该作者
你说的对. 我错的.
thread_struct->eip 可以?

原帖由 scutan 于 2009-3-12 16:26 发表


CR2寄存器中在发生页异常的时候存储页故障地址的, 那怎样识别系统调用的情况呢?
至于你说的正在其它CPU上跑的进程, 我觉得可以获得那个CPU上的CS寄存器来查看.
呵呵, 说得不对还请指教.

论坛徽章:
0
15 [报告]
发表于 2009-03-12 16:47 |只看该作者
原帖由 思一克 于 2009-3-12 16:43 发表
你说的对. 我错的.
thread_struct->eip 可以?



我觉得 EIP也不行. 因为一个进程在发生切换的时候, 都已经被中断了, 处于内核态了.
我刚才测试了一下. 对一个进程只运行
while (1) ;
然后从内核模块去查看, 这个进程的EIP仍然是大于3G的.

论坛徽章:
0
16 [报告]
发表于 2009-03-12 17:11 |只看该作者
0xc0000000 之上是内核空间。

论坛徽章:
0
17 [报告]
发表于 2009-03-12 19:11 |只看该作者

回复 #15 scutan 的帖子

我有点不明白楼主的所说的“分辨某个进程处于内核态”中的某个进程是指的任一进程吗?
如果是这样,在单cpu情况下,应该是某一时刻应该只有一个进程处于用户态。其他进程应该都在内核态吧。因为其他进程,要么是调用系统调用阻塞或时间片到被切换出去,要么是中断发生,被抢占或者时间片到被切换出去。不论哪种情况,进程都在内核太呀。

论坛徽章:
0
18 [报告]
发表于 2009-03-12 19:19 |只看该作者
原帖由 xiegang112 于 2009-3-12 19:11 发表
我有点不明白楼主的所说的“分辨某个进程处于内核态”中的某个进程是指的任一进程吗?
如果是这样,在单cpu情况下,应该是某一时刻应该只有一个进程处于用户态。其他进程应该都在内核态吧。因为其他进程,要么 ...


应该是指任一进程.

嗯. 是的, 进程在发生切换时都处于内核态.

前面albcamus也提到了, 如果不是RUNNING状态, 那么那个进程肯定是处于内核态的. 而如果该进程是RUNNING状态. 则该进程处于运行队列中. 但是有可能这个进程并没有占用CPU, 只是在那个运行队列中而已.

所以我的理解是, 楼主是不是想知道, 这个处于运行队列中的进程, 在上次被切换出去的时候, 是从哪个状态被切换出去的? 如果是用户态, 那就可能是先被中断了, 再切换出去. 如果是内核态, 那就可能是该进程先执行了系统调用, 在内核态运行时由于时间片到了, 再被切换出去的.

论坛徽章:
0
19 [报告]
发表于 2009-03-12 19:27 |只看该作者

回复 #18 scutan 的帖子

正解,我就是这么理解的。是不是楼主需要知道在被中断时(系统调用是用户主动进入内核态,所以不算),进程是否处于用户态。

论坛徽章:
0
20 [报告]
发表于 2009-03-12 21:12 |只看该作者
原帖由 xiegang112 于 2009-3-12 19:27 发表
正解,我就是这么理解的。是不是楼主需要知道在被中断时(系统调用是用户主动进入内核态,所以不算),进程是否处于用户态。


嗯. 所以我觉得可以通过查看某个进程的内核栈, 看内核栈上的相应位置保存的值是系统调用号还是(中断号-256).
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP