我必须永久更改中断的 smp_affinity。服务器重启时需要执行以下代码:
echo "1" > /proc/irq/152/smp_affinity_list
echo "2" > /proc/irq/151/smp_affinity_list
echo "3" > /proc/irq/150/smp_affinity_list
echo "4" > /proc/irq/149/smp_affinity_list
echo "5" > /proc/irq/148/smp_affinity_list
echo "6" > /proc/irq/147/smp_affinity_list
echo "7" > /proc/irq/146/smp_affinity_list
echo "8" > /proc/irq/145/smp_affinity_list
echo "9" > /proc/irq/144/smp_affinity_list
echo "10" > /proc/irq/143/smp_affinity_list
echo "11" > /proc/irq/142/smp_affinity_list
echo "12" > /proc/irq/141/smp_affinity_list
echo "13" > /proc/irq/140/smp_affinity_list
echo "14" > /proc/irq/139/smp_affinity_list
echo "15" > /proc/irq/138/smp_affinity_list
echo "16" > /proc/irq/137/smp_affinity_list
Run Code Online (Sandbox Code Playgroud)
我已将这些行添加到 /etc/rc.local 文件中,但更改并未应用于系统。我还添加了 echo "test" > /root/test ,它被正确执行,所以 rc.local 文件被执行。系统运行的是 Debian 6.0。
查看/proc/interruptsx86 Linux 上的内容,我看到一些中断IO-APIC-edge是IO-APIC-level.
我想知道是什么决定了中断类型,是中断产生设备、中断控制器(APIC)、Linux内核还是BIOS?
(我想知道的原因是因为我将 PCI 卡从双处理器 Pentium III 系统IO-APIC-level移到了双处理器 Xeon 系统,在那里它被识别为IO-APIC-edge)
当定时器中断发生时,ISR 被调用来服务该中断。
是否可以假设每个计时器中断都以调用调度程序结束,下一个进程应该继续运行?
可以概括地说每个中断都必须以调度程序调用结束吗?
如何以编程方式检测设备何时引发中断?这可能发生在设备连接或断开连接时。
\n\n还有这种情况:例如:当手指放在指纹扫描仪上时,会引发中断。如何检测并可能捕获此中断?
\n\n我想使用 Gtkmm 编写一个应用程序,这样当发生事件(例如插入 CD 或插入随身碟)时,我会捕获这些设备引发的中断,并使用它在我的应用程序中执行涉及这些设备的操作。
\n\n如果在 Gtkmm 中无法完成,我可以在较低级别捕获中断并通知 Gtkmm 应用程序吗?
\n\n我正在检查 GParted 的行为方式。它最初显示/dev/sda,当我连接我的随身碟时,它自动打开files应用程序。当我检查 GParted 时,设备的下拉菜单中不存在随身碟。仅当我在 GParted 菜单中选择 \xe2\x80\x9cRefresh Devices\xe2\x80\x9d 或Ctrl+时,它才会出现R。
要终止挂起的作业,我使用Ctrl+c向挂起的作业发送中断信号。有时这不会停止工作,至少不会立即停止。然后我可以使用Ctrl+z暂停作业,然后用kill %1(或任何作业编号)终止它。
为什么+在干扰工作方面比Ctrl+z更强大?有时,甚至+ 都不起作用。在这种情况下是否可以使用其他组合键?CtrlcCtrlz
我试过了stty -a,但列出的其他组合键都没有为我做任何事情。
我在 VMware Enterprise 5.5 中有一个 Linux 场。这些虚拟机(大部分)是 64 位 amd64 Debian Jessie 服务器,带有 SysVinit,而不是 systemd。VM 已安装open-vm-tools。
半虚拟驱动程序是虚拟化平台不必模拟其他设备的驱动程序,例如 Intel E1000 NIC 或 LSI Logic SAS SCSI 适配器。这些半虚拟驱动程序基本上通过放弃模拟层来消除中间人,这通常会导致性能显着提高。
可以lspci | egrep "PVSCSI|VMXNET"看出,以太网和磁盘现在已实现半虚拟化:
3:00.0 Serial Attached SCSI controller: VMware PVSCSI SCSI Controller (rev 02)
0b:00.0 Ethernet controller: VMware VMXNET3 Ethernet Controller (rev 01)
Run Code Online (Sandbox Code Playgroud)
对 is进行 cat 操作/proc/interrupts很容易表明存在与它们相关的中断以及半虚拟化取决于的功能:
56: 6631557 0 PCI-MSI 1572864-edge vmw_pvscsi
57: 72647654 0 PCI-MSI 5767168-edge eth0-rxtx-0
58: 44570979 …Run Code Online (Sandbox Code Playgroud) 我有一个复杂的应用程序,其中 USR1 和 USR2 已定义为具有明确定义且不可替换的用途。
Linux 中有大量不同的信号。是否可能有另一种(可能是已弃用的)可以安全使用,而不会期望操作系统触发破坏性行为?
我在脚本中有以下内容:
yes >/dev/null &
pid=$!
echo $pid
sleep 2
kill -INT $pid
sleep 2
ps aux | grep yes
Run Code Online (Sandbox Code Playgroud)
当我运行它时,输出显示它yes在脚本结束时仍在运行。但是,如果我以交互方式运行命令,则进程将成功终止,如下所示:
> yes >/dev/null &
[1] 9967
> kill -INT 9967
> ps aux | grep yes
sean ... 0:00 grep yes
Run Code Online (Sandbox Code Playgroud)
为什么 SIGINT 在交互式实例中终止进程而不在脚本化实例中终止?
编辑
以下是一些可能有助于诊断问题的补充信息。我编写了以下 Go 程序来模拟上述脚本。
package main
import (
"fmt"
"os"
"os/exec"
"time"
)
func main() {
yes := exec.Command("yes")
if err := yes.Start(); err != nil {
die("%v", err)
}
time.Sleep(time.Second*2)
kill := exec.Command("kill", …Run Code Online (Sandbox Code Playgroud) 我正在通过 O'Reilly 的“理解 Linux 内核”学习 linux 内核,最近涵盖了信号和中断处理章节,坚持一些基本的 2.4 linux 版本,并就我所能理解的代码深入研究。
然而,我无法向自己解释,也无法在别处找到答案,比如说,当 actrl + c被按下以运行在 shell 中的进程时,发生的指令流是什么。
到目前为止我所做的:
char从键盘设备在 APIC 中的寄存器到其他寄存器的按下从这里对我来说很模糊。
不过我确实理解,中断处理不在进程上下文中,而异常在进程上下文中,因此很容易弄清楚异常如何更新current->thread.error_code并current->thread.trap_no最终调用force_sig. 然而,一旦中断处理程序被执行,如上面的例子,它如何最终进入所需进程的上下文并生成信号?