免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2676 | 回复: 3
打印 上一主题 下一主题

内核态空指针异常 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-09 00:59 |只看该作者 |倒序浏览
在内核的某个函数里,访问0地址,会触发非法地址异常

那么这个异常应该会走do_page_fault,请问do_page_fault函数,具体哪里会处理此异常?





  即do_page_fault的如下代码:

      vma = find_vma(mm, address);

      if(!vma)
        goto bad;                                            /*1 该地址后没有任何线性区*/

      if((errcode&4)&&(address+32<esp))     /*2  用户态,扩展栈不成功*/
          goto bad;

        if (expand_stack(vma, address))
                goto bad;                                /*3  内核态,扩展栈不成功*/

    goto good;

其中以上1和3处,哪个是内核态访问非法地址(空指针),走的流程?

或者说,是其他流程?

谢谢

论坛徽章:
0
2 [报告]
发表于 2010-04-09 12:53 |只看该作者
/* 如果是由于内核自己访问了用户空间的无效地址,则就会引发OOPS,
if (oops_may_print()) {
/* 如果这个地址小于PAGE_SIZE, 一般为4096 字节,内核就认为这是一次空指针
操作, 开始打印OOPS 信息,杀死当前进程 */
if (address < PAGE_SIZE)
printk(KERN_ALERT "BUG: unable to handle kernel NULL "
"pointer dereference");
else
printk(KERN_ALERT "BUG: unable to handle kernel paging"
" request");
printk(" at virtual address %08lx\n",address);
printk(KERN_ALERT " printing eip:\n");
printk("%08lx\n", regs->eip);
}
page =

论坛徽章:
0
3 [报告]
发表于 2010-04-09 21:30 |只看该作者
我的意思是,不一定是0地址,在内核态里,如果有类似如下的语句,内核会报错:

  unsigned long lower_than_3G = 0x60100000;
  *(unsigned long*)lower_than_3G = 0xcc;

   那么会走do_page_fault的哪个分支?

论坛徽章:
0
4 [报告]
发表于 2010-04-09 22:47 |只看该作者
我猜应该是1楼里面的那个1 (/*1 该地址后没有任何线性区*/)

LZ你说了假设那个地址是个无效地址,那么 vma = find_vma(mm, address); 这里应该找不到,那么就走1了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP