DreamOS64
注意: 开发已迁移至 codeberg:https://codeberg.org/dreamos82/DreamOs64 此处保留为同步镜像。虽然我会在此查看 issue 和 PR,但我更希望这些操作在 codeberg 上进行。
DreamOS64 只是我在远离 osdev 多年后,最近再次尝试编写内核的尝试, 但这次是 64 位。
它并不是原始 DreamOS 的真正替代品,目前我也没有长期的计划。
我启动这个项目是因为我怀念底层编程带来的兴奋感 :)
它能做什么
实际上没做什么!:D
它只是打印了操作系统名称、一个 logo 和几个其他字符串。
但在内核层面,已经实现了若干功能:
- 长模式
- 内核加载到上半区
- 基本 I/O 功能(使用 VGA BIOS)
- 基本帧缓冲支持(可以在屏幕上打印字符串,但目前仅支持屏幕的前半部分,后半部分目前会触发 #PF)
- IDT 支持
- 可以使用 4kb 页或 2Mb 页加载内核
- 添加了使用递归技术访问分页数据结构的 支持。
- 实现了基本的物理内存管理器
- 启用了分页
- 实现了基本的 kheap 内存管理器
- 添加了基本的 kmalloc, kfree
- 支持 Acpi V1 和 V2
- Local Apic 支持
- IO-Apic 支持(启用键盘 IRQ)
- 帧缓冲模式下支持 PSF v1 和 v2 字体
- 基本键盘驱动和键盘映射(大多数按键已映射)
- 它打印 Epoch 时间! :)
- 极其基本的多任务/多线程支持
- 线程切换、thread_sleep 和基本自旋锁实现
- 基本虚拟内存实现
- 初始用户空间支持(目前只能运行一个空闲的用户空间线程)
- 基本系统调用机制(存在两个系统调用:一个从键盘读取输入,仅一次;另一个在帧缓冲的第 17 行打印缓冲区的内容)
- 初始基本 ELF 支持(来自内核模块)
- 初始 tar 支持(目前仅内核侧):elf 从 tar 文件系统中加载。
先决条件:
以下是构建和运行所需的软件包:
- nasm
- qemu 和 qemu-kvm
- grub-mkrescue
- grub-pc-bin
- xorriso
- mtools
- Gcc 交叉编译器或 Clang
要构建 Dreamos64,需要一个支持目标架构的工具链,它可以是 gcc(在我们的情况下是 x86-64)或已安装的 clang。
关于如何构建 gcc 交叉编译器的完整指南,可以在 这里 找到,对于 DreamOS64,目标架构将是 x86-64。
对于 clang,我们只需要安装 llvm 和 lld 软件包(确切的软件包名称取决于所使用的发行版)。
编译和运行操作系统
关于如何构建 DreamOS64 以及可用参数的完整指南位于 docs 文件夹中:docs/Building.md。
构建操作系统
在构建操作系统之前,我们需要将一个 PSF 字体(v1 或 v2)复制到 fonts 文件夹中,并将其重命名为 default.psf(即使我们是在 framebuffer 关闭的情况下构建)。已经包含了一个默认字体。
一旦 build/Config.mk 中的所有参数都设置完毕,只需输入以下命令即可构建:
make
它将使用默认目标 build 并在 dist/ 文件夹中生成一个名为 的可启动 iso。
运行和调试
要在 qemu 中启动操作系统,只需使用:
make run
相反,如果我们输入:
make debug
它将启用调试符号编译操作系统,所有输出日志信息都将发送到 stdio。
最后:
make gdb
将使用调试符号编译操作系统,并启动启用了远程调试的 qemu,等待来自 gdb 的连接以开始运行。
单元测试
有一组使用断言实现的小型测试,若要运行它们,只需执行:
make tests
已知问题
- 如果在启动时通过 qemu 出现以下错误信息:
Booting from DVD/CD...
Boot failed: Could not read from CDROM (code 0009)
这意味着你缺少 grub-pc-bin 软件包,需要安装它。
- 如果链接步骤失败并出现多个类似以下错误信息:
src/kernel/framebuffer/framebuffer.c:122: undefined reference to `_binary_fonts_default_psf_start'
这意味着字体文件夹缺失(你需要在字体文件夹中放置一个 psf v2 或 v1 字体文件,该文件必须命名为 default.psf)
- 低于 gnu ld 2.40 的版本无法为
example_syscall程序提供正确的 elf。这意味着如果选择的编译器是gcc,输出的 elf 将会损坏,程序将无法正常运行。为避免此问题,请确保使用比 2.40 更新的 binutils 版本。
现在展示时间!:)
我偶尔也会发布短视频,展示 dreamos 的新功能,在我的 Makertube (Peertube) 和 Youtube 频道上。
致谢
到目前为止,非常感谢 DeanoBurrito,他为 Dreamos64 实现了多项功能(x2apic、修复了一些 bug、日志记录,以及更多即将推出的功能...),更不用说他在解释问题和审查我糟糕的代码方面提供的宝贵帮助 :) 他的操作系统也值得一提:NorthPort
最后,如果你有兴趣了解如何开发自己的内核,可以前往 https://github.com/dreamportdev/Osdev-Notes/,这是一个由我和 DeanoBurrito 维护的项目,内容关于如何从零开始编写内核。