我想遍历页表,所以我访问了 current->mm,但它给出了 NULL 值。
我正在研究 linux 内核 3.9,但我不明白 current->mm 怎么可能为零。
我在这里想念什么吗?
我想遍历页表,所以我访问了 current->mm,但它给出了 NULL 值。
我正在研究 linux 内核 3.9,但我不明白 current->mm 怎么可能为零。
我在这里想念什么吗?
这意味着您处于内核线程中。
在 Linux 中,内核线程没有 mm 结构。内核线程从前一个用户线程中借用 mm 并将其记录在 active_mm 中。所以你应该改用 active_mm。
更多细节:
在/kernel/sched/core.c
您可以找到以下代码:
static inline void
context_switch(struct rq *rq, struct task_struct *prev,
struct task_struct *next)
{
...
if (!mm) {
next->active_mm = oldmm;
atomic_inc(&oldmm->mm_count);
enter_lazy_tlb(oldmm, next);
} else
switch_mm(oldmm, mm, next);
...
}
如果下一个线程没有 mm(内核线程),调度程序不会切换 mm,而只是重用前一个线程的 mm。
需要 active_mm 分配:通过“借用”前一个任务使用的并将其放在 task_ 中switch_mm()
来避免导致 TLB 刷新的调用。这种技术大大改进了上下文切换时间。mm_struct
struct→active_mm