-
查阅资料发现引起#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。
OS 13号#GP异常
最新推荐文章于 2021-07-27 18:57:28 发布