未检测到键盘,F1恢复

时间:2013-10-30 06:26:41

标签: keyboard operating-system bios motherboard

我的朋友正在建立一个带有消费级桌面设备的无头服务器,他遇到了这个错误,这个错误无疑让很多人以前看过或读过,但有人真的知道它为什么存在吗?

如果没有检测到键盘或键盘控制器出错,你怎么可能按某些东西才能恢复?

这是几个BIOS制造商采用的某种复活节彩蛋,还是有一个真正的原因,为什么常见的默认BIOS设置是在没有检测到键盘时不允许计算机启动,然后期望启动过程通过某种方式按键恢复?

[example from the Internet] http://p.twimg.com/AsWYydvCEAAiAHL.jpg:large

我的意思是认真的。

2 个答案:

答案 0 :(得分:3)

在很多情况下,邮件遗留在传统时代。

现在,使用PS2键盘和智能控制器,无论如何都不可能在没有重启的情况下更换键盘,即使大多数USB也必须交换,然后在发生引导错误时重新上电。

然而,在整个PC革命开始的那一天,键盘被称为“XT或AT键盘”(取决于风格),而且大多数都有一个非常愚蠢的连接。

同样在大多数这些设备中,键盘控制器本身并不是那么聪明,首先它通常实际上是在PC主板上,而不是在键盘上(因为它们往往是今天)所以键盘本身真的非常愚蠢,如果发生了实际的物理键盘故障,那么经常拔掉它,插入一个工作的键盘并按照说明进行操作。

因此,在许多情况下,只要故障确实是一个真正的键盘故障,这实际上是可以遵守的。

这是一个已经发布的替代视图,从早期PC维修行业工作人员的角度来看,修复和构建早期的286/386和486基于PC以及解决问题。

答案 1 :(得分:2)

从实现的角度来看,大多数BIOS POST例程的结构如下(POST =开机自检):

InitializeChipset();
if(ErrorDetected()) {
    printf("Chipset error\n");
    HandleError();
}

InitializeMemoryController();
if(ErrorDetected()) {
    printf("Memory error\n");
    HandleError();
}

InitializeKeyboardController();
if(ErrorDetected()) {
    printf("Keyboard not found\n");
    HandleError();
}

InitializeHardDisk();
if(ErrorDetected()) {
    printf("Hard disk error\n");
    HandleError();
}

...

void HandleError() {
    if(UserSettings.WaitForKeyPress) {
        printf("Press F1 to Resume\n");
        getch();
        ...
    }
}

请注意,上面的代码是 HUGE 过分简化了BIOS的工作原理。另请注意,屏幕截图中的BIOS是用x86程序集编写的(看起来不像是AMI Aptio UEFI)。

基本上,如果检测到错误,代码将跳转到“按F1恢复”的通用错误处理程序。在大多数情况下,此错误处理程序的行为是合适的,除非没有连接键盘。它可以更好地编码,但BIOS工程师可能很懒惰。

至于为什么是丢失的键盘被认为是错误:当BIOS启动时,它会测试系统硬件,包括键盘控制器。键盘控制器测试失败,因为没有检测到键盘。在你的情况下,故障是预期的,但它也可能指向一个破碎的键盘或主板,这对于台式机/笔记本电脑来说是一件坏事。

出于这个原因,较新的BIOS将包含一个选项,可以在没有连接键盘时跳过此错误消息。通常它类似于“除了键盘之外的所有错误”。此外,服务器级设备或嵌入式系统上的BIOS通常是为无头操作定制的,并且通常会默认绕过此错误消息。