IRQ1中断服务程序(ISR)中变量/内存地址无法更新问题求助
问题分析与解决
你的IRQ1中断服务程序(ISR)能正常触发执行,但无法更新任意内存地址,核心原因大概率是段寄存器未正确配置。pusha指令仅保存通用寄存器(EAX/EBX/ECX/EDX/ESI/EDI/EBP/ESP),但中断触发时DS等段寄存器可能指向非内核数据段(比如用户态段),导致你访问的0xB8100是基于当前DS段的偏移地址,而非预期的物理/线性内存地址。
修复方案
在ISR开头保存当前DS寄存器,手动切换到内核数据段,操作完成后恢复原DS:
_IRQ1_ISR : pusha ; 保存当前DS并切换到内核数据段 push ds mov ax, 0x10 ; 替换为你实际使用的内核数据段选择子(通常GDT中代码段+8) mov ds, ax mov ebx,0xb8050 mov al,byte[0xB8100] add al,1 mov byte[0xb8100],al mov byte[ebx],al ; 恢复原DS寄存器 pop ds ; 发送EOI信号 mov al, 0x20 out 0x20, al popa iret
额外排查点
- 确认GDT中内核数据段的基地址为0、限长足够覆盖目标内存区域,保证线性地址直接映射到物理地址。
- 若启用分页,检查目标内存对应的页表项是否标记为可写,避免只读权限限制。
- 确认IRQ1的中断门描述符特权级配置正确(内核态ISR需设为特权级0),防止权限不足导致内存访问失败。
内容的提问来源于stack exchange,提问作者Djebbar Abderrahmene
相关产品推荐
相关产品推荐

