1.3 搭建开发环境

我们在上一节快速体验了eggos的基本功能,这一节我们搭建一下eggos的开发环境,为后面的深入分析eggos打下基础。

核心工具准备 #

基本工具如下:

  • go1.13.x
  • mage构建工具
  • gcc和gdb,需要能生成elf32格式的。
  • qemu虚拟机

各平台的安装步骤如下所述。

Linux(ubuntu) #

Go语言编译器 #

$ curl -LO https://golang.google.cn/dl/go1.13.15.linux-amd64.tar.gz
$ mkdir $HOME/local && tar xf -C $HOME/local go1.13.15.linux-amd64.tar.gz
# 将$HOME/local/go/bin加入PATH环境变量,这里以bash为例
$ echo 'export PATH=$HOME/local/go/bin:$PATH' >> $HOME/.bashrc
# 将$HOME/go/bin也加入环境变量,方便执行编译出来的go工具
$ echo 'export PATH=$HOME/go/bin:$PATH' >> $HOME/.bashrc
$ source $HOME/.bashrc
# 设置GOPROXY环境变量,加速package下载
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn

按照上面命令执行完毕之后,输入go version命令,如果能正常输入go版本号就证明安装成功了。

mage构建工具 #

mage是一个类似make的构建工具,但它的makefile是用go语言编写的,可以跨平台,eggos最初是用的makefile,后面切换到mage上了。安装mage也非常简单。

$ go get github.com/magefile/mage

C语言开发套件 #

$ sudo apt-get install build-essential gdb

Qemu虚拟机 #

$ sudo apt-get install qemu-system-x86

MacOS #

Go语言编译器 #

$ curl -LO https://golang.google.cn/dl/go1.13.15.darwin-amd64.tar.gz
$ mkdir $HOME/local && tar xf -C $HOME/local go1.13.15.darwin-amd64.tar.gz
# 将$HOME/local/go/bin加入PATH环境变量,这里以zsh为例
$ echo 'export PATH=$HOME/local/go/bin:$PATH' >> $HOME/.zshrc
# 将$HOME/go/bin也加入环境变量,方便执行编译出来的go工具
$ echo 'export PATH=$HOME/go/bin:$PATH' >> $HOME/.zshrc
$ source $HOME/.zshrc
# 设置GOPROXY环境变量,加速package下载
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn

按照上面命令执行完毕之后,输入go version命令,如果能正常输入go版本号就证明安装成功了。

mage构建工具 #

$ go get github.com/magefile/mage

C语言开发套件 #

$ brew install x86_64-elf-binutils x86_64-elf-gcc x86_64-elf-gdb

Qemu虚拟机 #

$ brew install qemu

IDE开发环境 #

我们使用vscode来开发eggos。项目默认附带了vscode的配置文件,直接使用vscode打开eggos项目即可开始修改代码。

安装的插件 #

Debug配置 #

需要根据实际情况稍微修改一下.vscode/launch.json里面的配置

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
         {
            "name": "dlv-gdb",
            "type": "go",
            "request": "attach",
            "mode": "local",
            "cwd": "${workspaceFolder}",
            "debugAdapter": "legacy",
            "processId": 1234,
            "backend": "gdbstub",
            "dlvFlags": [
                "${workspaceRoot}/kernel.elf",
            ],
        },
        {
            "type": "gdb",
            "request": "attach",
            "name": "Attach to qemu",
            "executable": "./kernel.elf",
            "target": ":1234",
            "remote": true,
            "cwd": "${workspaceRoot}",
            "valuesFormatting": "parseText",
            // 这里根据情况进行替换,linux就用gdb
            "gdbpath": "gdb", 
            // MacOS用下面配置
            // "gdbpath":"x86_64-elf-gdb",  
        },
    ]
}

具体怎么用debugger来调试eggos,在后面的章节会写,先按这样配置环境。

另外,原生的dlv并不支持qemu的gdb stub,笔者修改了一个版本,如果想用dlv来调试eggos的话,可以按照下面步骤安装dlv

$ git clone --branch gdb https://github.com/icexin/delve.git
$ cd delve
$ go install ./cmd/dlv

编译运行eggos项目 #

下载代码 #

$ git clone https://github.com/icexin/eggos.git

编译项目 #

$ mage -v multiboot

如果没有报任何错误的话,表示编译很顺利,目录下应该有一个mutiboot.elf文件,这个即是我们的内核文件。

运行eggos #

# 如果有GUI的话,可以加上这个环境变量,让qemu运行于独立窗口
$ export QEMU_GRAPHIC=true
$ mage qemu
如果在终端下运行qemu,可以通过<Ctrl+A C>唤出qemu的console,再输入quit退出qemu模拟

一切顺利的话,就能看到eggos的启动界面了,至此我们完成了eggos的编译和运行。

小结 #

这一节我们完成了开发环境的搭建,同时完成了eggos项目的编译,并使用qemu虚拟机启动了编译出来的内核。这一节的工作为后面我们编写eggos程序打下了基础。

下面我们编写第一个eggos程序。