当前操作系统缺少黑体等字体_操作系统开发之——中断

本文深入探讨了操作系统中的中断概念,包括外部中断和内部中断(软件中断、异常),强调中断在操作系统中的核心作用。文章介绍了中断的分类,如可屏蔽中断和不可屏蔽中断,并讨论了中断描述符表及其相关组件。此外,还概述了中断处理的过程,包括保存现场和恢复执行。最后,提到了中断函数的注册方法,为后续的中断服务程序实现奠定基础。
摘要由CSDN通过智能技术生成

a3364d1e74f899d6600b39ffa123f9f5.png

这里先提交一个代码的错误,之前运行过快,没看出刷屏的问题:

// kernel/console.c...void init_console(void) {
    ...    // Before:    // console_fixed_height = ScreenHeight - 16;    //    console_fixed_height = (ScreenHeight / 16 - 1) * 16;...}...void console_roll(void) {
    ...    // Before:    // if (console_y > console_fixed_height) {
        //    if (console_y >= console_fixed_height) {
    ...}

e9d718b150b75f4cfa6a6837a3e55bc5.png

Logo字符和信息是笔者自己加的

接下来,终于到了内核开发的核心部分:中断。

中断基本概念

中断,顾名思义就是中断当前任务并转去做其他事务:当你正在看一本书时,突然房间有个电话,你就先把书反扣在桌面上,然后去接电话,当你接完电话回来时,又把书扣回继续看

粗糙地用计算机术语描述就是:CPU在有序执行一段程序时,中断控制芯片突然传送了个信息请求CPU处理,这时CPU暂停当前执行的程序,然后将当前执行程序的各个寄存器的值和其他数据压入堆栈,转而去执行中断程序,然后回来将原来栈里的数据弹出,接着执行之前的程序。

没有中断,操作系统是没有灵魂的:你在键盘上敲一个键,显示一个图像,字符缓冲区输出一段文本,操作一个文件,鼠标的随便滑动,网络数据的传输,各种外设协同、驱动功能,进程调度等等都是建立在完善的中断系统之下完成的,相信读者此时已经了解到中断的重要性。失去了中断机制,操作系统就只是个单纯的“死循环”。

中断的分类

外部中断(硬件中断)

所谓外部中断,就是指CPU外部发生的中断,由硬件发起。常发生于输入输出设备、时钟,计时器,电源,网卡等部件和外设。外部中断有两根信号线:INTR(INTeRrupt)和 NMI(Non Maskable Interrupt)。INTR传来的中断比较无关紧要,CPU甚至可以不去处理,例如网卡和硬盘的中断请求,CPU可以晚一些执行,我们常称作可屏蔽中断;而NMI就很严重了,基本上都必须立马处理,比如内存读写出错,电源掉电等。

由于外设众多,执行中断程序的时候可能又会有另一个中断发生,因此中断程序一般都有个特点:执行要尽快,函数要可重入(常发生于多线程中的全局变量保护的问题)。

像这些可屏蔽中断,在Linux中,分为上半部分和下半部分:上半部分处理比较重要的,要快速完成的程序,下部分就是没那么重要的程序,一般在CPU空闲时或者合适的时期来处理,这里有个很生动的例子:

拿网卡举例子,网络中的数据通过网线到达网卡后,首先会被存储到网卡自己的缓冲区中,这个缓冲区容量不大(比起内存来说是非常小的),即使很大也有写满的那天,所以里面的数据必须立即被 CPU拿走,否则由于网卡缓冲区中无空余空间,后续到来的数据只能丢掉。鉴于这个刻不容缓的理由,网卡会立即发中断通知 CPU:“数据到了,赶紧取走”,这话说得无比坚定,丝毫没有商量的意思,CPU 立即放下手里的工作(其实并不是真地立即放下,怎么也得把当前正在执行的指令执行完,指令的执行必须是原子操作一气呵成,哪有执行一半指令的道理),马上执行网卡的中断处理程序,将网卡缓冲区中的数据拷贝到内核缓冲区中,至此,救火工作算是完成了,这就是所说的上半部。CPU 拿到网络数据后,处理数据的工作就不那么紧急了,它将在下半部中完成,这部分将在适当的时机被启动。

来源:《操作系统真象还原》

随着时代的发展,很多外设之间可以使用通道机制和DMA方式进行工作,大大得减轻了CPU的负担。之前的图形模式的Linear Frame Buffer就是其中一个例子。

内部中断(软件中断和异常)

中断源都是软件(可能有些人对软件的定义仍然是:Application。事实上,一系列按照特定顺序组织的计算机数据和指令的集合都是软件,你可以说操作系统是个很大的系统软件,也可以说BIOS是在ROM里躺着的软件,甚至一个dll、lib、so、数据、文档都可以叫做软件)发起的,常见于除数为0,运算溢出,指令的单步运行,程序运行至断点等等。至于其他,Intel官方以及列出个表了:

中断向量号 助记符 描述 起源
0 #DE 除 0 异常 DIV和IDIV指令
1 #DB 调试异常 任何代码或数据引用
2 / NMI 中断 不可屏蔽的外部中断
3 #BP 断点异常 INT 3指令
4 #OF 溢出 INTO指令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值