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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:48:17