简谈内存地址空间、内部中断、外部中断、端口

简谈内存地址空间、内部中断、外部中断、端口

一、端口

计算机单板上或者 SOC 中拥有许多外设,比如显卡、网卡等。这些外设中存在着芯片,外设芯片作为 CPU 和外设连接交流的桥梁。CPU 读写外设就是在读写外设芯片中的寄存器,或者说端口;

  • CPU ——> 读写外设芯片上的端口 ——> 芯片将端口中的数据传送给外设
  • CPU <—— 读写外设芯片上的端口 <—— 外设将数据传送到端口

二、内存地址空间

在计算机单板上,除了内存条有存储空间以外,还有许多像 BIOS、显卡、网卡等设备都具有内部存储空间(ROM + RAM),比如说端口寄存器就是一段外设存储空间;CPU 将内存条、外设内部空间等所有的存储空间都抽象为一整段空间,每一段空间都通过总线和 CPU 进行连接,这大大简化了编程
内存地址空间

三、中断

CPU 在执行程序的时候并非不能停止;CPU 需要时刻迎接中断的到来,简单来说中断就是打断 CPU 运行的一种“信号量”,当 CPU 接收到中断信号后“可能”需要转而去执行该类中断对应的中断处理程序(中断例程),执行完以后再返回来继续执行被打断的程序。

1. 内部中断

内部中断产生于 CPU 内部

类似除以 0、空指针异常、数组访问越界等异常就是内部中断(中断是异常的一种),内部中断是不可屏蔽中断,当内部中断产生时,CPU 必须对其进行相应

2. 外部中断

外部中断产生于 CPU 外部

可以说外部中断由外设发出,可分为:

  • 可屏蔽中断:CPU 可以选择对其不响应(具体是判断某一 flag 寄存器的值,可能因 硬件而异)

  • 不可屏蔽中断:CPU 必须对该种中断进行响应

CPU 对内部中断和外部中断的处理流程类似,都大致可简述为:

  1. 从中断信息中获取中断类型码

  2. 保存进程上下文

  3. 设置相关寄存器(比如设置 CPU 此时不再响应可屏蔽中断)

  4. 使用“中断类型码”到「中断向量表」中读取中断处理程序的“入口地址”

  5. 设置 CPU 的相关寄存器指向中断处理程序,开始执行中断处理程序

  6. 恢复进程上下文,继续执行被打断的程序

中断处理程序也叫做中断例程。

3. 中断向量表

中断向量其实就是中断处理程序入口地址;中断向量表其实就是一张存储着中断向量的表,其常驻在内存中最开始的一段空间(可能因硬件而异)

「中断类型码」其实就是 01H,02H 的十六进制数值,其拥有 8 个bit,所以中断类型码的变化范围就是 0~256,那么 CPU 怎么通过中断类型码去中断向量表中找到中断处理程序的地址呢?
由于中断向量表固定存放在内存最开始的那一段空间,每个中断向量所占用的空间都是固定的,那么 CPU 就可以根据中断类型码找到对应的中断向量。比如 0H 的中断类型码对应的就是表中第 1 个中断向量,10H 的中断类型码对应的就是表中的第 2 个中断向量。

中断向量表(固定存储在内存中的某段空间)
0 号中断源对应的中断处理程序的入口地址
1 号中断源对应的中断处理程序的入口地址
2 号中断源对应的中断处理程序的入口地址
3 号中断源对应的中断处理程序的入口地址
……

FAQ

  1. CPU 若正在执行中断处理程序,又产生了不可屏蔽中断的话会发生什么?
posted @ 2023-12-22 20:39  一转身已万水千山  阅读(36)  评论(0编辑  收藏  举报