内核任务可以访问其vm_area_struct吗?

时间:2012-07-27 07:07:30

标签: linux kernel

我的理解是用户任务可以同时访问3G用户空间和1G内核空间。但是内核任务只能访问其唯一的1G内核空间。但在task_struct中,它链接到指向用户空间的vm_area_struct,我是对的吗?如果正确,那么这意味着内核任务还可以直接访问用户空间吗?

2 个答案:

答案 0 :(得分:0)

用户任务可以访问唯一的低3G用户空间(映射的区域),内核可以访问所有3G + 1G空间。内核不直接访问用户空间地址,它使用copy_from(to)_user()API。

答案 1 :(得分:0)

以下是Robert Love的LKD3:mm_struct和内核线程(P309)

内核线程没有进程地址空间,因此没有关联 因此,内核线程的进程描述符的mm字段为NULL。 这是没有用户上下文的内核线程进程的定义。

缺少地址空间很好,因为内核线程无法访问任何用户 - 空间记忆。 (他们会访问谁?)因为内核线程没有任何页面 在用户空间中,他们不配得到自己的内存描述符和页表。 (页 这些表将在本章后面讨论。)尽管如此,内核线程需要一些 数据,如页表,甚至访问内核内存。提供内核线程 需要的数据,不会在内存描述符和页表上浪费内存,或者浪费 - 每当内核线程开始时,处理器周期就会切换到新的地址空间 运行时,内核线程使用之前运行的任何任务的内存描述符。

每当安排进程时,进程引用的进程地址空间 加载mm字段。然后更新进程描述符中的active_mm字段以进行引用 到新的地址空间。内核线程没有地址空间,mm为NULL。 因此,在调度内核线程时,内核会注意到mm为NULL并保持不变 加载上一个进程的地址空间。然后内核更新active_mm字段 内核线程的进程描述符引用前一进程的内存 然后,内核线程可以根据需要使用先前进程的页表。 因为内核线程不访问用户空间内存,所以它们只使用 地址空间中与内核内存有关的信息,对所有人来说都是一样的 过程