【问题标题】:current->mm gives NULL in linux kernelcurrent->mm 在 linux 内核中给出 NULL
【发布时间】:2013-06-03 05:55:12
【问题描述】:

我想遍历页表,所以我访问了current->mm,但是它给出了NULL值。

我正在研究 linux 内核 3.9,但我不明白 current->mm 怎么可能为零。

这里有什么我想念的吗?

【问题讨论】:

标签: memory-management linux-kernel


【解决方案1】:

这意味着你在一个内核线程中。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 2012-04-21
      • 1970-01-01
      相关资源
      最近更新 更多