切换到x86保护模式后设置ss寄存器触发三重故障问题求助
问题原因
你的故障根源是GDT数据段描述符的标志位配置错误:gdt.asm中的gdt_data段访问标志设置成了代码段的参数:db 10011010b,该值对应的TYPE字段为1010,代表可执行的代码段,不能被加载到栈段寄存器ss、数据段寄存器ds等数据类段寄存器中。CPU在加载段寄存器时会校验段描述符的权限与类型,类型不匹配会直接触发异常,异常处理流程无法找到合法的处理入口就会触发三重故障。
修复方案
将gdt_data的访问标志位修改为数据段对应的配置即可:
; 原错误配置 ; db 10011010b ; 修正后的数据段配置:TYPE字段为0010,代表可写、向上增长的普通数据段 db 10010010b
其他注意点
你的代码中mov ax, DATA_SEG ; 0x1000的注释有误,按照你的GDT定义,DATA_SEG的值是0x10(第二个GDT项的偏移量),该注释错误不影响运行,但排查问题时容易产生误导。
你看到的日志中SS.mode = 16 bit是故障触发前的状态,远跳转执行后CS已经切换为32位模式,只是加载SS时因为段类型错误失败,才保留了之前的16位模式标识,不是故障的根本原因。
内容的提问来源于stack exchange,提问作者Alice F
相关产品推荐
相关产品推荐

