当前位置: 首页 > news >正文

从零开始制作 MyOS(六)

从零开始制作 MyOS(六)

今天的任务是:添加异常处理代码——除零操作。

除零操作的过程概述:

C代码中的除零代码被编译成汇编语言,然后CPU在执行的时候发现除数为0后,直接触发除零错误,然后保存上下文,关中断,去读取IDT设置的错误类型是否有对应匹配,如果有就跳转到该错误处理方式。

背景知识

什么是中断

  1. 中断是CPU暂停当前执行流程,转去执行特定处理程序,完成后恢复原流程的机制。
  2. 中断分为硬件中断和软件中断:
    • 硬件中断是由外部设备,比如鼠标,键盘等发出,PIC/APIC 触发;
    • 软件中断是由 CPU 内部事件触发,比如异常:指令执行过程中产生的错误或特殊清空;比如软中断:通过指令 INT n 指令主动触发中断

中断的作用

  1. 实现设备异步通知
  2. 处理紧急事件
  3. 支持多任务调度
  4. 提供系统调用接口

什么异常

异常指CPU在执行指令过程中检测到的特殊条件或错误情况,会自动触发中断处理。

异常分为故障,陷阱,中止

  1. 故障:可修复,修复后可重新执行的异常:比如叶故障,段不存在,堆栈故障
  2. 陷阱:用于调试,执行后可继续下条指令,比如断点,单步执行,溢出等
  3. 中止:一种无法恢复的严重错误,通常需要终止程序,比如有双重故障,机器检查

如何处理异常

在保护模式下,异常通过中断描述符表(IDT) 来处理。IDT包含256个条目,每个条目描述一个中断或异常的处理程序

IDT

中断描述符表(Interrupt Descriptor Table),是 x86 架构在保护模式下用于处理中断和异常的数据结构,定义了 256 个中断向量的处理程序

IDT内存布局:
+----------------+ 0x00000000
| 条目0 | ← 异常0:除零错误
+----------------+
| 条目1 | ← 异常1:调试异常
+----------------+
| 条目2 | ← 异常2:NMI
+----------------+
| ... |
+----------------+
| 条目32 | ← IRQ0:定时器中断
+----------------+
| ... |
+----------------+
| 条目255 | ← 最后的中断向量
+----------------+

异常处理流程

除法指令 → 除数为0 → CPU自动保存状态 → 查找IDT[0] → 跳转到isr0 → 执行异常处理程序

代码

一、数据结构定义

  1. 中断描述符条目 (IDT Entry)
struct idt_entry {uint16_t base_low;    // 处理程序地址低16位uint16_t selector;    // 代码段选择子(0x08 = 内核代码段)uint8_t zero;         // 保留,必须为0uint8_t flags;        // 类型属性(0x8E = 32位中断门)uint16_t base_high;   // 处理程序地址高16位
} __attribute__((packed));

关键参数说明:

  • selector: 0x08 - 指向GDT中的内核代码段
  • flags: 0x8E - 表示32位中断门,DPL=0(最高权限)
  1. 中断帧 (Interrupt Frame)
struct interrupt_frame {uint32_t eip;        // 发生异常时的指令指针uint32_t cs;         // 代码段选择子uint32_t eflags;     // 标志寄存器状态uint32_t esp;        // 栈指针uint32_t ss;         // 栈段选择子uint32_t error_code; // 错误代码(某些异常才有)
};

当异常发生时,CPU会自动将寄存器值压入栈中,形成中断帧

二、IDT 初始化过程

void idt_init(void) {struct idt_ptr idtp;idtp.limit = (sizeof(struct idt_entry) * IDT_ENTRIES) - 1;idtp.base = (uint32_t)&idt;// 设置除零异常处理idt_set_gate(0, (uint32_t)isr0, 0x08, 0x8E);idt_load((uint32_t)&idtp);printf("IDT initialized with divide-by-zero handler\n");
}

关键步骤:

  1. 设置IDT指针(limit和base)
  2. 配置异常0的处理程序为isr0
  3. 使用lidt指令加载IDT

三、汇编异常处理程序


isr0:cli                 ; 关中断,防止嵌套异常pusha               ; 保存所有通用寄存器push esp            ; 传递栈指针(指向中断帧)call divide_by_zero_handler  ; 调用C处理程序; 处理程序不应返回,如果返回则继续执行add esp, 4popasti                 ; 开中断iret                ; 中断返回(不会执行到这里)

