免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2009-03-13 02:32 |只看该作者
原帖由 scutan 于 2009-3-12 12:19 发表
所以我的理解是, 楼主是不是想知道, 这个处于运行队列中的进程, 在上次被切换出去的时候, 是从哪个状态被切换出去的? 如果是用户态, 那就可能是先被中断了, 再切换出去. 如果是内核态, 那就可能是该进程先执行了系统调用, 在内核态运行时由于时间片到了, 再被切换出去的.


大致是这个意思,但未必是指``上次''被切换出去的进程,也可以是正在运行于某个cpu上的进程(smp 系统),也就是所有处于 RUNNING 状态的进程,无论当前是否在 CPU 上,都需要知道它``当前'' (如果被切换,就是被切换前) 处于内核态还是用户态。

EIP 看来是不可行了。

albcamus 的一个建议:``当前tss_struct里的东西就是保存在其thread_struct里的''感觉可行,不过我没找到在 thread_struct 的哪个成员反映了这个进程被切换前所处的是内核态还是用户态。

scutan 的建议:``查看某个进程的内核栈, 看内核栈上的相应位置保存的值是系统调用号还是(中断号-256)'' 这个比较直观,直接可以得到内核栈的地址,问题是然后呢? ... 内核栈的什么位置是存放系统调用号或是中断号的?如果不总是在固定位置,或者这个位置因内核版本是会改动的,那么这个方案还是有点 hackish,是吧?

请大家继续支招,多谢多谢!

论坛徽章:
0
22 [报告]
发表于 2009-03-13 15:01 |只看该作者
mark,学习

论坛徽章:
0
23 [报告]
发表于 2010-03-18 22:50 |只看该作者
这是在内核2.6.16.2看到的代码,不知道有没有帮助
144ret_from_intr:
145        GET_THREAD_INFO(%ebp)
146        movl EFLAGS(%esp), %eax         # mix EFLAGS and CS
147        movb CS(%esp), %al
148        testl $(VM_MASK | 3), %eax
149        jz resume_kernel

论坛徽章:
0
24 [报告]
发表于 2010-03-18 23:23 |只看该作者
帖子太长了,也没细看大家说的。
如果我来做的话,想到的一个比较简单的是看这个进程的esp指向的是内核栈还是用户栈。指向内核栈就在内核中,反之亦然。
当然有一个问题就是在多核情况下,你是无法判定准的,因为很可能你判定的时刻它是在内核态的,但当你要做什么操作时,它已经回到用户态了

论坛徽章:
0
25 [报告]
发表于 2010-03-19 08:26 |只看该作者
问题是,(在SMP中)所有的进程状态都是在不断变化的,你这个遍历过程中,系统状态已经发生了很多变化。记录系统某一时刻状态的意义是什么呢?观察观察还可以,没什么附加操作可以做
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP