OSDEV开发:向PS2键盘发送0xF4启用扫描命令导致系统崩溃
问题分析与解决思路
1. 明显的代码逻辑错误
- 你当前贴出的主流程代码中,
initPS2()执行完成后直接加了while(1);死循环,若这段代码未被注释/删除,程序根本不会执行到后续的initKeyboard()逻辑,先确认这行是调试残留代码,测试时务必删除。 - PS2初始化逻辑中,给第二端口发送重置命令
0xFF没有做双通道存在判断:你在启用端口时做了dual == 1的判断才启用第二端口,但后续直接无条件调用writeToSecondPS2Port(0xFF),单通道控制器下该操作会触发PS2控制器异常,直接导致后续通信失败。需要将第二端口重置逻辑也加上dual == 1的判断。
2. PS2控制器配置错误
- 你修改PS2配置字节时直接
status |= 0b01000011,其中配置字节的位0、位1分别对应第一、第二PS2端口的中断使能。在你未完成PIC中断掩码配置、未注册好稳定的IRQ处理函数前就提前打开PS2控制器的中断输出,会导致后续PIC打开中断时直接收到未处理的中断请求,触发异常。建议初始化阶段先不要置位这两个中断位,等键盘初始化完成、PIC配置完成后,再修改配置字节打开对应端口的中断。
3. 键盘重置响应读取不完整
- 你给键盘发送
0xFF重置命令后,键盘的完整响应是先返回应答0xFA,自检完成后再返回0xAA,你当前只读取了1个字节的响应,剩余的0xAA会残留在PS2数据缓冲区中。后续你发送0xF4命令后读取响应时,会先读到残留的0xAA,而不是0xF4对应的应答0xFA,直接导致commandKeyboard函数的重试逻辑被触发,甚至在等待响应的逻辑里死循环。修改方案为发送0xFF重置后,连续读两个响应字节,确认都是正确值再继续后续流程。
4. 中断配置顺序错误
- 你当前的配置顺序是先执行PS2/键盘初始化,再配置PIC中断掩码开中断。正确的顺序应该是:先完成PIC初始化、IRQ处理函数注册、PIC中断掩码配置(先屏蔽不需要的中断,只保留你需要的IRQ1等),再执行PS2控制器初始化、键盘初始化,最后执行
sti开中断,避免未准备好时收到中断请求触发异常。
5. 调试建议
- 在
readPS2DataPort、writeToFirstPS2Port等函数中加入超时逻辑,避免控制器异常时进入无限等待,方便定位是哪一步出现了通信超时。 - 初始化阶段临时关闭PS2端口中断,用轮询方式读取0x60端口的响应数据,确认所有命令的返回值都符合预期后,再切换到中断模式。
内容的提问来源于stack exchange,提问作者Özgür Güzeldereli
相关产品推荐
相关产品推荐

