前情回顾:
通过系统调用进入内核空间的这个虫洞我终于弄清楚了,可我的冒险还要继续······
详情参见:内核地址空间大冒险:系统调用
1
除0错误
我是一个线程,出生在Linux帝国,今天我的任务是去执行一段人类用C语言编写的代码。
开始的工作很顺利,一共执行了18次系统调用,对于来往于用户空间与内核空间的那个虫洞我已经轻车熟路,再也不是萌新一枚。
后来,我拿到了一段数学运算的代码,来来往往地奔波于内存与寄存器之间,把我累得够呛,热的满头大汗,电脑风扇都转的飞快给我降温。
没多久,一条除法指令摆在我的面前,我瞟了一眼除数居然是0,一种不好的预感涌上心头。没有办法,硬着头皮也得上啊,准备开始执行这个除法。
突然!眼前闪过一道白光,然后变得漆黑,这不是执行系统调用的虫洞吗?可是我并没有执行系统调用啊,怎么跑到这里来了。
我心里开始犯嘀咕,打算等会问问原来的白胡子老头究竟是怎么回事。
不久,光亮开始出现,来到了一个陌生的地方,白雾茫茫。
继续前行,雾逐渐散去,一座大门出现在我面前,我定睛一看,上面写着:0:divide_error。
除法错误?我越发的紧张起来,这是到哪里了?
2
中断&异常
“年轻人,欢迎来到内核地址空间”,熟悉的问候语响起,走过来一位白发老头,却不是我在系统调用时见过的那位,拄着一根木棍,挂着一只葫芦,看起来年纪比系统调用那个老头还要大一些。
“敢问老先生,我怎么到这里来了,我并没有执行系统调用啊”,我向老头打听情况。
“这里并不是系统调用的入口,因为你执行了除数为0的除法,触发了异常,所以来到了这里”,老头说完喝了一口葫芦里的酒。
“异常,这又是什么意思?”,今天又听到一个新的名词。
只见老头木棍一挥,大雾完全散去,我这才注意到,这里还有好多大门,它们一个挨着一个,形成了一面门墙。