github.com/jspc/eggos@v0.5.1-0.20221028160421-556c75c878a5/README_CN.md (about) 1 <h1 align="center"> 2 <img src="./assets/files/eggos.png" /> 3 </h1 4 5 ![CI](https://github.com/icexin/eggos/workflows/CI/badge.svg) 6 7 使用Go语言编写的运行在x86裸机上的unikernel 8 9 将Go程序运行在x86裸机上,全部使用Go语言编写(bootloader里面有少量汇编和c),支持大部分Go的核心功能(GC,goroutine等),包括大部分Go的标准库,同时也附带一个网络协议栈,从而能运行大部分基于`net`库的第三方库。 10 11 不同于传统的操作系统内核,eggos没有对用户态和内核态的代码进行隔离,整个unikernel运行在一个地址空间上。没有进程的概念以及进程间通信,但是完整支持了Go的goroutine和channel。另外也没有传统的ELF加载器,但是附带了一个Javascript的解释器。 12 13 14 # 背景 15 16 Go的runtime提供了一些基本的操作系统抽象,goroutine对应进程,channel对应进程间通信,另外Go有自己的虚拟内存管理,因此就产生了将Go程序运行在裸机上的想法。 17 18 事实证明,Go有操作硬件的能力:对内存布局的掌控、直接翻译硬件指令、以及类C的语法,这些能力都让Go程序运行在裸机上成为了可能。 19 20 然而挑战还是比较有的,Go在很多指令里面打桩来进行协程调度以及内存GC,在一些不能重入的地方,如中断处理和系统调用,都带来了一些麻烦。 总的来说,使用Go来操作硬件是一种乐趣,一方面也让我深入了解了Go的runtime,另一方面也是提供了一种除了c语言之外在裸机上编写操作系统内核的尝试。 21 22 23 # 架构 24 25 <img src="https://i.imgur.com/gnq4m9h.png" width="700" /> 26 27 # 应用截图 28 29 ![js](https://i.imgur.com/Canhd8D.gif) 30 ![nes](https://i.imgur.com/WugXcTk.gif) 31 ![gui](https://i.imgur.com/jILuMMk.png) 32 33 34 35 # 功能列表 36 37 - Go的内置功能,如GC,goroutine,channel等 38 - 一个支持行编辑的终端 39 - 支持TCP/IP的协议栈 40 - Go风格的VFS抽象,使用[afero](https://github.com/spf13/afero) 41 - NES模拟器,使用[nes](https://github.com/fogleman/nes) 42 - Javascript解释器,使用[otto](https://github.com/robertkrimen/otto) 43 - GUI支持,使用[nucular](https://github.com/aarzilli/nucular) 44 - 一些简单的应用,如(httpd, sshd) 45 46 47 # 依赖 48 49 - Go 1.16.x (高版本可能运行不了) 50 - gcc 51 - qemu 52 - mage 53 54 ## MacOS 55 56 ``` bash 57 $ go get github.com/magefile/mage 58 $ brew install x86_64-elf-binutils x86_64-elf-gcc x86_64-elf-gdb 59 $ brew install qemu 60 ``` 61 62 ## Ubuntu 63 64 ``` bash 65 $ go get github.com/magefile/mage 66 $ sudo apt-get install build-essential qemu 67 ``` 68 69 # 快速开始 70 71 ``` bash 72 $ mage qemu 73 ``` 74 75 # 构建自己的unikernel 76 77 `eggos` 有将普通Go程序转换成运行于裸机上的 `ELF unikernel` 的能力。 78 79 首先获取egg二进制,可以通过 https://github.com/icexin/eggos/releases 下载。也可以直接运行`go install github.com/icexin/eggos/cmd/egg`获取。 80 81 在你的项目目录运行`egg build -o kernel.elf`,接着运行`egg run kernel.elf`启动qemu虚拟机。 82 83 84 `egg pack -o eggos.iso -k kernel.elf` 可以将内核打包成一个iso文件,通过 https://github.com/ventoy/Ventoy 即可运行在真实的机器上。 85 86 这里是一些例子[例子](./app/examples) 87 88 Happy hacking! 89 90 # Debug 91 92 eggos支持直接使用GDB debug,或者使用vscode这样带图形界面的IDE来debug。 93 94 mac用户使用如下命令安装GDB 95 96 ``` bash 97 brew install x86_64-elf-gdb 98 ``` 99 100 vscode用户通过安装`Native Debug` 扩展来支持GDB。 101 102 首先执行`mage qemudebug`来让qemu运行于debug模式,之后就可以使用vscode自带的debug功能debug了。项目自带vscode的debug配置文件。 103 104 另外Go语言也自带了对GDB的支持,见[Debugging Go Code with GDB](https://golang.org/doc/gdb) 105 106 ![vscode-gdb](https://i.imgur.com/KIg6l5A.png) 107 108 109 # 文档 110 111 [docs/README.md](docs/README.md) 112 113 # Roadmap 114 115 - [ ] WASM runner 116 - [x] GUI support 117 - [x] 3D graphic 118 - [x] x86_64 support 119 - [ ] SMP support 120 - [ ] Cloud server support (virtio) 121 - [ ] Raspberry Pi support (arm64 aka aarch64) 122 123 # 关于贡献 124 125 eggos在活跃开发中,你将会遇到很多bug,包括不限于panic或者死机。如果你想贡献eggos,欢迎提交PR,谢谢! 126 127 128 # 特别感谢 129 130 我的小闺女的出生给小家庭带来了很多欢乐,这个工程就是用她的小名`蛋蛋`命名的。另外我的妻子和丈母娘也给了我很大的支持来更新这个项目,特别感谢她们的默默付出. :heart: :heart: :heart: