天天看点

「Coding Tools」第9话 开箱即用ToyOS虚拟机开发环境使用指南

作者:非常兄弟

总体介绍

谭老师在「UEFI」第18话里提到,要做一个开箱即用的虚拟机开发环境,现在1.0版本已经完成了,这篇文章就来具体介绍下环境是搭建过程以及使用方法。

视频加载中...

首先请各位同学把后续步骤所需的软件及虚拟机镜像下载到自己的电脑上,下载链接如下:

https://cloud.189.cn/t/ziEZB3Mni6bu

下载完成后,你会得到3个文件:

「Coding Tools」第9话 开箱即用ToyOS虚拟机开发环境使用指南

  • VMware-Player:

我制作虚拟机镜像使用的是VMware,所以建议同学们使用VMware Player来加载虚拟机镜像,下载完成后请首先安装VMware Player,这是Windows 64位的版本。

  • 快速运行指南:

这个视频里介绍了在安装VMware Player后,如何把ToyOS.ova文件导入进来,并进行开发环境的简单测试,主要是看看下载的各个文件是否能正常使用。

  • ToyOS.zip:

这是导出的虚拟机镜像并进行压缩后得到的zip文件,解压后会得到文件ToyOS.ova,由于某些原因直接上传.ova文件没法共享,保险起见就压缩了。

如果同学们成功完成了以上步骤,那应该来到了系统登陆页面,左上角可以在Gonme与KDE之间切换,请各位同学按照自己的喜好选择。我创建了一个用户Coding,其密码为master,同时root用户的密码也是master。

「Coding Tools」第9话 开箱即用ToyOS虚拟机开发环境使用指南

成功登陆后,可以先做个小测试,看看开发环境是否能正常运行。首先打开VSCode,它默认会打开用户主目录下的CodingMaster,这下面有3个文件夹:

EDK:

这是我已经搭建好的EDK2开发环境主目录,其中ToyBoot已经通过Git下载到里面。

OVMF:

这是运行Qemu虚拟机所需的目录,包括固件文件以及BootLoader文件及目录等。

ToyOS:

这是ToyOS开发的主目录,源文件都在里面,也是通过Git从Gitee拉下来的,不会被墙。

「Coding Tools」第9话 开箱即用ToyOS虚拟机开发环境使用指南

如果想要获取ToyBoot和ToyOS的最新代码,只要在相应目录执行git pull命令即可。这个命令会从gitee.com拉取最新的源代码,也就是main分支。

