ITADN
dreamos82/Dreamos64
dreamos82/Dreamos64 · 文件 下载 ZIP
文件最后提交记录最后更新时间
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

DreamOS64

C/C++ CI Discord Chat

注意: 开发已迁移至 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,我们只需要安装 llvmlld 软件包(确切的软件包名称取决于所使用的发行版)。

编译和运行操作系统

关于如何构建 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 版本。

现在展示时间!:)

image

我偶尔也会发布短视频,展示 dreamos 的新功能,在我的 Makertube (Peertube)Youtube 频道上。

致谢

到目前为止,非常感谢 DeanoBurrito,他为 Dreamos64 实现了多项功能(x2apic、修复了一些 bug、日志记录,以及更多即将推出的功能...),更不用说他在解释问题和审查我糟糕的代码方面提供的宝贵帮助 :) 他的操作系统也值得一提:NorthPort

最后,如果你有兴趣了解如何开发自己的内核,可以前往 https://github.com/dreamportdev/Osdev-Notes/,这是一个由我和 DeanoBurrito 维护的项目,内容关于如何从零开始编写内核。