Go 编写的跑在 x86 裸机上的 unikernel

2020-10-11 22:40:25 +08:00
 icexin

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 模拟器

欢迎学习交流!

3825 次点击
所在节点    Go 编程语言
22 条回复
12101111
2020-10-11 23:02:22 +08:00
厉害了,已点 star
未来会支持 x86_64 和 uefi 吗,毕竟现在也没有多少 x86 的机器了
icexin
2020-10-11 23:18:56 +08:00
@12101111 x86_64 在计划中,切换到 64 位应该还好,主要是分页管理以及一些系统调用的不一样,可能有一些其他的坑,使用 multiboot 作为 bootloader 主要是方便 qemu 调试。
jeffh
2020-10-11 23:23:59 +08:00
学习了,厉害
jeffh
2020-10-11 23:27:04 +08:00
可执行文件是 elf 格式的吗,标准库是 c 库吗?
icexin
2020-10-11 23:31:05 +08:00
@jeffh 这是一个单应用的内核,整个内核是一个 go 程序,暂不支持运行多进程,但是可以运行多个 goroutine 。内核的格式是 elf,标准库是指 go 的标准库。
abersheeran
2020-10-11 23:31:34 +08:00
厉害,Star 了。加油。
liuminghao233
2020-10-11 23:38:35 +08:00
我用 cxx 写过 os 但没想到还有这么屌的
mywaiting
2020-10-11 23:45:01 +08:00
这脑洞,好牛逼……还能跑起来了……
jeffh
2020-10-11 23:48:08 +08:00
@icexin 楼主是实现了 go runtime 吗,可以运行 elf 也可以运行 go 程序?看介绍是实现了大部分 go 标准库?这就很强大了。
12101111
2020-10-12 00:04:49 +08:00
@jeffh Unikernel 的意思就是程序作为代码连接进内核中,所以没有 elf 加载器之类的.
copie
2020-10-12 00:49:56 +08:00
netstack@v0.0.0-20201005132454-bd9d0399feb1/sleep/commit_noasm.go:38:45: undefined: preparingG 编译失败 😂
b00tyhunt3r
2020-10-12 01:09:01 +08:00
rust 更适合干这活啊
amosbird
2020-10-12 01:58:57 +08:00
> Go 在很多指令里面打桩来进行协程调度以及内存 GC

这里的打桩具体指的是?
icexin
2020-10-12 09:43:49 +08:00
@amosbird Go 的编译器会在函数入口检查栈是否溢出,如果溢出就执行 runtime 函数扩容,可能会触发调度,还有一些 writeBarrier 用于辅助 GC
icexin
2020-10-12 09:44:34 +08:00
@copie 现在只支持 go1.13 哈,其他版本可能会出现问题
jeffh
2020-10-12 10:27:24 +08:00
@12101111 感谢解答,用汇编写过玩具内核,第一次接触 unikernel
tkl
2020-10-12 14:13:14 +08:00
硬核
Rorysky
2020-10-12 17:48:53 +08:00
@mywaiting 我记得 go 设计出来的时候,为了显示 自举 和 兼容性,设计团队就在裸机上跑过
sunriz
2020-10-14 16:16:38 +08:00
大佬
pythonee
2020-10-18 15:28:52 +08:00
是用什么来模拟 x86 裸机呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/713999

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX