使用Go语言编写的运行在x86裸机上的unikernel
将Go程序运行在x86裸机上,全部使用Go语言编写(bootloader里面有少量汇编和c),支持大部分Go的核心功能(GC,goroutine等),包括大部分Go的标准库,同时也附带一个网络协议栈,从而能运行大部分基于net
库的第三方库。
不同于传统的操作系统内核,eggos没有对用户态和内核态的代码进行隔离,整个unikernel运行在一个地址空间上。没有进程的概念以及进程间通信,但是完整支持了Go的goroutine和channel。另外也没有传统的ELF加载器,但是附带了一个Javascript的解释器。
Go的runtime提供了一些基本的操作系统抽象,goroutine对应进程,channel对应进程间通信,另外Go有自己的虚拟内存管理,因此就产生了将Go程序运行在裸机上的想法。
事实证明,Go有操作硬件的能力:对内存布局的掌控、直接翻译硬件指令、以及类C的语法,这些能力都让Go程序运行在裸机上成为了可能。
然而挑战还是比较有的,Go在很多指令里面打桩来进行协程调度以及内存GC,在一些不能重入的地方,如中断处理和系统调用,都带来了一些麻烦。 总的来说,使用Go来操作硬件是一种乐趣,一方面也让我深入了解了Go的runtime,另一方面也是提供了一种除了c语言之外在裸机上编写操作系统内核的尝试。
- Go的内置功能,如GC,goroutine,channel等
- 一个支持行编辑的终端
- 支持TCP/IP的协议栈
- Go风格的VFS抽象,使用afero
- NES模拟器,使用nes
- Javascript解释器,使用otto
- GUI支持,使用nucular
- 一些简单的应用,如(httpd, sshd)
- Go 1.16.x (高版本可能运行不了)
- gcc
- qemu
- mage
$ go get github.com/magefile/mage
$ brew install x86_64-elf-binutils x86_64-elf-gcc x86_64-elf-gdb
$ brew install qemu
$ go get github.com/magefile/mage
$ sudo apt-get install build-essential qemu
$ mage qemu
eggos
有将普通Go程序转换成运行于裸机上的 ELF unikernel
的能力。
首先获取egg二进制,可以通过 https://github.com/icexin/eggos/releases 下载。也可以直接运行go install github.com/icexin/eggos/cmd/egg
获取。
在你的项目目录运行egg build -o kernel.elf
,接着运行egg run kernel.elf
启动qemu虚拟机。
egg pack -o eggos.iso -k kernel.elf
可以将内核打包成一个iso文件,通过 https://github.com/ventoy/Ventoy 即可运行在真实的机器上。
这里是一些例子例子
Happy hacking!
eggos支持直接使用GDB debug,或者使用vscode这样带图形界面的IDE来debug。
mac用户使用如下命令安装GDB
brew install x86_64-elf-gdb
vscode用户通过安装Native Debug
扩展来支持GDB。
首先执行mage qemudebug
来让qemu运行于debug模式,之后就可以使用vscode自带的debug功能debug了。项目自带vscode的debug配置文件。
另外Go语言也自带了对GDB的支持,见Debugging Go Code with GDB
- WASM runner
- GUI support
- 3D graphic
- x86_64 support
- SMP support
- Cloud server support (virtio)
- Raspberry Pi support (arm64 aka aarch64)
eggos在活跃开发中,你将会遇到很多bug,包括不限于panic或者死机。如果你想贡献eggos,欢迎提交PR,谢谢!
我的小闺女的出生给小家庭带来了很多欢乐,这个工程就是用她的小名蛋蛋
命名的。另外我的妻子和丈母娘也给了我很大的支持来更新这个项目,特别感谢她们的默默付出. ❤️ ❤️ ❤️