免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3879 | 回复: 10

[进程管理] 如何理解内核线程执行在用户模式下,什么样的情景会用到? [复制链接]

论坛徽章:
1
技术图书徽章
日期:2013-09-17 09:11:51
发表于 2014-10-29 16:19 |显示全部楼层
文档上的一段话
  1. “A kernel thread runs in user mode environment when executing user functions or library calls”
复制代码
,这里应该怎么理解,哪种情形会用到,是在系统初始化的时候,内核调用init来初始化用户数据?


在用户模式要访问内核数据是通过系统调用这个中转,那么系统调用能作为内核到用户的中转吗?(使内核再次陷入内核态?)

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
发表于 2014-10-29 21:18 |显示全部楼层

就是系统调用的时候。

论坛徽章:
1
技术图书徽章
日期:2013-09-17 09:11:51
发表于 2014-10-30 09:41 |显示全部楼层
是说内核里的线程也可以使用系统调用吗?
还是说用户使用系统调用,当在内核的时候相当于内核线程来执行用户的function或者lib,但这时候的内核线程执行的环境应该是内核态,不是用户态。存疑。

能否详解下!
回复 2# wait_rabbit


   

论坛徽章:
0
发表于 2014-10-30 11:57 |显示全部楼层
回复 1# jonas_mao
ksoftirqd 就是一个内核线程
负责维护软件中断重新触发的软中断  和 用户进程之间的调度。保证软中断过多时,用户进程也能得到调度

只所以ksoftirqd运行在 进程上下文,是因为进程才有调度的概念。中断没有调度的概念。比如你在一个中断中发生调度了,那么就回不去了。因为中断状态cpu没有保存任何id相关信息。但进程调度前 会 保存进程id以及寄存器等环境状态

只所以运行在内核态而不是用户态。是因为只有运行在内核态才能访问 内核空间。用户态无法访问内核空间
但与一般进程通过系统调用进入内核态不一样的是。进程通过系统调用进入内核态后,可以访问用户空间和内核空间。
但是内核态线程仅仅只能访问内核空间

   

论坛徽章:
1
技术图书徽章
日期:2013-09-17 09:11:51
发表于 2014-10-30 17:03 |显示全部楼层
抱歉现在才看到,你说的进程通过系统调用进入内核态,可以访问用户数据和内核数据,这里是通过哪种方式访问用户数据的,是系统调用所带的参数?

你说的ksoftirqd 是在调度用户进程的时候进入user mode 吗?
回复 4# yimeng4a309


   

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
发表于 2014-10-30 18:10 |显示全部楼层
回复 1# jonas_mao


    内核线程可以通过call_usermodehelper()函数调用应用层的程序,有一个场景是cgroup需要调用应用层程序cgroup release agent程序

论坛徽章:
0
发表于 2014-10-31 10:15 |显示全部楼层
回复 5# jonas_mao
你说的进程通过系统调用进入内核态,可以访问用户数据和内核数据,这里是通过哪种方式访问用户数据的,是系统调用所带的参数?
很多系统调用是封装好的。具体的方式可以自己上网搜索下。关键看你的需求。如insmod 就可以通过参数传递给内核
一般自己传递数据给内核常用的系统调用有,socket 和ioctl。ioctl是同步通信方式,应用层和内核交互时需阻塞,对应的数据传递接口是在内核 使用 copy_from_user和copy_to_user
来访问用户空间数据
当然现在内核普遍喜欢使用的 传递方式是基于socket的netlink。netlink可以实现内核主动通知 应用,和应用主动通知内核的异步通信方式,而且接口跟socket编程差不多。经过实测netlink内核端使用的锁跟进程上下文使用的锁一致。不过netlink虽然工作在进程上下文,但应该不属于系统调用。这个还好等后面有空详细研究下


你说的ksoftirqd 是在调度用户进程的时候进入user mode 吗?
ksoftirqd 一直工作在 核心态。不过属于进程上下文。这个你必须搞清楚。
用户态 和 核心态 是一个对应关系。
中断上下文 和 进程上下文是一个关系。
应用通过系统调用进入核心态。但属于进程上下文
中断-软中断-启动内核线程(常见的为工作队列) 。内核线程就工作在核心态 但属于进程上下文。只不过它的进程表示符为NULL
一般情况下 要区分的是 中断上下文 和 进程上下文。因为 中断上下文不会被打断,所以不允许睡眠,万一睡眠了内核就死在这里了,cpu不会让权啊。所以使用锁要特别注意。如mutex 和 down等是无法在中断上下文使用的。中断上下文使用kmalloc必须使用GTP_ATOMIC而非可能导致随眠的GTP_KERNEL

   
可以看下
深入Linux内核架构(中文版)
这个有电子版讲的还不错

论坛徽章:
1
技术图书徽章
日期:2013-09-17 09:11:51
发表于 2014-10-31 14:03 |显示全部楼层
3Q回复 6# kiongf


   

论坛徽章:
1
技术图书徽章
日期:2013-09-17 09:11:51
发表于 2014-10-31 14:08 |显示全部楼层
非常感谢,最近一直在看内核有关的文档,以前主要是偏应用,所以内核不是太熟悉,有些概念因为没有去看源码,没用过比较难理解回复 7# yimeng4a309


   

论坛徽章:
0
发表于 2014-10-31 15:42 |显示全部楼层
回复 9# jonas_mao
还是要以源码为主。理解为主。现在别说你网上搜索的资料了,即便是源码中的东西,不同版本之间。很多概念都是模糊的。比如下半部,软中断,异常 这些概念很多时候是混淆的。只能以实际代码的效果为主
后来也搜索了下你发的那句英文。最后定位到IBM的  
kernel thread, kernel-only thread, user thread
其实我理解的标准linux里面的概念上应该没这么清晰的划分的。就分 用户线程(user thread)和 内核线程(这个应该对应你提到的kernel only thread)。用户线程通过系统调用陷入核心态,这个时候的状态应该对应你说的kernel thread

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP