在运行 Linux 的旧计算机上(使用 vesafb、musl libc、busybox),网上冲浪在内存不足的情况下偶尔会出现段错误。当这样做时,最后一个图像在显示屏上保持可见,并且键入似乎没有任何作用,包括尝试使用 切换 VT Ctrl-Alt-Fx
。我想知道为什么会这样,以及如何解决它。
我可以愉快地通过 SSH 连接到机器并将其关闭,并且 dmesg 中似乎没有任何内容。在具有 Intel GPU、运行 Arch (systemd) 的机器上不会发生这种情况。该行为与描述的类似当程序崩溃时重新初始化帧缓冲区,并且也在使用 SDL。
根据https://dvdhrm.wordpress.com/2013/08/24/how-vt-switching-works/,内核应该处理 VT 切换,所以这种行为对我来说似乎很令人惊讶。
答案1
这是由于 SDL 将终端模式设置为KD_GRAPHICS
并将输入设置为引起的K_MEDIUMRAW
。KD_GRAPHICS
导致终端停止绘制到显示器,同时K_MEDIUMRAW
导致输入作为键码(而不是字符)传递。通过将两个值重置为KD_TEXT
和K_XLATE
或K_UNICODE
,可以(至少部分)恢复终端。
我编写了(基于一些现有代码)一个用于恢复控制台的小程序,它似乎运行良好:https://github.com/hobbitalastair/termfix
也可以看看将视频渲染到帧缓冲区时隐藏虚拟控制台的最佳实践和http://lct.sourceforge.net/lct/x60.html。