小编pro*_*cci的帖子

linux内核线程的上下文

我编写了一个简单的内核模块,它循环遍历所有进程并提取它们在被取消安排时保存的寄存器(特别是EIP).

如果我没错,我需要的是保存在每个进程的thread_struct中sp0指向的内核堆栈上.这就是我做的:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>

int init_module(void){
    struct task_struct *t;
    struct pt_regs regs;
    for_each_process(t){
       memcpy(&regs, (unsigned long*)(t->thread.sp0-sizeof(struct pt_regs)), sizeof(struct pt_regs));
       printk(KERN_INFO "%s eip: %lx\n", t->comm, regs.ip);
    }
    return 0;
}

void cleanup_module(void){
}

MODULE_LICENSE("GPL");
Run Code Online (Sandbox Code Playgroud)

现在,关于用户级进程的输出似乎是合法的:

[ 3558.322088] bash eip: b770b430
Run Code Online (Sandbox Code Playgroud)

但是我从内核线程得到的所有东西总是0.

[ 3558.322095] kworker/0:0 eip: 0
Run Code Online (Sandbox Code Playgroud)

我不明白.在内核线程方面,内核是否将寄存器保存在其他地方?
它是否与内核抢占有关?

我在3.14-1-486内核上.

先感谢您.

linux x86 scheduler linux-kernel

5
推荐指数
1
解决办法
918
查看次数

标签 统计

linux ×1

linux-kernel ×1

scheduler ×1

x86 ×1