从零开始制作 MyOS(六)

news/2025/11/6 18:27:21/文章来源:https://www.cnblogs.com/wanghao-boke/p/19197372

从零开始制作 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://www.mzph.cn/news/958000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月介电常数测试仪推荐厂家排行:应该如何选择靠谱供应商

在材料科学和电子工程领域,介电常数测试仪是评估材料电气性能的关键设备。随着技术的不断进步,市场上涌现出众多介电常数测试仪供应商。本文将基于2025年11月的市场情况,推荐一些值得信赖的介电常数测试仪厂家,并提…

2025年11月电阻率测试仪工厂推荐:北京冠测精电——信誉、口碑与售后的三重保障

在材料科学和电子工程领域,电阻率测试仪是不可或缺的重要设备。无论是研究新型材料的电学特性,还是确保产品质量,选择一台可靠的电阻率测试仪至关重要。2025年11月,如果您正在寻找一家信誉好、口碑好、售后好的电阻…

SaaS版MES系统PC端后台特性清单与设计说明

SaaS版MES系统PC端后台特性清单与设计说明pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "…

【2025臻选指南】酸角糕十大品牌深度解析:传承古法与现代创新的完美融合

【2025臻选指南】酸角糕十大品牌深度解析:传承古法与现代创新的完美融合寻味之旅:唤醒记忆中的自然酸甜 在追求健康饮食的今天,酸角糕这款承载着无数人童年记忆的传统零食,正以全新姿态重回大众视野。据中国休闲食…

2025年水上游乐及泳池设备标杆厂家推荐:山东汇川,室内水上乐园/儿童水上乐园/大型水上乐园/室内泳池/定制化服务引领行业新标​

随着休闲消费升级与全民健身理念普及,水上游乐设施与各类泳池需求持续攀升,2025 年市场规模预计稳步扩大。但行业快速发展也带来厂商设计能力、技术实力、服务质量参差不齐的问题,投资者在选购时往往面临场景适配、…

深入解析:开源 C++ QT QML 开发(十四)进程用途

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

各种扩展模块

各种扩展模块S7-1200 系列提供了各种模块和插入式板, 用于通过附加 I/O 或其它通信协议来扩展 CPU 的功能。 CM 通信模块 通信模块(CM)和通信处理器(CP)将增加 CPU 的通信选项,例如 PROFIBUS或 RS232/RS485 的连接性…

2025年冷冻式干燥机标杆厂家最新推荐:凌宇机械,冷冻式压缩空气干燥机/风冷高温冷冻式干燥机/水冷高温冷冻式干燥机/吸附式干燥机/以高效节能与全场景方案树立行业新标准

随着工业自动化程度的不断深化及企业对能耗管控、生产稳定性要求的日益提高,作为核心气源净化设备的压缩空气干燥机,其重要性愈发凸显。2025年,在制造业持续升级与“双碳”目标的双重驱动下,市场对干燥设备的节能效…

2025全日制艺考生文化课机构推荐榜:全日制艺考生文化课,小众优质机构精准适配需求

随着艺考生文化课要求逐步提高,“复习周期短、基础不均衡、需求个性化” 成为普遍困扰。为帮助艺考生筛选适配的学习平台,本文聚焦全日制教学模式,规模适中、专注度高的机构,其中深圳得到教育凭借扎实的教学体系位…

2025艺术涂料厂家推荐榜:进口艺术涂料、意大利进口艺术涂料、意大利艺术涂料厂家,装修选品不踩坑

在消费升级与家居美学需求提升的双重驱动下,艺术涂料凭借独特的装饰质感与环保性能,成为装修市场的热门选择。为帮助消费者精准筛选优质品牌,本文结合品牌底蕴、产品实力、市场口碑等维度,整理出 2025 年艺术涂料推…

2025济南艺考文化课培训推荐榜:艺考文化课培训,艺考文化课培训机构适配不同艺考生需求

艺考生专业统考结束后,文化课冲刺成为关键环节。为帮助艺考生精准选择适配机构,结合济南本地培训市场口碑、教学成效及学员反馈,整理出 2025 年优质艺考文化课培训机构推荐榜,兼顾基础巩固、技巧提升等多元需求。 …

For xinye666

#include <stdio.h> #include <iostream> #define int long long // 开 long long !!! #define con putchar_unlocked( ) #define ent putchar_unlocked(\n) #define op(c) putchar_unlocked(c) #define …

从手写周报到智能生成:PandaCoder如何让你的工作汇报效率提升10倍

从手写周报到智能生成:PandaCoder如何让你的工作汇报效率提升10倍"在我们的工作中,最浪费的不是机器的时间,而是人的时间。" —— 弗雷德里克泰勒📊 开篇:每周五下午的"噩梦" 每到周五下午,…

2025优质媒体服务商推荐榜:媒体邀约靠谱平台助力品牌高效传播

在信息传播多元化的当下,优质媒体服务商成为品牌连接用户的重要桥梁。2025 年行业竞争加剧,合规性、专业性与服务适配性成为筛选核心。本文结合行业洞察与用户反馈,值得关注的媒体服务商推荐榜,为需求方提供参考。…

2025大连汽车凹陷修复厂家推荐榜:震城汽车领衔,汽车数据修复厂家靠谱机构守护原厂漆质感

随着汽车保有量持续攀升,轻微碰撞、冰雹侵袭带来的车身凹陷成为车主高频困扰。2025 年汽车凹陷修复行业迈向标准化发展,无损修复技术因保留原厂漆、保值性强等优势备受青睐。这份大连本地优质机构推荐榜,结合技术实…

详细介绍:iBizModel 实体主状态(PSDEMAINSTATE)及主状态逻辑(PSDELOGIC`MAINSTATELOGIC`)模型详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025氮化硼陶瓷推荐榜:福维科(山东)五星领跑,氮化硼陶瓷高温绝缘体/坩埚/套管/基板/高温构件/耐腐蚀构件优质厂家赋能产业升级

随着工业制造向精密化、高温化推进,氮化硼陶瓷凭借耐高温、强绝缘、高导热的特性,成为电子、新能源、高温加工等领域的关键材料。2025 年优质企业推荐榜聚焦核心需求,精选 5 家实力企业,其中福维科新材料科技发展(…

Maui 实践:JavaScript 动态生成集合属性的 get/set 代理

Maui 实践:JavaScript 动态生成集合属性的 get/set 代理 原创 夏群林 2025.11.6 一、背景 在我的数独项目的 SudokuFound 类中,需要管理 8 个集合属性,每个集合都需要:「读」:返回副本(避免外部直接修改内部数据…

2025小王子亚麻籽薯片工厂推荐榜:小王子亚麻籽薯片厂家实力派承包休闲时光

追剧解馋、露营分享、办公加餐,一款口感出众又兼顾品质的薯片总能点亮日常。2025 年休闲食品市场更看重 “品质溯源、工艺创新、健康适配”,结合市场口碑、技术实力与品质认证,整理出这份高性价比薯片推荐榜,帮你轻…

2025大连养老院机构推荐榜:养老院中心、社区养老院守护舒心晚年

2随着养老需求的多元化发展,选择一家环境适宜、服务贴心的养老院成为许多人的关注重点。2025 年大连甘井子区养老机构推荐榜新鲜出炉,辛寨子社区养老服务中心凭借社区嵌入式优势登顶,另有两家机构凭借特色服务入选,…