尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
从零手写X86操作系统:实模式到保护模式实战
1. 项目概述为什么要手写X86操作系统2008年我在大学计算机实验室第一次见到GRUB引导界面时就被操作系统启动过程的神秘感深深吸引。当时教授说理解操作系统最好的方式就是自己写一个。如今十五年过去我依然记得在QEMU模拟器上看到自己编写的Hello OS成功启动时的激动心情。这个项目将带您从零构建一个能通过U盘启动的X86操作系统内核。不同于市面上大多数教程只停留在理论层面我们将完整实现以下核心功能实模式到保护模式的切换含GDT构建物理内存管理简易版页表实现键盘中断处理PS/2控制器编程VGA文本模式输出直接操作显存简易文件系统FAT16格式支持注意本教程需要读者具备C语言基础和基本的计算机组成原理知识特别是对寄存器、内存地址等概念的理解。完全零基础者建议先学习《深入理解计算机系统》CSAPP前四章。2. 开发环境搭建2.1 工具链选型经过对比测试我推荐以下开发工具组合编译器GCC交叉编译工具链target: i686-elf模拟器QEMU版本≥5.0调试器GDB with QEMU远程调试磁盘工具ddLinux或 RufusWindows# Ubuntu环境安装示例 sudo apt install qemu-system-x86 gcc-i686-elf nasm mtools2.2 项目目录结构建议采用模块化代码组织方式os-project/ ├── boot/ # 引导程序 │ ├── boot.asm # BIOS引导扇区 │ └── loader.asm # 二级加载器 ├── kernel/ # 内核代码 │ ├── main.c # 内核入口 │ └── include/ # 头文件 ├── scripts/ # 构建脚本 └── diskimg/ # 生成的磁盘镜像3. BIOS引导实现3.1 引导扇区开发BIOS会将磁盘第一个扇区512字节加载到内存0x7C00处执行。这段代码必须以0xAA55结束Magic Number使用16位实模式汇编禁用中断cli设置栈指针sp0x7C00; boot.asm [bits 16] [org 0x7C00] start: cli mov ax, 0 mov ds, ax mov es, ax mov ss, ax mov sp, 0x7C00 sti ; 加载第二段加载器 mov bx, 0x7E00 mov ah, 0x02 mov al, 4 ; 读取4个扇区 mov ch, 0 ; 柱面0 mov cl, 2 ; 从第2扇区开始 mov dh, 0 ; 磁头0 int 0x13 jmp 0:0x7E00 ; 跳转到loader times 510-($-$$) db 0 dw 0xAA55经验现代BIOS默认从USB设备模拟的FDD模式启动因此磁盘CHS参数需要特别处理。建议先用QEMU测试再烧录U盘。3.2 二级加载器设计由于引导扇区空间有限我们需要二级加载器完成检测内存布局通过BIOS中断0x15启用A20地址线解决8086兼容性问题加载GDT并进入保护模式将内核从磁盘加载到1MB以上内存// loader.c关键片段 void enable_a20() { // 通过键盘控制器启用A20 while (inb(0x64) 0x2); outb(0x64, 0xD1); while (inb(0x64) 0x2); outb(0x60, 0xDF); }4. 内核核心功能实现4.1 保护模式初始化进入32位保护模式需要构建全局描述符表GDT加载GDTR寄存器设置CR0寄存器PE位struct gdt_entry { uint16_t limit_low; uint16_t base_low; uint8_t base_middle; uint8_t access; uint8_t granularity; uint8_t base_high; } __attribute__((packed)); void load_gdt() { struct gdt_ptr gp; gp.limit sizeof(gdt) - 1; gp.base (uint32_t)gdt; asm volatile(lgdt %0 : : m(gp)); }4.2 内存管理简易物理内存管理器实现思路通过GRUB或自行检测内存大小维护空闲页帧位图实现kmalloc/kfree接口#define PAGE_SIZE 4096 struct page_frame { uint32_t addr; uint8_t used; }; void* kmalloc(size_t size) { uint32_t pages (size PAGE_SIZE - 1) / PAGE_SIZE; // 在位图中查找连续空闲页... }4.3 中断处理X86中断控制器编程步骤配置8259A PIC或APIC设置IDT中断描述符表实现中断服务例程ISRvoid isr_handler(struct regs *r) { if (r-int_no 33) { // 键盘中断 uint8_t scancode inb(0x60); handle_keypress(scancode); } outb(0x20, 0x20); // EOI }5. U盘启动适配5.1 镜像生成与烧录制作可启动镜像的完整流程创建空白磁盘镜像dd if/dev/zero格式化为FAT16mkfs.fat安装GRUB或直接写入引导扇区拷贝内核文件# 生成镜像示例 dd if/dev/zero ofos.img bs1M count32 sudo losetup /dev/loop0 os.img sudo mkfs.fat -F16 /dev/loop0 sudo mount /dev/loop0 /mnt sudo cp kernel.bin /mnt sudo umount /mnt sudo losetup -d /dev/loop05.2 主流BIOS兼容性处理不同厂商BIOS的特殊处理Dell/联想可能需要关闭Secure Boot华硕注意USB Legacy Support设置虚拟机确保选择正确的BIOS类型避坑指南如果U盘无法被识别为启动设备尝试以下步骤使用USB 2.0接口非蓝色在BIOS中将USB模式设为Full Initialization换用Ventoy等新型启动工具6. 调试技巧与常见问题6.1 QEMU调试方法启动调试会话qemu-system-i386 -s -S -drive formatraw,fileos.img # 另开终端 gdb -ex target remote localhost:1234常用调试命令info registers查看寄存器状态x/10i $eip反汇编当前指令break *0x7C00在引导扇区设断点6.2 典型问题排查三重错误Triple Fault检查GDT/IDT设置是否正确确认栈指针未越界屏幕无输出验证VGA显存地址0xB8000检查CR0 PG位是否过早启用键盘中断不触发确认PIC初始化序列检查键盘控制器状态端口0x647. 进阶开发建议完成基础内核后可以考虑添加ELF加载器支持用户程序实现分页内存管理MMU增加系统调用接口int 0x80移植Newlib标准库我在实际开发中发现最耗时的不是功能实现而是各种硬件兼容性问题。建议购买一个便宜的旧笔记本如ThinkPad X220作为专用测试机比虚拟机调试效率高很多。
RELATED

