我读过,为了根据英特尔的系统编程指南(第3卷第9.9章)暂时关闭分页,我应该先禁用中断,然后再执行其他操作。我可以使用cli轻松禁用可屏蔽中断,但是所有有关禁用NMI的手册都说
NMI中断可以通过外部电路禁用(软件必须保证在模式切换操作期间不会产生异常或中断。)
我在此OSDEV页面上找到了类似于C代码的用于禁用NMI的代码,但我不太明白它的含义。
void NMI_enable() {
outb(0x70, inb(0x70) & 0x7F);
}
void NMI_disable() {
outb(0x70, inb(0x70) | 0x80);
}
Run Code Online (Sandbox Code Playgroud)
感觉代码没有上下文并且在不知道outb和inb函数做什么的情况下是没有意义的。
我在 Windows PC 上使用 Vagrant 在 Virtualbox 中运行 CentOS VM。我已经这样做了 2 年,没有出现任何问题(最初是 CentOS 6,然后是 CentOS 7),但在过去的几个月里,我注意到我的虚拟机开始频繁锁定。并在再次启动时输出这些类型的消息
Message from syslogd@node1 at Jan 25 17:51:55 ...
kernel:NMI watchdog: BUG: soft lockup - CPU#1 stuck for 23s! [C1 CompilerThre:7243]
Run Code Online (Sandbox Code Playgroud)
重复多次。
我认为发生的情况是 NMI 看门狗正在等待中断,并且有一个设定的接收时间,但是如果一个进程正在阻止事情并且它没有得到这个中断,它会假设出现了问题并引发内核恐慌,暂时锁定一些东西。
我遇到过增加NMIkernel.watchdog_thresh=30看门狗/etc/sysctl.conf或完全禁用 NMI 看门狗的选项。我应该考虑尝试其中之一吗?看门狗是否太急切了,或者我可能有一些潜在的问题?发生这种情况时,我的虚拟机上没有太多内容。