我不确定我是否理解硬件和软件中断的概念。
如果我理解正确,硬件中断的目的是引起 CPU 的一些注意,这是实现 CPU 多任务处理的一部分。
另一方面,我认为软件中断的目的是让当前在 CPU 上运行的进程请求一些资源。
我只知道这Interrupt是hardware signal assertion处理器引脚造成的。但我想知道 Linux 操作系统如何处理它。
发生中断时发生的所有事情是什么?
该程序ed是一个最小的文本编辑器,不能通过使用Ctrl-向它发送中断来退出C,而是打印错误消息“?” 到控制台。为什么ed在收到中断时不直接退出?当然,没有理由为什么一个神秘的错误消息在这里比退出更有用。这种行为导致许多新用户进入以下类型的交互:
Run Code Online (Sandbox Code Playgroud)$ ed hello ? help ? exit ? quit ? ^C ? ^C ? ? ? ^D $ su # rm -f /bin/ed
如此悲惨的浪费——如果ed只是同意被打断,就很容易避免。
另一个表现出类似行为的顽固程序less似乎也没有太多理由忽略C-c. 为什么这些程序不只是提示?
我正在阅读有关流程管理的维基百科文章。我的重点是Linux。我无法弄清楚系统调用、消息传递和中断之间的关系和区别,它们的概念和目的。它们都是为了进程向内核请求资源和服务吗?
文章中的一些引用和其他一些引用:
操作系统有两种可能的方式在程序执行期间重新获得对处理器的控制,以便操作系统执行取消分配或分配:
- 进程发出系统调用(有时称为软件中断);例如,发生 I/O 请求,请求访问硬盘上的文件。
- 发生硬件中断;例如,在键盘上按下了一个键,或者计时器用完了(用于抢先式多任务处理)。
在用户模式下执行的程序可以通过两种技术请求内核的服务:
Run Code Online (Sandbox Code Playgroud)* System call * Message passing
中断是指示需要注意的异步信号或指示需要更改执行的软件中的同步事件。
硬件中断使处理器保存其执行状态并开始执行中断处理程序。软件中断通常作为指令集中的指令来实现,这会导致上下文切换到类似于硬件中断的中断处理程序。
根据我目前所读到的内容,“当内核收到中断时,所有注册的处理程序都会被调用。”
我知道每个 IRQ 的注册处理程序可以通过查看/proc/interrupts,我也知道注册的处理程序来自调用request_irq了回调的驱动程序,大致形式如下:
irqreturn_t (*handler)(int, void *)
Run Code Online (Sandbox Code Playgroud)
根据我所知道的,每个与特定 IRQ 关联的中断处理程序回调都应该被调用,并且由处理程序来确定是否确实应该由它处理中断。如果处理程序不应该处理特定的中断,它必须返回内核宏IRQ_NONE。
我无法理解的是,每个驱动程序如何确定它是否应该处理中断。我想如果他们应该期待中断,他们可以在内部跟踪。如果是这样,我不知道他们将如何处理同一 IRQ 后面的多个驱动程序期望中断的情况。
我试图了解这些细节的原因是因为我正在搞乱kexec在系统操作中间重新执行内核的机制,同时在 PCIe 桥接器以及下游 PCI 上使用复位引脚和各种寄存器设备。在这样做的过程中,重新启动后,我要么遇到内核恐慌,要么其他驱动程序抱怨即使没有进行任何操作,他们也收到了中断。
处理程序如何决定中断应该由它处理是个谜。
编辑:如果相关,有问题的 CPU 架构是x86.
我试图更深入地了解系统调用和硬件中断是如何实现的,而让我感到困惑的是它们在处理方式方面的不同之处。例如,我知道启动系统调用(至少曾经)的一种方式是通过 x86INT 0x80指令。
处理器的处理方式是否与硬件外设中断 CPU 的方式完全相同?如果不是,它们在哪一点上不同?我的理解是它们都索引 IDT,只是向量中的索引不同。
在同样的意义上,我的理解是有一个softirq处理“下半部分”处理的想法,但我只看到这种形式的“软件中断”是指被物理硬件中断排队运行。系统调用“软件中断”是否也会触发softirqs 进行处理?这个术语也让我有点困惑,因为我看到人们将系统调用称为“软件中断”,但也softirq称为“软件中断”。
我知道我可以make随时中断进程,而无需再次重新编译整个源代码树。据我所知,make只有在尚未编译的情况下才编译目标,或者在上次编译后修改了源代码。
但是如果我中断make,肯定会有一个或多个(取决于并发级别)半就绪的二进制文件。下次我跑步时,它们对我有make什么作用?或者当我按Ctrl+C以避免部分编译的二进制文件时它是否完成了当前目标?
我正在运行一个测试程序,它生成大量线程和异步 I/O。我在 /proc/interrupts 中看到这些中断的数量非常多,程序无法扩展超过某个点,因为 CPU 的软中断处理已 100% 饱和。
根据: http: //www.kernel.org/doc/man-pages/online/pages/man5/proc.5.html CAL代表“远程函数调用中断”,但这就是我在谷歌上可以找到的所有信息。那么...这是什么意思?我为我的 I/O 适配器卡分配了 smp_affinity,这些适配器卡不是占用大量 CAL 中断的 CPU。这是否表明我的程序正在以不正确的 SMP 亲和力运行?
man ksoftirqd 表示:
如果 ksoftirqd 占用的 CPU 时间超过很小的百分比,这表明机器处于沉重的软中断负载下。
我正在使用 Debian Wheezy 系统,系统利用率通常很高,其中 ksoftirqd 进程在短时间内使用过多的 cpu 和磁盘资源。在此期间,系统以蜗牛般的速度运行。
如何开始理解 ksoftirqd 资源利用率飙升的根本原因是什么?
我一直在寻找答案,到目前为止还没有找到可以回答我的问题的答案。我目前正在登录我的 Ubuntu 服务器,并且在运行一个进程时,我无法在其上运行任何中断。这是我的 stty -a:
user@Ubuntu1:~$ stty -a
speed 38400 baud; rows 93; columns 200; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V;
flush = ^O; min = 1; time = 0;
Run Code Online (Sandbox Code Playgroud)
我的 .bashrc 中没有任何内容可以更改中断。
这对于包括 root 在内的所有用户都是一样的。我还尝试使用不同的终端从不同的位置登录,每次都出现相同的结果。我已经使用 ssh 和 ssh -X 登录。 …