为什么 Alt+SysRq+B 并不总是触发,而 REISU 却总是触发?

为什么 Alt+SysRq+B 并不总是触发,而 REISU 却总是触发?

在许多不同的机器上,当我遇到死机时,我经常使用Alt++来重新启动SysRqREISUB而不会造成太大损失。但我经常注意到,虽然REISU命令即使我只按住Alt+SysRq并输入它们而不释放Alt+也能工作SysRq,但最后一个 ,B似乎非常“懒”:我必须重复很多次,事实上它不会触发直到我多次循环“按Alt+ SysRq,输入B,释放Alt+ SysRq”(并且并不总是相同的次数)。

第一次出现这个问题时,我以为是内核锁定得太紧,以至于它无法“看到”我的B命令,但是当我意识到多次重复它确实允许我触发重新启动时,现在看来这是普遍现象。即使在工作系统上(无论是 Debian、Ubuntu、LFS 等),我也可以轻松地重现这一点。事实上,我什至可以加载内核init=/bin/bash并从这个 bash 提示符中重现这一点。

查看串行控制台输出,我看到 上的所有反馈REISU,但只有一个关于多个命令的反馈打印B— 当内核最终确信要重新启动时。

为什么是这样?是否有某种内核功能可以防止意外重置,或者它只是一个错误(非常奇怪)?

请注意,我使用的是没有Fn多媒体键的普通键盘,所以这个问题不是重复的这个

答案1

问题不在于软件,而在于硬件。键盘按键不是独立的:大约有 100 个按键,但只有大约 26 根电线进入键盘的内部控制器:

在此输入图像描述

(图片来自梦想时光网

这意味着同时按下时并非所有按键都能被检测到。因为比RAlt更接近,所以我总是用它来释放一只手来输入字符。但似乎在大多数(所有?)PC 键盘上++不发送扫描码!*SysRqLAltRAltSysRqBB

为什么我最终会重启?很简单:当我对无法使用这个半工作命令重新启动机器感到非常恼火时,我会在没有太多注意的情况下多次按下组合键,有时会混合按下和释放按键 - 看起来并不是SysRq这样linux 的一个正常修饰符,例如Alt: magic-SysRq 模式即使在我释放后仍然处于活动状态SysRq,但仍然保持Alt。那么似乎有效的顺序是:

  • RAlt
  • SysRq
  • 发布SysRq
  • B
  • 查看重新启动

因为LAlt事情看起来更简单:键盘能够检测B何时按住LAlt+ SysRq,所以没有问题,但我以前从未注意到它,因为我总是使用RAlt

有趣的是,这个问题似乎早已为人所知,并且解决方法与我凭经验发现的方法相同。从内核源码树来看,文档/sysrq.txt(强调我的):

在 x86 上 - 按组合键“ALT-SysRq-<命令键>”。注意 - 某些键盘可能没有标有“SysRq”的键。 “SysRq”键也称为“Print Screen”键。另外,有些键盘无法处理同时按下这么多键,因此您可能会更好地使用“按 Alt”、“按 SysRq”、“释放 SysRq”、“按 <命令键>”、释放所有键。

所以,看起来这个技巧是官方推荐的,而不是实施的不可靠的副作用。

*我实际上已经用一个简单的 DOS 程序检查了这一点,该程序报告每个扫描代码i8042在每个 IRQ1 上给出

相关内容