简谈内存地址空间、内部中断、外部中断、端口
简谈内存地址空间、内部中断、外部中断、端口
一、端口
计算机单板上或者 SOC 中拥有许多外设,比如显卡、网卡等。这些外设中存在着芯片,外设芯片作为 CPU 和外设连接交流的桥梁。CPU 读写外设就是在读写外设芯片中的寄存器,或者说端口;
- CPU ——> 读写外设芯片上的端口 ——> 芯片将端口中的数据传送给外设
- CPU <—— 读写外设芯片上的端口 <—— 外设将数据传送到端口
二、内存地址空间
在计算机单板上,除了内存条有存储空间以外,还有许多像 BIOS、显卡、网卡等设备都具有内部存储空间(ROM + RAM),比如说端口寄存器就是一段外设存储空间;CPU 将内存条、外设内部空间等所有的存储空间都抽象为一整段空间,每一段空间都通过总线和 CPU 进行连接,这大大简化了编程
三、中断
CPU 在执行程序的时候并非不能停止;CPU 需要时刻迎接中断的到来,简单来说中断就是打断 CPU 运行的一种“信号量”,当 CPU 接收到中断信号后“可能”需要转而去执行该类中断对应的中断处理程序(中断例程),执行完以后再返回来继续执行被打断的程序。
1. 内部中断
内部中断产生于 CPU 内部
类似除以 0、空指针异常、数组访问越界等异常就是内部中断(中断是异常的一种),内部中断是不可屏蔽中断,当内部中断产生时,CPU 必须对其进行相应
2. 外部中断
外部中断产生于 CPU 外部
可以说外部中断由外设发出,可分为:
-
可屏蔽中断:CPU 可以选择对其不响应(具体是判断某一 flag 寄存器的值,可能因 硬件而异)
-
不可屏蔽中断:CPU 必须对该种中断进行响应
CPU 对内部中断和外部中断的处理流程类似,都大致可简述为:
-
从中断信息中获取中断类型码
-
保存进程上下文
-
设置相关寄存器(比如设置 CPU 此时不再响应可屏蔽中断)
-
使用“中断类型码”到「中断向量表」中读取中断处理程序的“入口地址”
-
设置 CPU 的相关寄存器指向中断处理程序,开始执行中断处理程序
-
恢复进程上下文,继续执行被打断的程序
中断处理程序也叫做中断例程。
3. 中断向量表
中断向量其实就是中断处理程序入口地址;中断向量表其实就是一张存储着中断向量的表,其常驻在内存中最开始的一段空间(可能因硬件而异)
「中断类型码」其实就是 01H,02H 的十六进制数值,其拥有 8 个bit,所以中断类型码的变化范围就是 0~256,那么 CPU 怎么通过中断类型码去中断向量表中找到中断处理程序的地址呢?
由于中断向量表固定存放在内存最开始的那一段空间,每个中断向量所占用的空间都是固定的,那么 CPU 就可以根据中断类型码找到对应的中断向量。比如 0H 的中断类型码对应的就是表中第 1 个中断向量,10H 的中断类型码对应的就是表中的第 2 个中断向量。
中断向量表(固定存储在内存中的某段空间) |
---|
0 号中断源对应的中断处理程序的入口地址 |
1 号中断源对应的中断处理程序的入口地址 |
2 号中断源对应的中断处理程序的入口地址 |
3 号中断源对应的中断处理程序的入口地址 |
…… |
FAQ
- CPU 若正在执行中断处理程序,又产生了不可屏蔽中断的话会发生什么?