Jack:为什么标题是——一鞭一条痕呢?
我:中断是CPU的核心,更是Linux内核的核心。我希望本文能把中断讲清楚,讲到你看了就明白什么是中断。希望能做到“一鞭一条痕,一掌一筐血”。
Jack:你希望本文能和别的书籍有什么区别呢?
我:1、你能明白中断是什么。2、你能明白操作系统的kernel到底是什么。
Jack:你开始吧。
我:我说两个前提。有了这两个前提,你理解中断就非常清楚了,完全不用再看别的书籍去死记硬背。
1、中断是CPU的特性(CPU层面的,而不是操作系统层面)。
2、Linux内核是多段复杂的中断服务代码拼接起来的。
Jack:我操。这个很抽象哇。
我:回家看书去吧。孩子。
Jack:“中断是CPU的特性”——这句话如何理解呢?
我:你首先要明白,无论有没有操作系统,CPU都会有中断的功能。例如,基于ARM的嵌入式设备,一些罕见的CPU(比如电梯控制芯片),都会有中断的功能。
Jack:“Linux内核是多段复杂的中断服务代码拼接起来的”——这句话如何理解呢?
我:举个例子,电梯的控制芯片,它所做的电梯感应、调度等,就是中断服务程序。但是,这段代码比较单一、智能化低。而Linux是一个功能比较复杂,智能化相对较高的中断服务程序。
Jack:问一个SB的问题。什么是中断服务程序呢?
我:这个问题不SB,能说清楚的人不多。我问一个问题,在你看来,“中断”是什么?
Jack:中断是当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。
我:这是准确的定义。同时,也是官话,就是你听了不知道是什么东西的话。
Jack:嘎嘎。
我:就针对“CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程”这句话我们做一些讨论吧。“当前程序的执行”——>在没有操作系统的情况下,当前程序是怎么执行的?它怎么能执行?
Jack:嘎嘎。
我:“转而执行处理新情况的程序”——>
1、“新的情况”指的什么?举个例子。
2、“处理新情况的程序”存储在哪里的呢?
3、“处理新情况的程序”是什么时候存储进去的呢?
4、当“新的情况”出现的时候,CPU如何根据这个“新的情况”去找“处理新情况的程序”?
5、当CPU找到“处理新情况的程序”,它如何执行新的程序呢?——当CPU突然不执行“当前的程序”,跑去执行另外一段不知所谓的代码,它执行完那段代码之后,如何能跳转回来执行当前的程序呢?
6、当CPU跳转到“处理新情况的程序”执行的时候,如果又出现“更新的情况”那CPU应该怎么处理呢?它是去处理,还是不去处理呢?它要处理又会怎么处理呢?
7、当一台电脑有多颗CPU(PCI总线只有一条)时,如果出现了“新的情况”,应该让哪一颗CPU去处理呢?如何做到CPU间的负载均衡呢?
8、当多个CPU在处理不同的中断时,如果需要操作同一个数据结构,如何去做到互斥与同步呢?
Jack:卧槽~去死吧。去死吧。草。嘎嘎~
我:思考一下这8个问题吧。你未必需要能回答,想一想,你已经可以体会到内核hacker的快感了。