【发布时间】:2018-12-16 16:57:48
【问题描述】:
大会:
考虑Intel 8080。要处理中断(例如来自键盘),您只需让键盘将“INT”引脚拉高并在数据总线上放置一个“向量”。该向量指向汇编程序代码中中断服务程序 (ISR) 的位置。详情请见this answer。
高级语言:
考虑附加事件侦听器的概念。例如考虑Javascript's keydown event listener。一个example:
document.getElementById("demo").addEventListener("keydown", myFunction);
function myFunction() {
document.getElementById("demo").style.backgroundColor = "red";
}
当'demo'元素处于焦点时按下一个键,myFunction 被调用。
关系:
附加事件侦听器的概念与在程序集中包含 ISR 的概念有何关系?
我假设直接响应键盘中断的函数是 1) 操作系统内核的一部分和 2) 用 C 编写的。(这些假设正确吗?)
用户程序如何告诉这个操作系统中断处理程序在中断时提醒它?操作系统函数在处理中断时是否保留一个可变大小的函数列表以进行回调?那么addEventListener 是否将用户回调函数附加到 OS 函数的列表中?
注意:我之所以选择 Intel 8080 作为示例,是因为与现代 CPU 相比,它不具备辅助操作系统相关功能的花哨功能。
【问题讨论】:
-
是的,用户空间中的异步回调函数或信号处理程序非常类似于在裸机上运行的程序的中断处理程序。 (例如,现代硬件上的内核,或任何独立程序。)Javascript 有点特别,因为作为一种托管语言,VM 知道何时可以安全地异步运行某些东西。
-
但是不,事件回调不直接挂钩到实际的内核中断处理程序;内核中有几层软件。 (对不起,我没有时间写一些值得发布的东西作为答案。)
-
“附加事件侦听器的概念与在程序集中包含 ISR 的概念有何关系?” ...从操作系统内核的角度来看,事件处理程序/侦听器通常是非中断的“商务逻辑代码”,这是在服务中断后在主线程中完成的事情。您不必以任何快速的方式处理事件处理程序,它们可以等待相当长的几微秒并且不会发生任何可怕的事情,而且操作系统通常只会将主事件委托给用户应用程序,事件循环在其中运行,处理事件,并跟踪自己的侦听器 + 调用它们(例如 android)。
-
与 8080 的关系更像是键盘中断处理键盘,将击键放入缓冲区(中断部分),然后运行代码最终会读取缓冲区并对其进行操作(on-事件处理程序)。
-
8080 不希望在中断确认周期期间看到总线上的 vector,而是希望看到它会执行的 opcode。因为它只能获取一个字节,所以可能的操作码有点有限,通常使用
RSTx,但你也可以放一个NOP(不是那么有用)或任何其他单字节命令(如@987654331 @ 并在主循环中等待设置进位标志)。
标签: events assembly operating-system interrupt