关于在多处理器suse11上中断处理中使用current宏的问题及解决方法

本文介绍了在suse11多处理器环境下,使用current宏在中断处理中获取进程ID导致系统崩溃的问题。通过分析内核源代码和汇编,发现中断处理函数中gs寄存器值不正确。解决方法是在中断处理中添加swapgs指令,以正确获取current。
摘要由CSDN通过智能技术生成

这个问题搞了我好些日子了,通过看suse11内核实现源代码,一点一点排除,最终还是把它搞定了,所以把它写下来吧。

 

发生问题环境:

Linux内核版本:Linux linux-suse11 2.6.27.45-0.1-default #1 x86_64 x86_64 x86_64 GNU/Linux

cpu细节就不说了:是一个多处理器,有16核

 

应用进程是:32bit,  系统内核都是64bit


问题现象:

自己编写了一个内核模块,接管了系统的INT3中断,自己实现中断处理,但处理过程要获取本进程id,但通过current->tgid获取中断发生时本进程id时就会导致中断处理过程中出现错误,最终导致系统死掉,需要重启。

 

 

问题定位:

下面所说的都是指内核模块里面,有最高权限。

1、这个宏current->tgid在其它地方是可以访问的,就是不在中断处理函数里面,在一般函数里面是可以访问,如ioctl函数里面。

而在中断处理函数里面就会出错。

 

2、通过反汇编把自己编写的内核模块反汇编出来,可以看出,cur_gid = current->tgidd在ioctl函数里面和中断处理是一样的,下面是大概汇编实现代码,不是真正反汇编出来的。

                    mov %gs:0x0 %rax(这个%rax可以使其它通用寄存器)

                    mov 0xoffset(%rax), (cur_gid) (这个是把刚才获取的地址再偏移一下取的值,赋值给一个地址)

       从上面可以看出,都是通过一个段寄存器gs来获取current指向当前进程控制结构体的地址,然后在获取其tgid,下面suse11下具体实现c源代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值