百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

「Coding Tools」 第3话 Ubuntu下EDK2开发环境搭建

off999 2024-09-29 16:09 25 浏览 0 评论

Coding Master系列接下来要开始进入C语言以及EDK2的学习了,所以先在专栏里把开发环境搭建写写好,视频里就不做具体介绍了。EDK2的开发环境并不是那么好搞,总会遇到各种各样的错误,我们还是按照官方的操作流程一步一步的来。

首先是在打开终端,新建一个src的文件夹,用于保存EDK2工程。src就位于你的主目录下,你可以先输入pwd命令查看当前目录,如果不是在主目录,可以输入cd ~命令来回到主目录。

通过git把EDK2的代码clone下来,Ubuntu是自带git,所以不用额外安装。输入以下代码就可以了,我们下载的是EDK2的稳定版,不是最新的主干版本。根据我的经验,主干版本通常会有点小毛病还没解决。

所以要先在选择EDK2的版本,然后再git代码,请输入以下命令来clone代码。EDK2的工程还挺大的,所以git需要一些时间,我们可以先把它放在一边,继续进行必要的安装工作。

git clone https://github.com/tianocore/edk2.git

首先是基本的编译工具以及配套软件,只需要一个命令就可以了。这行命令其实安装了可不止一个软件,有时候一起安装会有部分安装不成功,你可以拆开一步一步的安装。我个人比较建议一个一个地装,发现问题立即进行处理。

sudo apt-get install build-essential uuid-dev iasl git gcc-5 nasm python3-distutils

那么就按照上述命令的顺序一个一个来吧,第一个是build-essential:

sudo apt-get install build-essential

仍然会要求输入密码,之前没提过,在这里输入密码是看不到的,是为了保护你的隐私,输入完成后直接点击Enter就行了。

第二个是uuid-dev:

sudo apt-get install uuid-dev

它的安装过程比较顺利:

第三个是iasl:

sudo apt-get install iasl

这里的提示就值得看一下了,EDK2官方提示iasl这个软件或者acpica-tools两者安装其中之一即可。所以我们实际安装的是acpica-tools,没什么影响。还有就是提示有些软件包不需要了,可以通过命令卸载,等我们都安装完然后统一卸载。

第四个是git,这个用Ubuntu自带的就行,所以不安装了。

第五个是gcc-5,Ubuntu自带gcc 9.3.0,编译EDK2没啥问题,所以也不用安装了。

第六个是nasm,我们的老朋友了,安装还是非常顺利的。

sudo apt-get install nasm

第七个是python3-distutils,这个Ubuntu也自带python 3.8.0版本,所以不需要安装。不过这在后面编译EDK2的时候,会提示找不到python。因为EDK2还是用的python2.x版本,而其命令是python,python3.x版本的python3,所以到时候我们要处理一下。

到这里先做个小总结,EDK2的官方文档教程也并不一定完全依从,比如gcc-5也可以用gcc 9.3.0取代,编译起来并无不妥。官方只是告诉你这些组件都是必须的,至于是不是每一个都需要安装,不一定。

EDK2的代码差不多git完了,我们来继续操作这一边。由于EDK2还引用了其他的git库代码,所以还需要把部分子项目的代码也git下来。首先cd edk2,切换到edk2目录,然后在此目录下执行如下命令:

git submodule update --init

这一步的时间也蛮长的,看来引用的代码不少,我们慢慢等待就好了。

接下来需要编译基本工具,EDK2是比较特殊的,它的不少编译软件都是自成一体,在BaseTools里,而不是采用系统的。在edk2目录下,执行如下命令:

make -C BaseTools

如果出现了python命令找不到的错误,并不意外。

我们可以通过几个命令来解决这个问题,原理就是把python命令指向python3.8。首先使用whereis ptyhon确定现在系统使用ptyhon的位置,然后通过sudo ln -s命令来添加一条软连接,类似于快捷方式。这样使用python命令时,其实调用的是/usr/bin/python3.8。

whereis python
sudo ln -s /usr/bin/python3.8 /usr/bin/python
python --version

执行的结果如图所示,查看python版本就是3.8.10了。

然后我们再回到EDK2的init现场,重新执行一遍命令,只要按方向键上,就可以往回翻已经输入过的命令。再次执行make -C BaseTools后,显示编译通过。

下一步是设置EDK2的编译环境变量,需要两条命令:

export EDK_TOOLS_PATH=$HOME/src/edk2/BaseTools
. edksetup.sh BaseTools

两行命令分开复制然后粘贴到终端里执行,执行结果如下:

下面就是来做个编译测试了,首先来到~/src/edk2/Conf目录下,双击打开target.txt。这是个编译目标配置文件,我们需要修改2个地方。一个是第20行的ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc,另一个是54行的TOOL_CHAIN_TAG = GCC5。

点击右上角的保存后,再回到终端,输入build命令后Enter,等待编译结果。此时屏幕上会有很多文字飞速地滑过,不要紧张等着就行了,也许会发生错误停下来呢。

没想到一次就编译通过了,实在是太幸运了!我们可以输入以下命令来检查编译结果。最后出来的就是HelloWorld.efi,这个程序暂时还运行不了。今天就到这里,后续我们再研究如何使用虚拟机来运行它。

ls Build/MdeModule/DEBUG_*/*/HelloWorld.efi

本文由谭玉刚原创,欢迎关注,带你一起长知识!

相关推荐

Linux 网络协议栈_linux网络协议栈

前言;更多学习资料(包含视频、技术学习路线图谱、文档等)后台私信《资料》免费领取技术点包含了C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,Z...

揭秘 BPF map 前生今世_bpfdm

1.前言众所周知,map可用于内核BPF程序和用户应用程序之间实现双向的数据交换,为BPF技术中的重要基础数据结构。在BPF程序中可以通过声明structbpf_map_def...

教你简单 提取fmpeg 视频,音频,字幕 方法

ffmpeg提取视频,音频,字幕方法(HowtoExtractVideo,Audio,SubtitlefromOriginalVideo?)1.提取视频(ExtractVi...

Linux内核原理到代码详解《内核视频教程》

Linux内核原理-进程入门进程进程不仅仅是一段可执行程序的代码,通常进程还包括其他资源,比如打开的文件,挂起的信号,内核内部的数据结构,处理器状态,内存地址空间,或多个执行线程,存放全局变量的数据段...

Linux C Socket UDP编程详解及实例分享

1、UDP网络编程主要流程UDP协议的程序设计框架,客户端和服务器之间的差别在于服务器必须使用bind()函数来绑定侦听的本地UDP端口,而客户端则可以不进行绑定,直接发送到服务器地址的某个端口地址。...

libevent源码分析之bufferevent使用详解

libevent的bufferevent在event的基础上自己维护了一个buffer,这样的话,就不需要再自己管理一个buffer了。先看看structbufferevent这个结构体struct...

一次解决Linux内核内存泄漏实战全过程

什么是内存泄漏:程序向系统申请内存,使用完不需要之后,不释放内存还给系统回收,造成申请的内存被浪费.发现系统中内存使用量随着时间的流逝,消耗的越来越多,例如下图所示:接下来的排查思路是:1.监控系统中...

彻底搞清楚内存泄漏的原因,如何避免内存泄漏,如何定位内存泄漏

作为C/C++开发人员,内存泄漏是最容易遇到的问题之一,这是由C/C++语言的特性引起的。C/C++语言与其他语言不同,需要开发者去申请和释放内存,即需要开发者去管理内存,如果内存使用不当,就容易造成...

linux网络编程常见API详解_linux网络编程视频教程

Linux网络编程API函数初步剖析今天我们来分析一下前几篇博文中提到的网络编程中几个核心的API,探究一下当我们调用每个API时,内核中具体做了哪些准备和初始化工作。1、socket(family...

Linux下C++访问web—使用libcurl库调用http接口发送解析json数据

一、背景这两天由于一些原因研究了研究如何在客户端C++代码中调用web服务端接口,需要访问url,并传入json数据,拿到返回值,并解析。 现在的情形是远程服务端的接口参数和返回类型都是json的字符...

平衡感知调节:“系统如人” 视角下的架构设计与业务稳定之道

在今天这个到处都是数字化的时代,系统可不是一堆冷冰冰的代码。它就像一个活生生的“数字人”,没了它,业务根本转不起来。总说“技术要为业务服务”,但实际操作起来问题不少:系统怎么才能快速响应业务需求?...

谈谈分布式文件系统下的本地缓存_什么是分布式文件存储

在分布式文件系统中,为了提高系统的性能,常常会引入不同类型的缓存存储系统(算法优化所带来的的效果可能远远不如缓存带来的优化效果)。在软件中缓存存储系统一般可分为了两类:一、分布式缓存,例如:Memca...

进程间通信之信号量semaphore--linux内核剖析

什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠...

Qt编写推流程序/支持webrtc265/从此不用再转码/打开新世界的大门

一、前言在推流领域,尤其是监控行业,现在主流设备基本上都是265格式的视频流,想要在网页上直接显示监控流,之前的方案是,要么转成hls,要么魔改支持265格式的flv,要么265转成264,如果要追求...

30 分钟搞定 SpringBoot 视频推拉流!实战避坑指南

30分钟搞定SpringBoot视频推拉流!实战避坑指南在音视频开发领域,SpringBoot凭借其快速开发特性,成为很多开发者实现视频推拉流功能的首选框架。但实际开发中,从环境搭建到流处理优...

取消回复欢迎 发表评论: