# onix **Repository Path**: 58291/onix ## Basic Information - **Project Name**: onix - **Description**: Onix 操作系统是一个开源的操作系统实现项目. 在作者的基础上完成了 系统引导加强;驱动加强: AHCI SATA 硬盘控制器,声卡支持(SB16加强、AC97、HDA、CMI8x38、ES1371),USB2.0U盘驱动(支持U盘启动,只支持USB2.0,需要USB2.0控制器和USB2.0以上的U盘);bug修复;程序功能加强:增加mp3播放器等(见另外项目)。 - **Primary Language**: C - **License**: MIT - **Default Branch**: dev - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-14 - **Last Updated**: 2026-07-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Onix - 操作系统实现 ![](./docs/others/images/snapshot.png) ![](./docs/others/images/snapshot2.png) - [本项目基于 StevenBaby/onix](https://github.com/StevenBaby/onix) 原项目基础上新增实现了 - 驱动: AHCI SATA 硬盘控制器,、 - 声卡支持(SB16加强、AC97、HDA、CMI8x38、ES1371) - USB2.0U盘驱动(支持U盘启动,只支持USB2.0,需要USB2.0控制器和USB2.0以上的U盘) - bug修复 - 程序功能加强 - 程序增加mp3播放器(见另外项目) - [相关 bilibili 视频](https://www.bilibili.com/video/BV1gR4y1u7or/) - [参考文献](./docs/others/参考文献.md) ## 主要功能 - 系统引导: - [x] bootloader - [x] multiboot2 - 设备驱动: - [x] PIC 8259 中断控制器 - [x] PIT 8254 定时计数器 - [x] 蜂鸣器 - [x] CMOS 时钟 / 实时时钟 - [x] CRTC 控制台 `0xb8000` - [x] PS/2 键盘 - [x] 串口设备 - [x] CPU 功能检测 - [x] FPU 浮点处理单元 - 磁盘驱动: - [x] IDE 硬盘 (PIO) - [x] IDE 硬盘 (UDMA) - [x] AHCI SATA 控制器 - [x] RAMDisk 内存磁盘 - 网卡驱动: - [x] e1000 网卡 - [ ] RTL8139 网卡 - 光盘驱动 - [x] ATAPI 光盘 - 声卡驱动: - [x] SB16 - [x] AC97 - [x] HDA(Intel) - [x] CMI8x38 (🐛 某些情况下音频播放偶发卡顿) - [x] ES1371(86box 下当前无声) - [x] 软盘驱动 - [x] PCI 总线枚举 - [ ] PS/2 鼠标 (🌱 panda) - [ ] VESA 图形驱动 (🌱 panda) - [ ] ACPI:控制关机和重启 (🌱 实验性) [@lihanrui2913](https://github.com/lihanrui2913) (🌱 acpi) - USB驱动: - [x] EHCI 控制器 (高速) 🌱 实验性 - [x] Hub 支持 (高速 Hub 轮询) 🌱 实验性 - [x] Mass Storage / U 盘 (基于 Bulk + SCSI) 🌱 实验性 - [ ] HID (键鼠) - [ ] OHCI / UHCI 控制器 - 内存管理: - [x] 保护模式和全局描述符 - [x] **页映射**(核心功能) - [x] 堆内存管理 - 任务管理: - [x] **任务调度**(核心功能) - [x] 同步与互斥 (锁) - [x] 定时器 - [x] 信号机制 - 用户程序: - [x] ELF 文件解析 - [x] ELF 文件加载运行 - [ ] 动态链接库 - 系统调用: - [x] 基础系统调用集(进程/文件/管道/套接字/网络 等) - 文件系统: - [x] 管道 - [x] 套接字 - [x] Minix1 文件系统 - [x] FAT 12/16/32 文件系统 (🌱 fat32) - [x] ISO9660 文件系统 - 网络协议: - [x] Ethernet 以太网协议 - [x] ARP 协议 - [x] IPv4 协议 - [x] ICMP 协议 - [x] UDP 协议 - [x] TCP 协议 - [x] DHCP 协议:局域网 IP 地址获取 - [x] DNS 协议:域名解析 - [x] HTTP 协议:简单的 HTTP 服务器 - 开发环境: - [x] WSL2 [@znyin](https://github.com/znyinyyniu) - [ ] docker (🌱 docker) ## 测试情况 - 虚拟机:主要功能在 bochs 和 qemu 测试通过,86box 测试通过。 - 实体机:技嘉 GA-Z68P-DS3 主板,正常启动,PCI 声卡创新 CT4730、CMI8738 测试通过,U盘启动和读写正常。 - 86box 下 ES1371 当前无声。 - qemu 下 USB 2.0 启动的测试 ```bash qemu-system-i386 \ -device usb-ehci,id=ehci1 \ -device usb-ehci,id=ehci2 \ -device sb16 \ -drive file=../build/master.img,format=raw,if=none,id=usbdrive2 \ -drive file=../build/slave.img,format=raw,if=none,id=usbdrive1 \ -device usb-storage,drive=usbdrive1,id=usbstick1,bus=ehci1.0 \ -device usb-storage,drive=usbdrive2,id=usbstick2,bus=ehci2.0 \ -serial stdio ``` ## 使用方法 iso 文件的使用参考 [版本 1.0.0](./docs/13%20系统优化/179%20版本%201.0.0.md); 对于 `qemu` 模拟器,需要提前配置 `tap0` 设备,用于网络: qemu-system-i386 -m 32M -audiodev pa,id=snd -machine pcspk-audiodev=snd -device sb16,audiodev=snd -rtc base=localtime -chardev stdio,mux=on,id=com1 -serial chardev:com1 -netdev tap,id=eth0,ifname=tap0,script=no,downscript=no -device e1000,netdev=eth0 -drive file=onix_1.0.0.iso,media=cdrom,if=ide -boot d ## 编译与测试 以下命令默认在 `src/` 目录执行: ```bash cd src ``` ### 1. 编译依赖 请先确保以下工具可用: - `gcc` / `binutils` - `nasm` - `python3` - `qemu-system-i386`(若使用 qemu) - `bochs` / `bochs-gdb`(若使用 bochs) - `grub-mkrescue`(若构建 ISO) - `ffmpeg`(构建镜像时会生成音频测试文件) - `sfdisk` / `losetup` / `mkfs.minix`(构建磁盘镜像) ### 2. 编译镜像 构建完整硬盘镜像(`master.img`、`slave.img`、`floppya.img`): ```bash make image ``` 构建 ISO(输出 `build/kernel.iso` 以及版本化 iso): ```bash make cdrom ``` 清理构建产物: ```bash make clean ``` ### 3. 运行测试(QEMU / Bochs) 首次使用 qemu 网络前,先创建 `tap0`: ```bash make tap0 ``` QEMU 启动硬盘镜像: ```bash make qemu ``` QEMU + GDB 调试等待(`-s -S`): ```bash make qemug ``` QEMU 从 CDROM 启动: ```bash make qemu-cd ``` Bochs 启动: ```bash make bochs ``` Bochs + GDB: ```bash make bochsg ``` ### 4. 常用编译参数 可通过 `make 变量=值 目标` 覆盖默认配置: - `DEBUG_LEVEL=0|1|2|3|4`:调试信息等级 1=错误 2=警告 3=信息 4=调试 - `DEBUG_OUT_FORCE_CONSOLE=0|1`:强制调试输出到 console(默认 `0`) - `BOOTLOAD_READDISK_INT13=0|1`:控制引导阶段是否使用BIOS int13读盘(默认 `1`) - `CROSS_COMPILE=i386-elf-`:指定交叉编译工具链前缀 - `ONIX_VERSION=x.y.z`:设置版本号 示例: ```bash make DEBUG_LEVEL=3 DEBUG_OUT_FORCE_CONSOLE=1 qemu ``` ### 5. 调试建议 - 串口输出默认复用到 qemu 当前终端(`-chardev stdio ... -serial chardev:com1`)。 - 若需要使用 GDB,推荐 `make qemug` 后另开终端连接: ```bash gdb build/kernel.bin (gdb) target remote :1234 ``` ## Pull Request 约定 1. 确保每个修改的文件都是有意义的,不要添加与系统无关的文件; 2. 确保每个 commit 都有足够的分量,对于无关紧要的 commit 可以合并在一起; 3. Pull Request 请先提交到 dev 分支,若有新功能开发,再开新分支; Commit Decription 前面加上 emoji ❤️ 提高阅读性: - ✨ 视频录制:与 B 站某一视频相关 - 🐛 漏洞修复:修改了系统中的某个 Bug - 🎈 功能开发:加入原系统中没有的新功能 - 📖 文档整理:修改 docs 中的内容 - 📔 学习笔记:记录学习过程中的一些问题或者感悟 - 🍕 其他:若有与 commit 强相关的 emoji 也可以添加,如:💾 软盘驱动 ## 问题及答案 - [问题及答案](./docs/others/问题及答案%20(Question%20and%20Answer).md) - [gcc -m32 链接错误](./docs/others/问题及答案%20(Question%20and%20Answer).md#gcc--m32-%E9%93%BE%E6%8E%A5%E9%94%99%E8%AF%AF) - [无法调试汇编代码](./docs/others/问题及答案%20(Question%20and%20Answer).md#%E6%97%A0%E6%B3%95%E8%B0%83%E8%AF%95%E6%B1%87%E7%BC%96%E4%BB%A3%E7%A0%81) ## 相关软件版本参考 - bochs >= 2.7 [^bochs] - qemu >= 6.2.0 [^qemu] - gcc >= 11.2.0 [^gcc] - gdb >= 12.1 [^gdb] - nasm >= 2.15.05 [^nasm] - binutils >= 2.38 [^binutils] - sfdisk >= 2.39.3 - vmware >= 16.1 [^vmware] - vscode >= 1.74.3 [^vscode] - ffmpeg >= 6.0 [^ffmpeg] - python >= 3.6 [^python] - pyelftools >= 0.29 [^pyelftools] ## Star History ![Star History Chart](https://api.star-history.com/svg?repos=StevenBaby/onix&type=Date) ## 参考 [^bochs]: [^qemu]: [^gcc]: [^gdb]: [^nasm]: [^binutils]: [^vmware]: [^vscode]: [^ffmpeg]: [^python]: [^pyelftools]: