存档
对Linux x86-64架构上硬中断的重新认识
对于x86硬中断的概念,一直都落在理论的认识之上,直到这两天才(因某个问题)发现Linux的实现却并非如此,这里纠正一下(注意:Linux内核源码更新太快,一个说法的时效性太短,所以需注意我提到的香草内核版本,并且以x86-64架构为基准)。
汇编硬编码触发中断
Intel cpu中断是一些非常有意思的玩意,比如对于3号中断,很多内核调试机制像kprobe、kgdb就利用了它,而这在3号中断的内核处理函数do_int3内可以看到一些端倪。
怎样去主动触发这些中断呢?可以使用int指令,以下代码触发3号中断:
Triple Fault的捕获与处理
前面有文章说Triple Fault无法捕获,经过几天资料搜寻,对于这个问题还是有办法的。如果可以,对于捕获Triple Fault,最简便的方法就是使用虚拟机来进行操作,这样在发生Triple Fault时影响的只是虚拟机,在host机器里我们仍然可以做进一步处理。当前虚拟机比较多,比如最常用的Vmware、Qemu、Bochs等,我就试了一下Vmware,发生Triple Fault时Vmware会弹个框进行提示CPU进入shutdown模式,按确定(虚拟机)重启,按取消(虚拟机)关机;这个对于我们调试Triple Fault帮助不大;另外几个虚拟机,网上搜索了一下,据称Qemu会有oops信息:
http://readlist.com/lists/netbsd.org/current-users/5/28250.html
Bochs也会有oops信息:
http://www.brokenthorn.com/Resources/OSDev15.html
http://www.brokenthorn.com/Resources/OSDev9.html
Double Fault & Triple Fault
之前我曾提到过intel x86 cpu的14号中断用于处理缺页异常,这也是被人熟知的一个中断号,事实上intel架构总共可用的中断号有256个(从0到255),其中前32个(从0到31)中断号保留给Intel架构内部使用,也就是说这些中断都有其特定的含义而不可被用户更改,而剩余的224(从32到255)个中断则可由用户自定义和实现其具体功能。本文重点关注前32个中断,更具体点说是其中的一个中断Double Fault,以及隐包含的另外一个中断Triple Fault。