在x86裸机上运行的GO单核

2020-10-22 22:34:39

在x86裸机上运行单个围棋应用程序,完全用Go编写(只有少量的C和一些汇编语言),支持围棋的大多数功能(如GC、Goroutine)和标准库,还附带一个可以运行大多数基于Net的库的网络堆栈。

Go的运行时提供了一些基本的操作系统抽象。Goroutine对应于进程,通道对应于进程间通信。此外,围棋有自己的虚拟内存管理,因此在裸机上运行围棋程序的想法就诞生了。

事实证明,得益于Go可控的内存布局、无需虚拟机直接翻译硬件指令的能力以及类似C的语法,Go具有操纵硬件资源的能力。这些都使围棋有可能编写在裸露金属上运行的程序,但也存在一些挑战。GO堆积了许多指令来执行协同程序调度和内存GC,这在某些地方带来了一些无法重入的麻烦,比如中断处理和系统调用。

一般来说,使用围棋操作硬件是一种乐趣。一方面,它让我对围棋的运行时间有了深刻的了解。另一方面,除了C语言之外,它还提供了在裸机上编写操作系统内核的尝试。

首先您需要安装gdb,如果您使用的是MacOS,请执行以下命令。

首先执行make qemu-debug命令让QEMU启动gdb服务器,然后使用vscode的debug功能启动调试会话。Vscode的调试配置文件内置于项目中。

如果您希望eggos在裸机上运行,建议使用GRUB作为引导加载程序。

执行make命令后生成的multiboot.elf是符合multiboot规范的内核映像,可以被GRUB直接识别并在裸机上引导。示例配置文件引用boot/grub.cfg。

该程序仍然有很多错误,并且经常失去响应或恐慌。如果您愿意投稿,请提交公关,谢谢!

我小女儿的出生给这个家庭带来了很多欢乐。这个项目是以她的名字小丹丹命名的。我的妻子和母亲也给了我很大的支持,让我在业余时间更新这个项目。❤️