在VSCode中打开终端,可以使用Ctrl+`快捷键,或者点击菜单栏 终端->新建终端,然后进入ToyOS目录,输入以下命令进行测试:

source ToyOS.sh           
「Coding Tools」第9话 开箱即用ToyOS虚拟机开发环境使用指南

ToyOS.sh是我写的一个脚本,用于快速执行代码编译和Qemu虚拟机运行,如果脚本正常执行,则可以看到Qemu虚拟机启动了。现在Qemu默认加载的是Shell,后续可以通过替换~/CodingMaster/OVMF/ESP/EFI/Boot/BootX64.efi文件来达到直接启动ToyBoot的目的。不过现在我们可以通过UEFI Shell测试,在Shell里输入:

fs0:ToyBoot.efi           

然后点击Enter,就可以启动测试ToyBoot.efi了。

「Coding Tools」第9话 开箱即用ToyOS虚拟机开发环境使用指南

如果运行成功的话,你会看到熟悉的ToyShell,里面会有一些字符输出,证明我们的运行结果是正确的。

「Coding Tools」第9话 开箱即用ToyOS虚拟机开发环境使用指南

这个是测试ToyOS的脚本,还有可以测试ToyBoot的脚本,可以通过输入以下命令测试:

source ~/CodingMaster/EDK/ToyBoot/ToyBoot.sh           

这个脚本会编译当前的ToyBoot代码,并启动Qemu虚拟机来查看运行结果,与ToyOS.sh脚本类似,可以不用手动输入那么多命令,一行命令就能测试。

搭建过程

以上步骤可以让同学们先玩起来,接下来详细介绍下搭建过程,主要是各类软件的安装以及脚本的制作。

  • Debian

虚拟机里安装的基础操作系统是Debian 11,这是近几年Debian最大的更新了,用起来并无不妥。没有选择Ubuntu是因为我的真机上安装的就是Debian 11,Ubuntu要求的电脑配置要更高一些,在虚拟机里当然需要的资源越少越好。

值得一提的是,Debian在安装时创建的用户比如coding,是没有sudo权限的,因为它不在sudoers列表里,所以进入系统后的第一件事,就是把coding加入到sudoers文件,它位于/etc/sudoers。

su # 切换到root用户,密码为master
vi /etc/sudoers # 编辑sudoers文件           

在sudoers文件的root用户后新增一行,即图中红色方框里的内容[coding ALL=(ALL:ALL) ALL],这样coding用户就拥有了sudo权限。添加完成后退出vi,先点几次Esc键,然后输入 :wq! 。请注意冒号和感叹号也要输入,感叹号是要求强制修改sudoers这个只读文件。

「Coding Tools」第9话 开箱即用ToyOS虚拟机开发环境使用指南

重要:安装Debian时,我是开启了EFI支持的,这样有助于在不支持UEFI的机器上折腾Grub2之类的BootLoader。

  • EDK2

ToyBoot和ToyOS用到的所有源代码都在coding用户的主目录的CodingMaster目录下下,完整路径为/home/coding/CodingMaster。EDK2的代码也保存在这里,EDK2开发环境需要先安装一些软件,用以支持其工程代码编译:

sudo apt-get install build-essential
sudo apt-get install uuid-dev
sudo apt-get install acpica-tools
sudo apt-get install nasm
sudo apt-get install python           

需要说明一下的是,Debian自带gcc和git,这个就不需要单独安装了。还有一点是它没有自带python2,只自带了python3,所以需要手动安装python。

软件安装完成后,就可以着手下载EDK2代码了。在~/CodingMaster目录下,执行以下git命令,下载EDK2源码:

cd /home/coding/CodingMaster
git clone https://github.com/tianocore/edk2.git EDK
cd EDK
git submodule update --init           

代码下载完成后,编译EDK2自带的BaseTools:

make -C BaseTools           
  • ToyBoot

ToyBoot的编译依赖EDK2环境,当前我们处于/home/coding/CodingMaster/EDK路径下,就在此路径下git代码。不过有个问题是,EDK2也是通过git拉下来的代码,如果直接在EDK目录里执行git操作来拉取ToyBoot,后续再执行git add或git commit命令,会把EDK2的代码也加入到ToyBoot的git仓库里,这样是很操蛋的。

所以我用了一个简单粗暴的方法,就是先把EDK目录下的.git目录改名,让它暂时不再是git仓库,可通过以下命令完成:

mov -r .git .git.bak           

这样我们就可以在EDK目录下自由的git操作了,比如:

git clone https://gitee.com/tanyugang/ToyBoot.git           

为了简化编译过程,我在ToyBoot里写了一个脚本ToyBoot.sh:

cd $HOME/CodingMaster/EDK
export EDK_TOOLS_PATH=$HOME/CodingMaster/EDK/BaseTools
source edksetup.sh BaseTools
build
cp /home/coding/CodingMaster/EDK/ToyBoot/Build/DEBUG_GCC5/X64/ToyBoot.efi /home/coding/CodingMaster/OVMF/ESP/ToyBoot.efi
qemu-system-x86_64 -m 4096 -drive if=pflash,format=raw,file=/home/coding/CodingMaster/OVMF/OVMF_CODE.fd,readonly=on -drive if=pflash,format=raw,file=/home/coding/CodingMaster/OVMF/OVMF_VARS.fd,readonly=on -drive format=raw,file=fat:rw:/home/coding/CodingMaster/OVMF/ESP -net none           

它会完成以下几个步骤:

  1. 设定EDK_TOOLS_PATH
  2. 执行edksetup.sh脚本
  3. build ToyBoot工程
  4. 拷贝ToyBoot.efi到ESP
  5. 启动Qemu虚拟机

不过在执行这个脚本前,先修改EDK/Conf/target.txt,主要是

  1. ACTIVATE_PLATFORM = ToyBoot/ToyBoot.dsc
  2. TARGET_ARCH = X64
  3. TOOL_CHAIN_TAG = GCC5

修改完成后,你就可以通过如下命令来执行脚本测试了:

source ToyBoot.sh           
  • ToyOS

相比ToyBoot,ToyOS的开发环境就简单的多了,不过也需要安装一些软件来支持,比如VSCode、Clang、lld等。

VSCode最好去官网下载deb版本,然后通过命令安装,下载链接为:

https://code.visualstudio.com/

下载完成后,可以通过以下命令安装:

sudo dpkg -i xxx.deb           

VSCode安装完成后,我又安装了一些必备插件,比如针对汇编、C语言以及EDK2的INF、DSC文件等语法高亮的插件等,具体不一一列举,同学们可以自行查看。

「Coding Tools」第9话 开箱即用ToyOS虚拟机开发环境使用指南

Clang和lld则可以通过apt安装即可

sudo apt install clang
sudo apt install lld           

运行测试还需要Qemu虚拟机支持:

sudo apt install qemu
sudo apt install qemu-system-x86           

这些软件安装完成后,就来拉取ToyOS的代码:

cd /home/coding/CodingMaster
git clone https://gitee.com/tanyugang/ToyOS.git           

代码拉取完成后,在ToyOS目录下也有一个脚本,叫做ToyOS.sh:

clang Kernel.c Video.c Shell.c -c -nostdlib -ffreestanding 
ld.lld Kernel.o Video.o Shell.o -e KernelStart -o Kernel.elf
cp ~/CodingMaster/ToyOS/Kernel.elf ~/CodingMaster/OVMF/ESP/Kernel.elf
qemu-system-x86_64 -m 4096 -drive if=pflash,format=raw,file=/home/coding/CodingMaster/OVMF/OVMF_CODE.fd,readonly=on -drive if=pflash,format=raw,file=/home/coding/CodingMaster/OVMF/OVMF_VARS.fd,readonly=on -drive format=raw,file=fat:rw:/home/coding/CodingMaster/OVMF/ESP -net none           

它会完成4件事:

  1. 编译ToyOS的.c代码
  2. 链接得到的.o文件
  3. 拷贝Kernel.elf

我们可以通过以下命令来执行ToyOS的编译测试:

cd ToyOS
source ToyOS.sh           
  • OVMF

OVMF文件夹是为了运行Qemu虚拟机而创建的,其中:

  1. OVMF_CODE.fd、OVMF_DATA.fd是我提前编译好的UEFI固件。
  2. ESP目录是模拟的UEFI的启动分区。
  3. ESP下的Logo.BMP和Narrow.bmp是ToyOS开机画面的图标文件。
  4. ESP下的ToyBoot.efi和ToyOS.elf分别是ToyBoot.sh和ToyOS.sh两个脚本编译后拷贝过来的。
  5. ESP下的EFI/Boot/BootX64.efi目前是UEFI Shell。

OVMF目录平时基本不需要动它。

  • Other

我还安装了一些其他软件,方便在日常中使用

sudo apt install vim
sudo apt install zsh
sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"           

以及Chrome浏览器,至此ToyOS的虚拟机开发环境搭建完毕,本文就先介绍到这里,有什么问题请在评论里留言或者到群里反馈都可以。

继续阅读