前言

自己对写操作系统这个事情比较感兴趣,但是这条路太漫长,只能慢慢来,原来是基于传统的汇编+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编译环境搭建、编译、在模拟器运行、在笔记本运行(带目录版本)相关推荐

  1. 安装mips编译器和模拟器/mips GCC编译环境搭建

    目录 安装mips编译器和模拟器/mips编译环境搭建 Linux Windows 安装mips编译器和模拟器/mips编译环境搭建 安装mips上的GCC编译器. Linux 以下内容在Ubuntu ...

  2. RISC-V GNU编译环境搭建与运行实践

    RISC-V GNU编译环境搭建与运行实践 riscv-gnu-toolchain交叉编译工具链 riscv-gnu-toolchain下载 riscv-gnu-toolchain编译 RISC-V运 ...

  3. Windows编译环境搭建(VS2010)

    引言:   本篇文章基于教程目的(由于windows和linux相关环境搭建篇幅过大,在博客中做这些讲解),主要描述Windows的发展历程和编译环境搭建(基于 Visual Studio 2010版 ...

  4. spring-framework-5.1.x 源码编译 环境搭建 [ idea:2020.1 ]

    spring-framework-5.1.x 源码编译 环境搭建 [ idea:2020.1 ] 一. Gradle下载与安装 软件名称 版本 下载地址 jdk jdk 11.0.5 下载链接 提取码 ...

  5. 鸟人的Android揭秘(3)——Android 编译环境搭建

    一.主机环境要求 要顺利编译 Android 源代码,硬件环境和操作系统都必须满足一定的条件.官方推荐的硬件环境配置是: 编译 Gingerbread(2.3.x)及后续版本必须使用64位系统 需至少 ...

  6. Sky37E/D 基于Ubuntu21.04 编译环境搭建

    Sky37E/D 基于Ubuntu21.04 编译环境搭建 0. 下载安装Ubuntu 21.04 官网下载ubuntu21.04镜像(ubuntu-21.04-desktop-amd64.iso) ...

  7. 【ZT】MTK X20编译环境搭建 烧写安卓固件详细教程

    http://jingyan.eeboard.com/article/75888 MTK X20编译环境搭建 MTK X20编译环境搭建 作者: lgkgkfg 上传时间为: 2017-04-17 1 ...

  8. AMSS编译环境搭建

    http://wenku.baidu.com/view/2d3a3b7927284b73f2425012.html AMSS编译环境搭建 说明:编译环境说明请参见QualcommRelease not ...

  9. 全志A33开发板vstar编译环境搭建

    全志A33开发板vstar编译环境搭建 安装系统 全志提供的vstar的SDK使用内核linux-3.4.39, 在编译过程中,要用到一个文件gen_check_code,位于linux-3.4/ar ...

  10. 基于stm32f103R6 Keil uVision5编译环境搭建

    1.新建一个项目,如图,我建的工程名称为LED. 2.点击Target,再点击Options for target. 3.点击Device,这里我选择的是stm32f103R6(根据个人情况而定),也 ...

最新文章

  1. 超纯超美的曲线(Peter De Jong Attractor)
  2. LeetCode 21 ——合并两个有序链表
  3. Kubernetes容器网络及网络模型
  4. JVM参数设置、分析(转)
  5. OpenCV——读取视频文件并写入文件
  6. 谷歌正在为Chromebook自研基于Arm的处理器
  7. VS2015解决非Unicode编码包含中文字段无法编译的问题
  8. 微软开发趣史 | 我们之所以叫它 RAID 是因为它能干掉 BUG
  9. 基于react-app搭建react-router+redux项目
  10. openstack nova ×××
  11. 从威胁到整合,容器将改变openstack的未来?
  12. layui+thymeleaf 点击弹框右上角叉号刷新父页面
  13. 海康威视校招C++岗面经
  14. java rectangle获取xy_Day06 Java基础学习笔记
  15. 作为sigmastar代理-启明云端为你分享干货SSD201/202的QT的移植
  16. meanshift原理与代码详解
  17. MAT的 thread overview 功能
  18. Sicily 1466. Taunt Exposure Estimation
  19. mysql 授予权限语句_MySQL授予权限
  20. 代驾行业开发APP需要注意哪些

热门文章

  1. 巧萌易携之ROS2Go的不完全教研攻略
  2. 八岁时我弄丢长命锁,七年后他说保我长命无忧
  3. 第四十章 SQL命令 DROP USER
  4. 谷歌3d卫星地图下载
  5. 听dalao讲课 7.27
  6. 洛谷----P1036 [NOIP2002 普及组] 选数
  7. java练习:图书销售管理系统(三),出版社管理
  8. Excel如何快速统计某列数据出现次数
  9. .Net程序员的职业规划
  10. 在Qt中使用OpenGL(二)