内核地址空间大冒险(二):中断与异常

中断&异常

“年轻人,欢迎来到内核地址空间”,熟悉的问候语响起,走过来一位白发老头,却不是我在系统调用时见过的那位,拄着一根木棍,挂着一只葫芦,看起来年纪比系统调用那个老头还要大一些。

“敢问老先生,我怎么到这里来了,我并没有执行系统调用啊”,我向老头打听情况。

这里并不是系统调用的入口,因为你执行了除数为0的除法,触发了异常,所以来到了这里 ”,老头说完喝了一口葫芦里的酒。

“异常,这又是什么意思?”,今天又听到一个新的名词。

只见老头木棍一挥,大雾完全散去,我这才注意到,这里还有好多大门,它们一个挨着一个,形成了一面门墙。

“老先生,这些都是什么啊,这到底是什么地方?”,我对眼前的景象感到越发的好奇。

“这里是 中断描述符表——IDT ,是所有中断和异常发生时,你们会来到的地方”,老头用了一堆我不懂的话来回答我。

“中断又是什么?和异常又是什么关系?IDT又是做什么的?”,我向老头发出了灵魂三问。

中断就是有重要的事情发生,要打断你们线程手头的工作,让出CPU必须去处理

“什么事情,这么重要?”

“比如说有键盘按键被按下,鼠标被移动或点击,网络中有数据包到来等等情况”。

“那异常呢?”

异常就是你们这些线程在执行代码指令的时候出现了一些错误的情况,比如做除法的时候除数为0,又比如访问的内存地址错误等这些情况,那遇到这些情况怎么办呢?CPU会发现有问题,强制改变你们的执行流,去处理这些异常 ”。

“听起来,跟中断差不多嘛!“

“确实差不多,所以它们都用IDT来一起记录嘛!不过实际上差别还是很大的哦。 最大的区别在于中断是异步,而异常是同步的 !“

“这是为什么?”

因为中断什么时候来你是不知道的,你是被迫被打断的,而异常是你们执行指令主动造成的

“那IDT又是做什么的?”

“刚才我不是说发生中断和异常你们就会被打断嘛!那打断后该去那里呢?IDT就是把所有中断和异常发生后要去的地方记录成了一个表,也就是你眼前所看到的这一面门墙了,总共256扇门,你现在触发的是除0错误,该抓紧时间去0号门里去处理异常了!”