V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
icexin
V2EX  ›  Go 编程语言

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

  •  
  •   icexin ·
    icexin · 2020-10-11 22:40:25 +08:00 · 3572 次点击
    这是一个创建于 1264 天前的主题,其中的信息可能已经有所发展或是发生改变。

    github 地址 https://github.com/icexin/eggos

    这是一个使用 Go 编写的运行于 x86 机器的 unikernel,全部用 go 编写(除了 bootloader 和一些汇编)

    Go 的 runtime 提供了一些基本的操作系统抽象,goroutine 对应进程,channel 对应进程间通信,另外 go 有自己的虚拟内存管理,所以萌生了在裸机上运行 Go 程序的想法。

    实际证明,Go 有操作硬件资源的能力,得益于 Go 可控的内存布局,以及不需要虚拟机直接翻译硬件指令的能力,还有类 C 的语法。这些都让 Go 编写运行于裸机的程序有了可能。

    然而也有一些挑战,Go 在很多指令里面打桩来进行协程调度以及内存 GC,在一些不能重入的地方,如中断处理和系统调用,都带来了一些麻烦。

    功能 list

    • 基本的 go 功能,goroutine,channel,GC 等
    • 大部分标准库
    • TCP/IP 网络栈
    • VFS 抽象
    • nes 模拟器,js 解释器等

    一些快照

    支持 http get 的 js 解释器

    js

    nes 模拟器

    nes

    欢迎学习交流!

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

    这里的打桩具体指的是?
    icexin
        14
    icexin  
    OP
       2020-10-12 09:43:49 +08:00
    @amosbird Go 的编译器会在函数入口检查栈是否溢出,如果溢出就执行 runtime 函数扩容,可能会触发调度,还有一些 writeBarrier 用于辅助 GC
    icexin
        15
    icexin  
    OP
       2020-10-12 09:44:34 +08:00
    @copie 现在只支持 go1.13 哈,其他版本可能会出现问题
    jeffh
        16
    jeffh  
       2020-10-12 10:27:24 +08:00
    @12101111 感谢解答,用汇编写过玩具内核,第一次接触 unikernel
    tkl
        17
    tkl  
       2020-10-12 14:13:14 +08:00
    硬核
    Rorysky
        18
    Rorysky  
       2020-10-12 17:48:53 +08:00
    @mywaiting 我记得 go 设计出来的时候,为了显示 自举 和 兼容性,设计团队就在裸机上跑过
    sunriz
        19
    sunriz  
       2020-10-14 16:16:38 +08:00
    大佬
    pythonee
        20
    pythonee  
       2020-10-18 15:28:52 +08:00
    是用什么来模拟 x86 裸机呢
    icexin
        21
    icexin  
    OP
       2020-10-18 19:13:17 +08:00
    @pythonee 开发的时候用的 qemu,最终用 grub 引导在我自己的台式机上跑
    icexin
        22
    icexin  
    OP
       2020-10-18 19:14:41 +08:00
    虽然现在的 cpu 都是 64 位的,但如果没有显式开启 64 位,是可以运行于传统的 32 位保护模式下的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5710 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 01:49 · PVG 09:49 · LAX 18:49 · JFK 21:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.