# my_OS **Repository Path**: xiao-yang-lab/my_OS ## Basic Information - **Project Name**: my_OS - **Description**: No description available - **Primary Language**: C - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-03-14 - **Last Updated**: 2026-03-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MyOS - 小型 x86 操作系统 一个从零开始编写的 32 位 x86 操作系统,包含引导加载程序、内核加载器和 VGA 驱动。 ## 项目结构 ``` my_os/ ├── src/ # 源代码 │ ├── boot.asm # 引导加载程序 (16 位实模式) │ ├── loader.asm # 内核加载器 (32 位保护模式) │ ├── kernel.c # C 语言内核主函数 │ └── vga.c # VGA 文本驱动 ├── include/ # 头文件 │ ├── types.h # 基本类型定义 │ └── vga.h # VGA 驱动头文件 ├── build/ # 构建输出目录 ├── kernel.ld # 链接脚本 ├── Makefile # 构建脚本 └── README.md # 本文件 ``` ## 功能特性 - ✅ **BIOS 引导扇区** - 实模式下的"Hello World"消息 - ✅ **保护模式** - 从 16 位实模式切换到 32 位保护模式 - ✅ **全局描述符表 (GDT)** - 设置代码段和数据段 - ✅ **VGA 文本驱动** - 在 VGA 显存 (0xB8000) 直接写入文字 - ✅ **Freestanding 环境** - 无依赖于标准库 (libc) - ✅ **屏幕滚动** - 处理文本超过屏幕时的换行和滚屏 ## 系统要求 ### Windows (使用 WSL2) 1. **安装 WSL2 和 Ubuntu**: ```powershell wsl --install -d Ubuntu-20.04 ``` 2. **安装构建工具** (在 WSL2 中): ```bash sudo apt update sudo apt install build-essential nasm qemu-system-x86 ``` ### Ubuntu / Linux (原生开发) ```bash sudo apt update sudo apt install build-essential nasm qemu-system-x86 gcc-multilib ``` ### macOS ```bash brew install nasm qemu ``` ## 构建和运行 ### 1. 构建操作系统镜像 ```bash cd my_os make all ``` 这将生成 `build/os.img` 软盘镜像。 ### 2. 运行操作系统 ```bash make run ``` QEMU 将启动并运行你的操作系统。你应该看到: - 引导加载程序打印的欢迎消息 - 内核打印的初始化信息 - VGA 文本驱动的输出 ### 3. 调试模式 启动带 GDB 调试支持的 QEMU: ```bash make debug ``` 然后在另一个终端连接 GDB: ```bash gdb build/kernel.elf (gdb) target remote localhost:1234 (gdb) break kernel_main (gdb) continue ``` ### 4. 清理构建文件 ```bash make clean ``` ## 代码说明 ### boot.asm - 引导加载程序 - 位于 0x7C00 (BIOS 加载地址) - 使用 BIOS 中断 `int 0x10` 打印字符 - 最后填充到 512 字节,末尾为启动签名 `0x55AA` - 跳转到 0x8000 处的内核加载器 ### loader.asm - 内核加载器 - 设置全局描述符表 (GDT),包含代码段和数据段 - 使用 `lgdt` 指令加载 GDT - 设置 CR0 寄存器的 PE 位进入保护模式 - 远跳转刷新指令缓存 - 初始化 32 位段寄存器和栈 - 调用 C 语言的 `kernel_main()` 函数 ### kernel.c - 内核主函数 - `kernel_main()` 是 C 代码的入口点 - 初始化 VGA 驱动 - 打印欢迎消息和系统信息 - 进入无限循环,等待中断 ### vga.c / vga.h - VGA 文本驱动 - 直接操作 VGA 显存 (0xB8000) - 支持 80x25 文本模式 - 功能: - `vga_init()` - 初始化驱动 - `vga_clear()` - 清屏 - `vga_putchar()` - 输出单个字符 - `vga_write_string()` - 输出字符串 - `vga_set_color()` - 设置文字颜色 - 自动处理换行和滚屏 ## 编译流程 1. **汇编** - NASM 将 `.asm` 文件编译为二进制或 ELF 对象文件 2. **C 编译** - GCC 将 `.c` 文件编译为 ELF 对象文件 3. **链接** - LD 使用 `kernel.ld` 链接脚本将所有对象文件链接 4. **转换** - objcopy 将 ELF 内核转换为原始二进制格式 5. **镜像生成** - dd 命令创建 1.44MB 软盘镜像,放入引导扇区和内核 ## 架构设计 ``` Memory Layout: 0x00000000 +-----------+ | IVT | (中断向量表, BIOS使用) +-----------+ | ... | +-----------+ 0x00007C00 +-----------+ | Boot | (引导扇区, 512 字节) | Sector | +-----------+ 0x00007E00 | ... | +-----------+ 0x00008000 +-----------+ | Loader | (内核加载器) | & Kernel | (内核, GDT, 代码, 数据等) | & Drivers | +-----------+ 0x00090000 +-----------+ | Stack | (向下增长) +-----------+ | Free | | Memory | +-----------+ 0xB8000 +-----------+ | VGA | (VGA 显存) | Buffer | (80x25 文本模式) +-----------+ 0xB8FA0 ``` ## 常见问题 ### Q: QEMU 无法启动? A: 确保已安装 `qemu-system-x86`。在 WSL2 中,可能需要运行 `sudo update-alternatives --install /usr/bin/qemu-system-i386 qemu-system-i386 /usr/bin/qemu-system-x86_64 100`。 ### Q: 编译失败,说找不到 `gcc`? A: 安装 `build-essential` 和 `gcc-multilib` (用于 32 位编译支持)。 ### Q: 如何修改内核代码? A: 编辑 `src/kernel.c` 或 `src/vga.c`,然后运行 `make run`。 ### Q: 能否添加更多功能? A: 可以!下一步可以添加: - 中断处理 (IDT 设置) - 键盘输入驱动 - 简单的文件系统 - 进程/线程管理 - 内存管理单元 (MMU) 支持 ## 参考资源 - [OSDev.org](https://wiki.osdev.org/) - 操作系统开发文档 - [xv6](https://github.com/mit-pdos/xv6-public) - MIT 教学操作系统 - [Linux 0.11](https://github.com/kaeptn0/linux0.11) - 早期 Linux 内核源码 - [Intel x86 Manual](https://www.intel.com/content/www/en/en/developer/articles/technical/intel-sdm.html) - Intel 处理器手册 ## 许可证 MIT License ## 作者 MyOS Project - 小型操作系统教学项目