You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:06:04