OS 13号#GP异常

  • 查阅资料发现引起#GP异常可能的原因如下:将NULL(0)段选择子载入CS/SS;程序中的线性地址不是Canonical类型;开启过程没有按照规定的顺序。

  • 运行任务切换的时候,发现如下错误,发现出现了#GP13号异常,段选择子是0。
    在这里插入图片描述
    同时,bochs也出现了如下的提示:
    在这里插入图片描述
    这说明原因应该是没有使用Canonical地址导致出现了该异常。

  • 根据RIP的值以及反汇编文件发现出现异常的调用函数为__switch_to的最后一句。
    在这里插入图片描述
    (省去一些中间程序。。)
    在这里插入图片描述

  • 默认的gdt表初始化如下:
    在这里插入图片描述

  • 查看gdt表(物理地址0x10a240处),可以看到kernel code和data的段描述符发生了变化,第40-43位从8变成了9(2变成了3),即第40位置一,表明该段已经被访问过,这也是正常的:在这里插入图片描述

  • 查看当前段寄存器,cs为0x08,es为0x10。和程序中设置一样,似乎也是正常的。具体寄存器如下所示:
    在这里插入图片描述

  • 后面决定在内核中printk看各路寄存器的值,埋点如下:
    在这里插入图片描述
    printk之后发现rip不正常。。如下:
    在这里插入图片描述

  • 尝试将反汇编的kernel_thread_func的地址直接赋值到rip上,直接运行,这下终于正常了,泪目。。
    反汇编地址
    在这里插入图片描述
    在这里插入图片描述

  • 取函数地址不对的原因暂时未找到,可能是内联汇编标识符取值的问题,先留个坑后面有时间再填了。。
    在这里插入图片描述

  • 最后还是gcc降级到4.8,问题解决了orz。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值