相关推荐

2026最新:新媒体人怎么提取抖音视频文案?3款免费亲测实用神器

2026最新:新媒体人怎么提取抖音视频文案?3款免费亲测实用神器

先按场景给答案 2026年新媒体人提取抖音视频文案,不需要复杂的录屏转音频操作,目前有3款免费工具可以满足不同场景需求。我作为长期测试AI效率工具的博主,亲测了市面主流工具后按场景匹配给出推荐,不是绝对排名,职场新…

📅 2026/9/8 19:12:09
12. 光刻机和半导体 ArF浸没光刻胶:水痕、气泡类浸没缺陷长效抑制

12. 光刻机和半导体 ArF浸没光刻胶:水痕、气泡类浸没缺陷长效抑制

Sorting Logic: English (Global Standard) → Chinese (Original Context) → German (Precision Engineering) 12. ArF Immersion Photoresist: Suppression of Water Marks & Bubble-Induced Defects World-Class Hard Tech R&D Roadmap 2026 Version: 1.0 (Hardcor…

📅 2026/9/10 6:34:37
Linux包管理工具YUM详解:从基础配置到高级应用

Linux包管理工具YUM详解:从基础配置到高级应用

1. YUM命令概述与核心价值在RPM系Linux发行版中,yum(Yellowdog Updater Modified)作为经典的包管理工具,其重要性不亚于Debian系的apt。我第一次接触yum是在2008年维护CentOS 5服务器时,当时就被它自动解决依赖关系的特…

📅 2026/9/10 17:55:45
MORE NEWS

更多资讯

📰

NRBO-RBF神经网络优化算法在预测模型中的应用

1. 项目概述:NRBO-RBF神经网络回归预测模型 在工程预测和数据分析领域,RBF(径向基函数)神经网络因其出色的非线性拟合能力而广受青睐。但传统训练方法容易陷入局部最优,这正是我们引入牛顿-拉夫逊优化算法(NRBO)的出发…

📰

Python智能文献管理系统设计与实现

1. 项目背景与核心价值作为一名长期从事学术研究的Python开发者,我深刻理解文献管理对科研工作者的重要性。传统文献管理方式存在几个痛点:手动整理耗时费力、跨平台同步困难、智能检索功能缺失。这个基于Python的智能文献管理系统正是为解决这些问题而生…

📰

Asahi Linux 适配 M3 MacBook Pro:现状、短板与安装避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

从RAG到上下文工程:知识管理的范式迁移与接口化实践

1. 项目概述:从RAG到上下文工程的范式迁移在AI智能体快速发展的当下,我们正经历着知识管理方式的根本性变革。传统RAG(检索增强生成)技术将知识库视为被动的数据仓库,通过向量检索机械地抓取文本片段注入大模型上下文。…

📰

融合YOLOv5与霍夫变换的车道线检测方案详解

简介:基于YOLOv5与霍夫变换的车道线检测Python项目,将深度学习目标检测与传统图像处理相结合:YOLOv5负责车辆等目标识别,霍夫变换完成车道线提取,车道线部分无需额外的数据集训练,有效降低学习与使用门槛。…

📰

综述不是“读了多少”,是“看出什么”:书匠策AI把文献变成了可操作的关系网络

官网:www.shujiangce.com | 微信 公众号 :书匠策AI 书匠策AI官网www.shujiangce.com 微信公众号搜一搜 书匠策AI 你花了三天读完三十篇文献,每一篇都做了笔记,摘要划了,结论记了。然后你坐在电脑前,试…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