据我了解,内核不是一个进程,而是一组可以从另一个进程的运行时调用的处理程序(或者内核本身通过计时器或类似的东西?)
如果程序遇到一些需要长时间同步处理才能再次开始运行的异常处理程序(例如,遇到需要读取磁盘的页面错误),内核如何识别应该切换上下文?为了实现这一点,似乎需要运行另一个进程?
内核是否会通过间歇性检查处于此状态的进程来生成处理此问题的进程?调用长时间运行的同步处理程序的进程是否让内核知道它应该切换上下文直到处理程序完成(例如磁盘读取完成)?
我目前正在学习 Linux 内核和操作系统,虽然我发现了很多关于 IRQ、驱动程序、调度和其他重要操作系统概念的优秀资源,以及与键盘相关的资源,但我很难把它们放在一起Linux 内核如何处理键盘上的按钮按下的全面概述。在这个阶段,我并没有试图理解每一个细节,而是试图将概念联系起来,有点全面。
我想到了以下场景:
VIM( Process #1) 和 say LibreOffice( Process #2)。VIM按 -a键。但是,当前正在运行的进程是Process #2(VIM下一个计划)。这就是我想象现在事情会发生的方式:
APIC)。处理器的APIC触发器INT Pin。Kernel Mode并IRQ-Number从 中请求APIC,它用作Interrupt Descriptor Table Register( IDTR)的偏移量。获取描述符,然后用于获取中断处理程序例程的地址。据我了解,这个中断处理程序最初是由键盘驱动程序注册的?这让我想到了我的主要问题:中断处理程序通过哪种机制将按下的键传达给正确的进程 ( Process #1)?它是否真的这样做呢,还是简单的写(通过提供一个被按下的按键到缓冲区char-device?),在某时刻为只读到一个进程(目前“附加”到Process #1)?我不明白什么时候 …
查看 /proc/interrupts 下面的输出分别在第 26 行和第 27 行显示了 ERR 和 MIS。这些是什么?为什么它们有 CPU0 的计数(尽管为零)但没有其他计数,也没有描述?我认为它们实际上与 PIC 本身错误有关吗?
感谢 ErikF 的回复。为什么这些中断只出现在CPU0上?是否是因为如果 PIC/中断系统出现错误,只有该 CPU 才会收到中断?
1. username@domain:/proc$ cat interrupts
2. CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7
3. 0: 1221738 0 0 0 0 0 0 0 IO-APIC 2-edge timer
4. 1: 9 0 0 0 0 0 0 0 IO-APIC 1-edge i8042
5. 6: 3 0 0 0 0 0 0 0 IO-APIC 6-edge floppy
6. 8: 0 0 0 0 0 0 …Run Code Online (Sandbox Code Playgroud) 操作系统概念 说:
在 I/O 期间,各种设备控制器在准备好服务时会引发中断。这些中断表示
- 该输出已完成,或
- 输入数据可用,或
- 检测到故障。
中断是否用于表示输出已准备好或输入已完成?
如果不是,它们是否需要以其他方式表示?
interrupt ×4
linux-kernel ×2
drivers ×1
io ×1
kernel ×1
keyboard ×1
linux ×1
proc ×1
process ×1
scheduling ×1