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

切换到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 06:54:01