软件是怎样控制硬件的(代码是如何控制硬件的)

相信你看完这篇文章就知道软件是如何控制硬件的,如有什么疑问,欢迎讨论。

先来思考一下Java/js 等语言为什么可以捕获到键盘输入?

软件是怎样控制硬件的(代码是如何控制硬件的)图1

为了捕获到键盘输入,硬件层面需要把按键抽象成中断,中断 CPU 执行。CPU 根据中断类型找到对应的中断向量。操作系统预置了中断向量,因此发生中断后操作系统接管了程序。操作系统实现了基本解析按键的算法,将按键抽象成键盘事件,并且提供了队列存储多个按键,还提供了监听按键的 API。因此应用程序,比如 Java/Node.js 虚拟机,就可以通过调用操作系统的 API 使用键盘事件。

中断的设计

按键码的收集,是键盘芯片和主板的能力。主板知道有新的按键后,通知 CPU,CPU 要中断当前执行的程序,将 PC 指针跳转到一个固定的位置,我们称为一次中断(interrupt)。

软件是怎样控制硬件的(代码是如何控制硬件的)图2

考虑到系统中会出现各种各样的事件,我们需要根据中断类型来判断PC 指针跳转的位置,中断类型不同,PC 指针跳转的位置也可能会不同。比如按键程序、打印机就绪程序、系统异常等都需要中断,例如系统调用,也需要中断正在执行的程序,切换到内核态执行内核程序。

因此我们需要把不同的中断类型进行分类,这个类型叫作中断识别码。比如按键,我们可以考虑用编号 16,数字 16 就是按键中断类型的识别码。不同类型的中断发生时,CPU 需要知道 PC 指针该跳转到哪个地址,这个地址,称为中断向量(Interupt Vector)。

当编号 16 的中断发生时,32 位机器的 PC 指针直接跳转到内存地址 16*4 的内存位置。如果设计最多有 255 个中断,编号就是从 0~255,刚好需要 1K 的内存地址存储中断向量——这个 1K 的空间,称为中断向量表。

32位刚好是4个字节,也就是说255个4字节就可以存储整个向量表.

因此 CPU 接收到中断后,CPU 根据中断类型操作 PC 指针,找到中断向量。操作系统必须在这之前,修改中断向量,插入一条指令。比如操作系统在这里写一条Jump指令,将 PC 指针再次跳转到自己处理对应中断类型的程序。

软件是怎样控制硬件的(代码是如何控制硬件的)图3

操作系统接管之后,以按键程序为例,操作系统会进行一些处理,包括下面的几件事情:

将按键放入一个队列,保存下来。这是因为,操作系统不能保证及时处理所有的按键,比如当按键过快时,需要先存储下来,再分时慢慢处理。

计算组合键。可以利用按下、释放之间的时间关系。

经过一定计算将按键抽象成消息(事件结构或对象)。

提供 API 给应用程序,让应用程序可以监听操作系统处理后的消息。

分发按键消息给监听按键的程序。

所以程序在语言层面,比如像 Java/Node.js 这种拥有虚拟机的语言,只需要对接操作系统 API 就可以了。

中断的类型

按照中断的触发方分成同步中断和异步中断;

根据中断是否强制触发分成可屏蔽中断和不可屏蔽中断。

中断可以由 CPU 指令直接触发,这种主动触发的中断,叫作同步中断。同步中断有几种情况。

系统调用,需要从用户态切换内核态,这种情况需要程序触发一个中断,叫作陷阱(Trap),中断触发后需要继续执行系统调用。

还有一种同步中断情况是错误(Fault),通常是因为检测到某种错误,需要触发一个中断,中断响应结束后,会重新执行触发错误的地方,比如缺页中断 pagefault。

程序的异常,这种情况和 Trap 类似,用于实现程序抛出的异常。

另一部分中断不是由 CPU 直接触发,是因为需要响应外部的通知,比如响应键盘、鼠标等设备而触发的中断。这种中断我们称为异步中断。

CPU 通常都支持设置一个中断屏蔽位(一个寄存器),设置为 1 之后 CPU 暂时就不再响应中断。对于键盘鼠标输入,比如陷阱、错误、异常等情况,会被临时屏蔽。但是对于一些特别重要的中断,比如 CPU 故障导致的掉电中断,还是会正常触发。可以被屏蔽的中断我们称为可屏蔽中断,多数中断都是可屏蔽中断。

这也可以解释为什么有的程序不能被ctrl + c终结

软件是控制不了硬件的 但是给软件留了一个调用硬件功能的接口代码 软件代码最终都是转成了硬件设定的机器功能码 软件与硬件的隔离层就是一个编译器 软件要通过编译器告诉硬件告诉CPU它想做什么 电脑 尤其是我们当下使用的电脑就是一堆 开关 一堆的功能开关 开关的核心则是加法器 就是所谓的逻辑门电路 所有计算机功能的实现 都是由门实现的 这个门有三种基本的连接方法 中联 并联 和反接 当开关被晶体管替代时 就实现了大规模的功能实现 代码的分类是在寄存器里 代码的数据到了加法器里要进行一次识别转换 经过识别转换之后通过总线发到相应的硬件进行命令的执行 每一代新的处理器最核心的就是内部的门电路的代码 这些代码是处理器的灵魂 也是CPU厂家的绝对商业机密 如果你的老师或者是师傅教你多少处理器的核心代码 你就有多少把控计算机的能力

版权声明:本文来自用户投稿,不代表【闪电鸟】立场,本平台所发表的文章、图片属于原权利人所有,因客观原因,或会存在不当使用的情况,非恶意侵犯原权利人相关权益,敬请相关权利人谅解并与我们联系(邮箱:dandanxi6@qq.com)我们将及时处理,共同维护良好的网络创作环境。

(0)
上一篇 2023年06月10日 08:57
下一篇 2023年06月10日 09:14

相关推荐