当我在读一本书(Linux内核编程)时,我发现了一个有趣/令人困惑的段落mm_segment_t addr_limit
(其中的成员之一struct_task
),如下所示:
mm_segment_t addr_limit;
与旧内核不同,从 2.4 开始,任务(线程)也可以位于内核内。这些任务可以访问比用户空间中的任务更大的地址空间。地址限制描述可以使用任务内核访问的地址空间。
问题:
在第一点中,它说“(任务)线程也可以在内核中”是有的。这是什么意思?线程不一定在内核中吗?
在第二句话中,“这些可以访问比用户空间中的任务更大的地址空间。”我不明白什么这些方法?如果他说的是线程,线程怎么可能比任务有更大的地址空间呢?
答案1
短语“在内核内”可能指的是内核线程内核本身使用它们来执行可以异步执行的工作。您可以在进程树中查看这些线程的示例:
# ps aux | grep '\[.*\]$' | head
root 2 0.0 0.0 0 0 ? S May05 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S May05 0:03 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S May05 0:00 [kworker/0:0]
root 5 0.0 0.0 0 0 ? S May05 0:00 [kworker/u:0]
root 6 0.0 0.0 0 0 ? S May05 0:00 [migration/0]
root 7 0.0 0.0 0 0 ? S May05 0:00 [watchdog/0]
root 8 0.0 0.0 0 0 ? S May05 0:00 [migration/1]
root 9 0.0 0.0 0 0 ? S May05 0:00 [kworker/1:0]
root 10 0.0 0.0 0 0 ? S May05 0:02 [ksoftirqd/1]
root 11 0.0 0.0 0 0 ? S May05 0:00 [watchdog/1]
此类线程由调用 kthread_create() 的内核代码创建。这些线程在内核模式下运行,执行您期望内核执行的各种任务。
另一方面,“用户空间中的任务”代表您通常认为的线程或进程,通过 fork+exec 或 pthread_create 创建。它们在用户模式下运行,并在需要内核服务时进行系统调用。这里的措辞有点奇怪,因为当然,内核知道这些任务并维护有关它们的信息(例如 struct_task),以便它可以在 CPU 上为它们安排时间。
至于(2),“这些”特指“内核线程”。我相信内核线程与内核共享相同的地址空间。