Linux安装系统调用表更改模块时系统崩溃(unable to handle kernel paging request at XX)
来源:互联网 发布:matlab 如何遍历数组 编辑:程序博客网 时间:2024/05/16 11:51
安装内核模块时,如果里面有更改系统调用等情况,有时会崩溃,出现如下错误:
<1>BUG:unable to handle kernel paging request at virtual address c06357b4
printing eip:d0aac056 *pde = 0e9dd163 *pte = 00635161
Oops: 0003 [#1] SMP
Modules linked in: test2(U) addsym(U) nls_utf8autofs4 fuse rfcomm l2cap bluetooth sunrpc nf_conntrack_ftp nf_conntrack_ipv4xt_state nf_conntrack xt_tcpudp ipt_REJECT ip
原因:由于控制寄存器CR0的第16位若置位,则表示禁止系统进程写只有只读权限的页面(sys_call_table),
所以我们给sys_call_table添加内容的话就必须将CR0的第16位清零,在模块卸载的时候给还原
示例代码如下:
清除标志位:
static int clear_cr0(void)
{
unsigned int cr0 = 0;
unsigned int ret;
asm volatile ("movq %%cr0, %%rax":"=a"(cr0));
ret = cr0;
cr0 &=0xfffeffff;
asm volatile ("movq %%rax, %%cr0": :"a"(cr0));
return ret;
}
恢复标志位:
static void setback_cr0(int val)
{
asm volatile ("movq %%rax, %%cr0": :"a"(val));
}
注意:
在32位和64位的系统下汇编指令是有区别的,上面是32位系统下的代码,
从32位扩充到了64位,名字也发生了变化。8个通用寄存器(eax, ebx,ecx, edx, ebp, esp, esi, edi)在新的结构中被命名为rax,rbx, rcx, rdx, rbp, rsp, rsi, rdi。movl命令也需相应改成movq。
使用示例:
orig_cr0= clear_cr0();//保留标志位
sys_call_table[__NR_connect]= (unsigned long )test;//更改系统调用
setback_cr0(orig_cr0);//恢复标志位
当卸载模块,需要恢复系统调用时,同理。
- Linux安装系统调用表更改模块时系统崩溃(unable to handle kernel paging request at XX)
- Unable to handle kernel paging request at virtual address f600030a
- Unable to handle kernel paging request at virtual address
- Unable to handle kernel paging request at virtual address
- 关于Linux驱动的一种错误:Unable to handle kernel paging request at virtual address
- kernel oops (Unable to handle kernel paging request at virtual address )三种内存访问异常
- 解决遇到的Unable to handle kernel paging request at virtual address 错误
- Unable to handle kernel paging request for data at address 0x00000000
- Unable to handle kernel paging request at virtual address 的解决办法
- Thinking About "Unable to handle kernel paging request at virtual address ffc05000"
- Thinking About "Unable to handle kernel paging request at virtual address ffc05000"
- 触摸屏移植问题Unable to handle kernel paging request at virtual address 错误
- Unable to handle kernel paging request at virtual address错误的解决
- Unable to handle kernel paging request at virtual address 的解决办法
- Unable to handle kernel paging request at virtual address 0x7e005070 解决办法
- 卸载驱动报错:“Unable to handle kernel paging request at virtual address bf018000 ..........”
- 记 BUG: unable to handle kernel paging requrest at 0xffff7fXXXXXXXXX
- mips平台报错:报错信息:CPU 0 Unable to handle kernel paging request at virtual address 00000000, epc == 802bc
- 初入职场——实习那些事(3)
- linux proc 文件系统
- python property函数
- 饭卡 hdu 2546
- hdu 1049(1.2.3)
- Linux安装系统调用表更改模块时系统崩溃(unable to handle kernel paging request at XX)
- 进程间的通信-消息队列
- ASM函数监听实现-之简单静态方法注入
- 最大值最小化
- 实验4 [bx]和loop的使用——第二小题
- 常用的字符串加密和解密
- malloc与calloc
- JVM字节码初探--字节码
- adb介绍