加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux内核线程的上下文

发布时间:2020-12-14 02:13:54 所属栏目:Linux 来源:网络整理
导读:我编写了一个简单的内核模块,它循环遍历所有进程并提取它们在被取消安排时保存的寄存器(特别是EIP). 如果我没错,我需要的是保存在每个进程的thread_struct中sp0指向的内核堆栈上.这就是我做的: #include linux/kernel.h#include linux/module.h#include lin
我编写了一个简单的内核模块,它循环遍历所有进程并提取它们在被取消安排时保存的寄存器(特别是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: %lxn",t->comm,regs.ip);
    }
    return 0;
}

void cleanup_module(void){
}

MODULE_LICENSE("GPL");

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

[ 3558.322088] bash eip: b770b430

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

[ 3558.322095] kworker/0:0 eip: 0

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

我在3.14-1-486内核上.

先感谢您.

解决方法

thread.sp0是userland SP.内核SP是thread.sp(而内核ip只是thread.ip;这似乎存在于x86-32上,但不是x86-64).

上下文切换总是发生在switch_to (one of definitions)宏的内核中,从0??700调用0700.所以在那里使用的IP和SP指向内核空间.

返回用户空间时,需要另一个SP和IP.这就是你正在阅读的内容.

kworker是一个在内核中创建的线程,用于调度不应该在中断中完成的事情,并且在它们运行的??上下文中没有任何特定的进程.因此它没有任何用户态代码,因此它的用户区SP和IP都为零.您可以查看内核SP和IP,它们应该是非零的(IP应该几乎总是相同,指向context_switch中的相同位置)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读