current-> mm在Linux内核中为NULL

问题描述 投票:5回答:2

我想遍历页表,所以我已经访问了current-> mm,但是它提供了NULL值。

我正在使用Linux内核3.9,但我不知道current-> mm怎么可能为零。

我在这里想念什么吗?

memory-management linux-kernel
2个回答
13
投票

这意味着您处于内核线程中。

在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。


1
投票

需要active_mm分配:调用switch_mm()会导致TLB刷新,这是通过“借用”上一个任务使用的mm_struct并将其放在task_ struct→active_mm中来避免的。此技术已大大改善了上下文切换时间。

© www.soinside.com 2019 - 2024. All rights reserved.