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 位保护模式下的。
|