寄存器保存的意义:

  1. pusha - 保存EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI
  2. push esp - 将当前栈指针传递给C函数作为中断帧指针

四、C 语言处理异常程序

void divide_by_zero_handler(struct interrupt_frame* frame) {printf("\n=== DIVIDE BY ZERO EXCEPTION ===\n");printf("Instruction Pointer: 0x%x\n", frame->eip);printf("Code Segment: 0x%x\n", frame->cs);printf("Stack Pointer: 0x%x\n", frame->esp);printf("=== SYSTEM HALTED ===\n");// 彻底挂起系统asm volatile("cli");while(1) {asm volatile("hlt");}
}

调试信息的意义:

  1. EIP - 显示触发异常的指令位置
  2. CS - 显示代码段,验证运行在保护模式
  3. ESP - 显示栈指针,帮助调试栈相关问题

开发经验总结

  1. 一直遇到 Qemu 界面窗口闪烁,也就是系统一直在重启
  • 问题是在于 extern void idt_load(void) 声明的时候是不带参数的,而在 interrupt.asm 汇编中,使用了 mov eax, [esp + 4] ; 获取IDT指针 , IDT 参数加载缺失

其他常见问题

  1. 栈帧结构不匹配 - C函数接收到错误参数
  2. 段寄存器未设置 - 在保护模式下调用C函数前需要正确设置数据段
http://icebutterfly214.com/news/20384/

相关文章:

  • 2025济南艺考文化课培训推荐榜:艺考文化课培训,艺考文化课培训机构适配不同艺考生需求
  • 2025大连汽车凹陷修复厂家推荐榜:震城汽车领衔,汽车数据修复厂家靠谱机构守护原厂漆质感
  • 2025大连养老院机构推荐榜:养老院中心、社区养老院守护舒心晚年
  • 阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态
  • 评估工程正成为下一轮 Agent 演进的重点
  • 2025年高性价比宴会会议中心套餐排行榜,靠谱的南京世纪缘宴会中心
  • 2025年关于北京民国老家具回收公司权威推荐榜单:各种品牌家具回收/工艺品木雕材料回收/檀香紫檀回收源头公司精选
  • 做梦
  • 【LVGL】部件 - 基础对象
  • 《白色相簿2》终章-滑雪线小春线玩后感
  • 2025 年安规测试仪源头厂家最新推荐排行榜:综合耐压电气等多类型设备品牌深度测评与靠谱厂家筛选三项/新能源/光伏安规测试仪公司推荐
  • 2025年广州电商交易平台权威推荐榜单:b2b系统/电商平台/企业数字化平台精选
  • 2025年污水处理设备厂家权威推荐榜单:盐湖提锂技术/扩散渗析器/扩散渗析系统源头厂家精选
  • docker容器oshi如何获取宿主机的运行状态信息?
  • doris命令show proc /current_queries;
  • 11.6 考试总结
  • 2025年广东菲律宾家具集运服务权威推荐:广东家具拼柜菲律宾公司/广东家具集装箱菲律宾平台/广东食品海运菲律宾渠道精选
  • 2025年山东地区信誉好的UG编程培训企业推荐:UG编程培训品牌公司全解析
  • 2025中国氨基酸表面活性剂企业排行榜:长沙普济生物科技靠不靠谱?
  • 2025东北拉弯加工厂家推荐白皮书,赢鑫拉弯加工厂家介绍
  • 2025年医院集中供氧系统厂家权威推荐榜单:中心供氧系统工程/空气终端/专业医疗设备带源头厂家精选
  • 关于模拟赛记录
  • 2025年安全检测检验公司推荐榜前十名:专业洞察与选择指南
  • 开发管理
  • 维修厂家推荐排行榜单2025:权威评测
  • 2025年市面上冷再生机实力厂家推荐排行
  • 2025年建筑装潢垃圾分选机制造厂权威推荐:装潢垃圾处理设备/固体垃圾处置系统/陈腐垃圾处理设备源头厂家精选
  • containerd搭建与配置
  • 静默复制淘口令小程序系统:淘客高效推广的全新解决方案
  • 实用指南:ICRA-2025 | 机器人具身探索导航新策略!CTSAC:基于课程学习Transformer SAC算法的目标导向机器人探索