首页 > 解决方案 > Linux 内核致命异常(对齐陷阱)

问题描述

我正在尝试进入内核编程。当发生特定的内核恐慌时,我想尝试在每个 CPU 上的运行队列中打印出进程。我一直在查看内核中的各种代码块,并试图以我自己的方式模拟相同的代码块,但我想我制作了某种导致致命异常和对齐陷阱的科学怪人:

int cpu = 0;
struct rq *rq;
struct task_struct *p, *n;

for_each_possible_cpu(cpu) {
    rq = cpu_rq(cpu);
    raw_spin_lock(&rq->lock);
    printk(KERN_INFO, "rq->nr_running=%u\n", nr_running);
    list_for_each_entry_safe(p, n, &rq->cfs_tasks, se.group_node) {
        printk(KERN_INFO, "%d : %s\n", p->pid, p->comm);
    }
    raw_spin_unlock(&rq->lock);
};

循环只为 CPU 0 执行,然后它变得疯狂。你能为我指出正确的方向吗?(这是我在 core.c 中编写的代码)

编辑:问题出在自旋锁上。我猜想只有在那个 CPU 上运行的进程才能锁定?

Edit2:看来我让它工作了。我认为问题在于,在原始源代码中, struct rq* rq 声明位于 for 循环内。

标签: linuxexceptionkernelalignment

解决方案


推荐阅读