github 地址 https://github.com/icexin/eggos
这是一个使用 Go 编写的运行于 x86 机器的 unikernel,全部用 go 编写(除了 bootloader 和一些汇编)
Go 的 runtime 提供了一些基本的操作系统抽象,goroutine 对应进程,channel 对应进程间通信,另外 go 有自己的虚拟内存管理,所以萌生了在裸机上运行 Go 程序的想法。
实际证明,Go 有操作硬件资源的能力,得益于 Go 可控的内存布局,以及不需要虚拟机直接翻译硬件指令的能力,还有类 C 的语法。这些都让 Go 编写运行于裸机的程序有了可能。
然而也有一些挑战,Go 在很多指令里面打桩来进行协程调度以及内存 GC,在一些不能重入的地方,如中断处理和系统调用,都带来了一些麻烦。
功能 list
一些快照
支持 http get 的 js 解释器
nes 模拟器
欢迎学习交流!
![]() | 1 12101111 2020-10-11 23:02:22 +08:00 厉害了,已点 star 未来会支持 x86_64 和 uefi 吗,毕竟现在也没有多少 x86 的机器了 |
2 icexin OP @12101111 x86_64 在计划中,切换到 64 位应该还好,主要是分页管理以及一些系统调用的不一样,可能有一些其他的坑,使用 multiboot 作为 bootloader 主要是方便 qemu 调试。 |
![]() | 3 jeffh 2020-10-11 23:23:59 +08:00 学习了,厉害 |
![]() | 4 jeffh 2020-10-11 23:27:04 +08:00 可执行文件是 elf 格式的吗,标准库是 c 库吗? |
5 icexin OP @jeffh 这是一个单应用的内核,整个内核是一个 go 程序,暂不支持运行多进程,但是可以运行多个 goroutine 。内核的格式是 elf,标准库是指 go 的标准库。 |
![]() | 6 abersheeran 2020-10-11 23:31:34 +08:00 厉害,Star 了。加油。 |
![]() | 7 liuminghao233 2020-10-11 23:38:35 +08:00 via iPhone 我用 cxx 写过 os 但没想到还有这么的 |
![]() | 8 mywaiting 2020-10-11 23:45:01 +08:00 via iPhone 这脑洞,好牛逼……还能跑起来了…… |
![]() | 9 jeffh 2020-10-11 23:48:08 +08:00 @icexin 楼主是实现了 go runtime 吗,可以运行 elf 也可以运行 go 程序?看介绍是实现了大部分 go 标准库?这就很强大了。 |
11 copie 2020-10-12 00:49:56 +08:00 [email protected]/sleep/commit_noasm.go:38:45: undefined: preparingG 编译失败 |
12 b00tyhunt3r 2020-10-12 01:09:01 +08:00 rust 更适合干这活啊 |
13 amosbird 2020-10-12 01:58:57 +08:00 > Go在很多指令里面打桩来进行协程调度以及内存 GC 这里的打桩具体指的是? |
14 icexin OP @amosbird Go 的编译器会在函数入口检查栈是否溢出,如果溢出就执行 runtime 函数扩容,可能会触发调度,还有一些 writeBarrier 用于辅助 GC |
17 tkl 2020-10-12 14:13:14 +08:00 硬核 |
19 sunriz 2020-10-14 16:16:38 +08:00 大佬 |
![]() | 20 pythonee 2020-10-18 15:28:52 +08:00 是用什么来模拟 x86 裸机呢 |
22 icexin OP 虽然现在的 cpu 都是 64 位的,但如果没有显式开启 64 位,是可以运行于传统的 32 位保护模式下的。 |