EDK2编译环境搭建、编译、在模拟器运行、在笔记本运行(带目录版本)
前言
自己对写操作系统这个事情比较感兴趣,但是这条路太漫长,只能慢慢来,原来是基于传统的汇编+C语言编写,现在UEFI基本很普及了,因为想着使用国外的操作系统始终存在安全隐患,所以想好好学习一把,由于是初学者,有很多不对的地方,请看到这篇博客的大侠们指出不足之处。
相关信息
虚拟机、操作系统及配置源
操作系统Ubuntu20.10装在VMWARE 14pro下的版本:14.1.3 build-9474260,,注:我未修改/etc/apt/sources.list文件,直接使用的国外下载源,感觉速度也还可以,我切换到阿里源,进行安装软件的时候,发现会存在各种依赖软件版本不配套问题,所以未修改此文件(估计是修改的源不正确导致吧),这是虚拟机的版本和Ubuntu虚拟机内存配置,自己的电脑比较老【捂脸】。
EDK2源代码及代码版本
edk代码:基于tag点:edk2-stable202105:
复制的源:https://gitee.com/dream-os/edk22/tree/edk2-stable202105-base/
国外的源:https://github.com/tianocore/edk2/releases/tag/edk2-stable202105
建议在开发的时候基线选择官方比较稳定的版本
另外,需要注意edk和工具的版本关系,如果版本不配套,会在编译的时候存在函数的符号找不到问题;
EDK2代码配套开源代码(以Brotli源码及git hash值示例)
edk2\BaseTools\Source\C\BrotliCompress这个工具是需要拷贝的可以从这边下载,https://gitee.com/dream-os/brotli11?_sasdk=fE%3D%3DECCD;这里边实际上给出了EDK2工具下载的地址和git的合入hash值
这是手动下载方式,其实我一般是去gitee上找看看有没有已经同步到国内的,下载速度较快:
其他工具也是类似这样下载,不过由于有些外网的源码下载很慢,好些前辈直接fork到gitee了,对于这种工具性的代码,我认为只要不影响编译,感觉问题就不大,如果下载国外代码速度比较快的话,也可以这样,直接把所有此版本edk代码依赖的开源库下载:
git clone https://github.com/tianocore/edk2.git
cd edk2
git submodule update --init
系统当前实现的功能
当前实现FAT32,NTFS根目录读取,文件读取,不能创建文件,
可用于两台电脑进行TCP通信,实现了PING命令,
可显示中文(1616或1212)、英文(8*16)
BMP图片读取并显示、图片缩放
对鼠标点击事件支持、对键盘输入的响应
可支持(shutdown、ping、ls)命令行的edk2-stable202105-base分支
当前正在实现http命令中,发现收发包有问题,还在定位中
当前编译出来的二进制大小470KB
环境搭建步骤
相关编译器以及相关依赖的库安装(有兴趣可以搜索下对应命令作用):
sudo apt install nasm
sudo apt install iasl
sudo apt install uuid-dev
sudo apt install build-essential
sudo apt install make
sudo apt install git
sudo apt-get install build-essential uuid-dev iasl git gcc-5 nasm make
apt-get install python
apt-get install python-distutils
apt-get install gcc-5 g+±5
装依赖的库的时候,一般是编译不通过会报缺头文件、等等,一般是百度下,再安装库、再编译。
编译
清空原来生成的中间文件
说句题外话,我们编译生成的efi或者其他文件一般在Build目录:比如IA32、X86格式的目录,如下图中蓝色字体所示,rm -rf Build/*这个命令是把原来我编译的生成文件全删除,准备重新编译:
32位EFI编译命令(只能用于模拟器运行)
下图这个命令是编译32位efi文件的,这是全量编译,会编译所有efi, (注:32位的efi文件在64位的环境运行会报错的,运行不了),这个命令大概编译几分钟,具体示电脑硬件而定:
如果需要单独编译某个*.inf文件目录命令如下:
EmulatorPkg/build.sh -a X64 -m MdeModulePkg/Application/A/A.inf
如果实在不知道build.sh命令如何使用,可以直接:
**EmulatorPkg/build.sh --help
**这样更加方便学习命令的其他参数:
编译完成
**附 :这是编译的日志(有点多,这边上传不方便,我另外找个地方),另外注意下:编译的时候,有些编译告警不影响efi文件运行,一般编译完成显示成这个样子表示没啥问题:
启动模拟器
我们在模拟器里边运行下,就是在编译的命令后边+空格+run:
在模拟器运行
注意在这个起动画面的时候,是可以按回车的,可以多按几次,直到出现Shell>,表示可以键盘输入,并执行efi文件:
在模拟器运行的命令,这边需要输完整的文件名称,UiApp.efi是一个edk2自带的app,在这个目录(这是在Windows下拷贝的,Linux下使用注意下斜杠的方向):edk22\MdeModulePkg\Application\UiApp\:
运行的结果如下,UiApp自带的运行不是这样的,我把这个代码修改了下,参考的UEFI开发探索04 – 与键盘的互动_luobing4365的博客:
https://blog.csdn.net/luobing4365/article/details/100536218
-CSDN博客和爱影博客 - UEFI开发学习3 -高级GUI编程:
当前在模拟器里边已经运行OK了。
64位EFI编译命令(用于在笔记本电脑或台式电脑运行)
刚才我们在模拟器里运行是OK的,但是自己的笔记本是64位的,需要编译一个64位的版本(这里有一点需要注意,有时候32位的编译没有问题,但是64位编译会有问题,反之亦然,只能是碰到问题并解决):
编译完成后大概显示如下图所示:
这是编译出来生成64位所有 efi文件及所在目录:
真实电脑运行
实际上,这一轮编译下来,会生成很多的efi文件,我们需要把编译生成的efi文件拷贝到U盘,其实我是把X64 这个目录拷贝到U盘了,这里还有需要注意的一点,普通我们的U盘比较大,可以多分成几个分区,有些格式化成NTFS或其他格式的、但装EFI文件的目录要是FAT32格式才行,下图中我自己的U盘实际上是蓝色部分,把U盘分成了三个区,其中OS是用于我启EFI文件的分区(必须要FAT32),其他两个是存放文件或者我写的操作系统进行文件系统测试的分区:
8、接下来,我们需要在自己的笔记本上也运行下,首先,我们需要下载一个efi shell,用于加载出命令行,这个网址:
http://www.opdown.com/soft/118852.html
EFI SHELL x64|win7 EFI启动文件(EFI SHELL)下载64位 - 欧普软件下载,
下载下来解压后这个文件对我们有用(实际上,我们编译出来的efi也是可以的,由于我们可以自己编译出来Shell.efi,其实还可以修改Shell.c代码,添加打印信息,我这样做过,很有意思,可以看到被加载的efi文件是如何一步一步被执行的,但是EDK太底层的驱动不太好看到(实际上想看到也有一定的办法,就是把EDK的代码原有代码复制一份,然后自己写接口调用,这样也可以添加打印信息:DreamOS/edk22:
代码地址:
https://gitee.com/dream-os/edk22/blob/Split/MdeModulePkg/Application/A/Applications/Commands/L2_APPLICATIONS_Command_ping.c
这是基于EDK2代码中ICMP实现的PING,把所有ICMP相关的实现复制到一个文件了,把结构体、函数名都在后边加了个2也区分,这样可以添加打印信息,最底层的不太容易看得见,也可能是我方法不对)):
9、在U盘(U盘需要是FAT32格式的)的根目录下新建EFI\Boot目录,把第8步下载解压的上图红色方框中Shell.efi复制到此目录,并改名为bootx64.efi,目录结构如下,注意名称和目录结构尽量保持一致:
接下来把第七步编译的64位的efi复制到U盘,这个基本没有目录限制,我直接把X64放在U盘根目录了,目录如下图所示,这个目录内容大概需要记住,因为重启电脑通过U盘起后到UEFI Shell后,需要找到 efi文件后执行:
BIOS参数设置支持通过命令行启动*.efi
在BIOS里实际上需要设置下U盘起动和安全选项,请参考:惠普电脑怎么进入bios设置启动项和
https://jingyan.baidu.com/article/f79b7cb37bff229145023e48.html;
自己电脑配置显示:
自己电脑配置显示:
11、起动后,需要按F12,有的说需要按F10(我有点怀疑不同品牌的电脑可能不太一样,我的电脑是HP的),然后选择从U盘起动系统,会进入下边这个页面:
在这里插入图片描述
这里边fs0,fs1其实是不同分区目录,是U盘的分区目录映向射,我自己的U盘,原来做的启动盘实际上有两个分区的到这一步,表示执行U盘的Shell.efi没有问题了 。
12、然后开始找我们写的代码并编译成64位的UiApp.efi文件,然后在fs1:\X64找到了,注意切换前面这个fs1或fs0命令行是fs0:回车(0后边有个冒号), 上图中敲完UiApp.efi后回车,就会运行成下图效果:
这是找到bootx64.efi文件,带我们进入UEFI Shell的兄弟:
结束语
到此为止,基本上把UEFI的edk2代码从环境搭建、32位和64位代码编译、在模拟器运行、在PC机上运行基本上过了一遍,可能还有很多有问题的地方,希望对一些感兴趣的帅锅美女有一些帮助。另外,在此感谢一些前辈的各种帮助,如:QQ、微信等等。
题外话
去年EDK2代码使用的tag版本是edk2-stable202105,今年因为其他原因需要使用edk2-stable202205,测试编译的时候,发现就brotli代码的git hash值发生了变化,其他可以使用原来的。
查看代码工具推荐
顺带说下,在Ubuntu下开发,我使用的IDE是SourceInsight3.5(使用SourceInsight需要先安装wine)很老的版本了,看代码非常方便,这是原来的操作方式,现在的编写代码是在Windows下使用SourceInsight3.5,写完代码,通过共享目录复制到虚拟机、然后编译(复制、编译其实就是一个*.sh脚本完成)。
EDK2编译环境搭建、编译、在模拟器运行、在笔记本运行(带目录版本)相关推荐
- 安装mips编译器和模拟器/mips GCC编译环境搭建
目录 安装mips编译器和模拟器/mips编译环境搭建 Linux Windows 安装mips编译器和模拟器/mips编译环境搭建 安装mips上的GCC编译器. Linux 以下内容在Ubuntu ...
- RISC-V GNU编译环境搭建与运行实践
RISC-V GNU编译环境搭建与运行实践 riscv-gnu-toolchain交叉编译工具链 riscv-gnu-toolchain下载 riscv-gnu-toolchain编译 RISC-V运 ...
- Windows编译环境搭建(VS2010)
引言: 本篇文章基于教程目的(由于windows和linux相关环境搭建篇幅过大,在博客中做这些讲解),主要描述Windows的发展历程和编译环境搭建(基于 Visual Studio 2010版 ...
- spring-framework-5.1.x 源码编译 环境搭建 [ idea:2020.1 ]
spring-framework-5.1.x 源码编译 环境搭建 [ idea:2020.1 ] 一. Gradle下载与安装 软件名称 版本 下载地址 jdk jdk 11.0.5 下载链接 提取码 ...
- 鸟人的Android揭秘(3)——Android 编译环境搭建
一.主机环境要求 要顺利编译 Android 源代码,硬件环境和操作系统都必须满足一定的条件.官方推荐的硬件环境配置是: 编译 Gingerbread(2.3.x)及后续版本必须使用64位系统 需至少 ...
- Sky37E/D 基于Ubuntu21.04 编译环境搭建
Sky37E/D 基于Ubuntu21.04 编译环境搭建 0. 下载安装Ubuntu 21.04 官网下载ubuntu21.04镜像(ubuntu-21.04-desktop-amd64.iso) ...
- 【ZT】MTK X20编译环境搭建 烧写安卓固件详细教程
http://jingyan.eeboard.com/article/75888 MTK X20编译环境搭建 MTK X20编译环境搭建 作者: lgkgkfg 上传时间为: 2017-04-17 1 ...
- AMSS编译环境搭建
http://wenku.baidu.com/view/2d3a3b7927284b73f2425012.html AMSS编译环境搭建 说明:编译环境说明请参见QualcommRelease not ...
- 全志A33开发板vstar编译环境搭建
全志A33开发板vstar编译环境搭建 安装系统 全志提供的vstar的SDK使用内核linux-3.4.39, 在编译过程中,要用到一个文件gen_check_code,位于linux-3.4/ar ...
- 基于stm32f103R6 Keil uVision5编译环境搭建
1.新建一个项目,如图,我建的工程名称为LED. 2.点击Target,再点击Options for target. 3.点击Device,这里我选择的是stm32f103R6(根据个人情况而定),也 ...
最新文章
- 超纯超美的曲线(Peter De Jong Attractor)
- LeetCode 21 ——合并两个有序链表
- Kubernetes容器网络及网络模型
- JVM参数设置、分析(转)
- OpenCV——读取视频文件并写入文件
- 谷歌正在为Chromebook自研基于Arm的处理器
- VS2015解决非Unicode编码包含中文字段无法编译的问题
- 微软开发趣史 | 我们之所以叫它 RAID 是因为它能干掉 BUG
- 基于react-app搭建react-router+redux项目
- openstack nova ×××
- 从威胁到整合,容器将改变openstack的未来?
- layui+thymeleaf 点击弹框右上角叉号刷新父页面
- 海康威视校招C++岗面经
- java rectangle获取xy_Day06 Java基础学习笔记
- 作为sigmastar代理-启明云端为你分享干货SSD201/202的QT的移植
- meanshift原理与代码详解
- MAT的 thread overview 功能
- Sicily 1466. Taunt Exposure Estimation
- mysql 授予权限语句_MySQL授予权限
- 代驾行业开发APP需要注意哪些