如何理解内核线程执行在用户模式下,什么样的情景会用到?
文档上的一段话“A kernel thread runs in user mode environment when executing user functions or library calls”,这里应该怎么理解,哪种情形会用到,是在系统初始化的时候,内核调用init来初始化用户数据?在用户模式要访问内核数据是通过系统调用这个中转,那么系统调用能作为内核到用户的中转吗?(使内核再次陷入内核态?)
就是系统调用的时候。 是说内核里的线程也可以使用系统调用吗?
还是说用户使用系统调用,当在内核的时候相当于内核线程来执行用户的function或者lib,但这时候的内核线程执行的环境应该是内核态,不是用户态。存疑。
能否详解下!
回复 2# wait_rabbit
回复 1# jonas_mao
ksoftirqd 就是一个内核线程
负责维护软件中断重新触发的软中断和 用户进程之间的调度。保证软中断过多时,用户进程也能得到调度
只所以ksoftirqd运行在 进程上下文,是因为进程才有调度的概念。中断没有调度的概念。比如你在一个中断中发生调度了,那么就回不去了。因为中断状态cpu没有保存任何id相关信息。但进程调度前 会 保存进程id以及寄存器等环境状态
只所以运行在内核态而不是用户态。是因为只有运行在内核态才能访问 内核空间。用户态无法访问内核空间
但与一般进程通过系统调用进入内核态不一样的是。进程通过系统调用进入内核态后,可以访问用户空间和内核空间。
但是内核态线程仅仅只能访问内核空间
抱歉现在才看到,你说的进程通过系统调用进入内核态,可以访问用户数据和内核数据,这里是通过哪种方式访问用户数据的,是系统调用所带的参数?
你说的ksoftirqd 是在调度用户进程的时候进入user mode 吗?
回复 4# yimeng4a309
回复 1# jonas_mao
内核线程可以通过call_usermodehelper()函数调用应用层的程序,有一个场景是cgroup需要调用应用层程序cgroup release agent程序 回复 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内核架构(中文版)
这个有电子版讲的还不错 3Q回复 6# kiongf
非常感谢,最近一直在看内核有关的文档,以前主要是偏应用,所以内核不是太熟悉,有些概念因为没有去看源码,没用过比较难理解回复 7# yimeng4a309
回复 9# jonas_mao
还是要以源码为主。理解为主。现在别说你网上搜索的资料了,即便是源码中的东西,不同版本之间。很多概念都是模糊的。比如下半部,软中断,异常 这些概念很多时候是混淆的。只能以实际代码的效果为主
后来也搜索了下你发的那句英文。最后定位到IBM的
kernel thread, kernel-only thread, user thread
其实我理解的标准linux里面的概念上应该没这么清晰的划分的。就分 用户线程(user thread)和 内核线程(这个应该对应你提到的kernel only thread)。用户线程通过系统调用陷入核心态,这个时候的状态应该对应你说的kernel thread
页:
[1]
2