我刚开始编写设备驱动程序,对于线程还很陌生,查阅了许多文档以获取有关线程的概念。仍然有一些疑问。
- 什么是内核线程?
- 它与用户线程有何不同?
- 这两个线程之间的关系是什么?
- 如何实现内核线程?
- 在哪里可以看到实现的输出?
有人能帮帮我吗? 谢谢。
我刚开始编写设备驱动程序,对于线程还很陌生,查阅了许多文档以获取有关线程的概念。仍然有一些疑问。
有人能帮帮我吗? 谢谢。
task_struct
。kthreadd
内核线程而不是 init
进程),并且由仅限内核的 API 创建,而不是使用 clone
从 fork/exec
系统调用的序列。kthreadd
作为父进程。除此之外,内核线程与用户空间进程一样相互独立。kthread_run
函数/宏。您很可能需要编写内核模块以调用此函数,因此应查看Linux 设备驱动程序。printk
调用),则可以使用 dmesg
命令在内核日志中查看此输出。内核线程是仅在内核模式下运行的内核任务;通常情况下,它不是通过fork()
或clone()
系统调用创建的。一个示例是kworker
或kswapd
。
如果您不知道内核线程是什么,那么您可能不应该实现内核线程。
谷歌提供了许多关于内核线程的页面,例如Frey的页面。
task->mm
实际上是 NULL
。 - Ilya Matveychikov用户线程和栈:
每个线程都有自己的栈,以便它可以使用自己的局部变量,线程共享全局变量,这些全局变量是 Linux 可执行文件中 .data 或 .bss 部分的一部分。由于线程共享全局变量,因此在多线程应用程序中访问/修改全局变量时,我们使用同步机制如互斥锁。局部变量属于线程个体栈的一部分,因此不需要任何同步。
内核线程
内核线程源于在进程上下文中运行内核代码的需求。内核线程是工作队列机制的基础。本质上,内核线程是仅在内核模式下运行且没有用户地址空间或其他用户属性的线程。
要创建一个内核线程,请使用 kthread_create():
#include <linux/kthread.h>
structure task_struct *kthread_create(int (*threadfn)(void *data),
void *data, const char namefmt[], ...);
内核线程和栈: 内核线程用于为内核执行后处理任务,如pdf刷新线程、workq线程等。 内核线程基本上是没有地址空间的新进程(可以使用带有所需标志的clone()调用创建),这意味着它们不能切换到用户空间。内核线程像普通进程一样可调度和可抢占。
内核线程有自己的堆栈,它们用来管理本地信息。
更多关于内核栈的信息:- https://www.kernel.org/doc/Documentation/x86/kernel-stacks
pthread_create
。