EDK2: Difference between revisions

From OSDev.wiki
Jump to navigation Jump to search
[unchecked revision][unchecked revision]
Content added Content deleted
(Save draft)
(Fix list formatting)
Line 8: Line 8:
===Structure of EDK2===
===Structure of EDK2===
EDK2 is made up of multiple repos, all of which can be found at [https://github.com/tianocore https://github.com/tianocore]. The main ones are:
EDK2 is made up of multiple repos, all of which can be found at [https://github.com/tianocore https://github.com/tianocore]. The main ones are:

- edk2, which contains the build system, library, OVMF, and ArmVirt firmware
- edk2, which contains the build system, library, OVMF, and ArmVirt firmware

- edk2-platforms, which contains firmware for various real hardware platforms, such as the SiFive U450, Raspberry Pi, and quite a few others
- edk2-platforms, which contains firmware for various real hardware platforms, such as the SiFive U450, Raspberry Pi, and quite a few others

- edk2-non-osi, which contains proprietary binary blobs for various platforms.
- edk2-non-osi, which contains proprietary binary blobs for various platforms.

EDK2 itself is written in C with some Python, and is licensed under the BSD 2 Clause + Patent license. The blobs are subject to there own licenses.
EDK2 itself is written in C with some Python, and is licensed under the BSD 2 Clause + Patent license. The blobs are subject to there own licenses.
====Directory structure====
====Directory structure====

Revision as of 13:14, 16 August 2021

EDK2 is the official development environment for UEFI applications. It is developed by the open-source Tianocore project, of which Intel, HP, and Microsoft are the primary contributors. Although it may be bigger the GNU-EFI, it has more features, meaning that some OS developers may prefer it over GNU-EFI.

What is EDK2?

EDK2 is full on implementation of the UEFI spec. It contains the Open Virtual Machine Firmware (OVMF), which is primarily targeted at QEMU, and is used by many OS developers to test out there UEFI applications. It also has ARM and AArch64 firmware packages for QEMU and various other boards, and RISC-V firmware packages for various HiFive boards. It also has tools for UEFI driver developers, but that is for now outside the scope of this wiki.

Of most interest the OS developers is the UEFI library and the EDK2 build system. This article will show you the structure of EDK2, how to build firmware for QEMU and real machines, and how to build UEFI applications.

Structure of EDK2

EDK2 is made up of multiple repos, all of which can be found at https://github.com/tianocore. The main ones are:

- edk2, which contains the build system, library, OVMF, and ArmVirt firmware

- edk2-platforms, which contains firmware for various real hardware platforms, such as the SiFive U450, Raspberry Pi, and quite a few others

- edk2-non-osi, which contains proprietary binary blobs for various platforms.

EDK2 itself is written in C with some Python, and is licensed under the BSD 2 Clause + Patent license. The blobs are subject to there own licenses.

Directory structure

EDK2 is split up into multiple subdirectories, where each one normally contains a "Package". The OvmfPkg subdirectory contains OVMF, the MdePkg subdirectory contains the UEFI library, and so on. Each one of these contains a file ending in .dsc. This file describes the package inside of the folder, and contains things such as dependencies, different components, and so on. Each component is described its own file that contains sources, application type, and so on. TODO: Describe this in more detail

Building EDK2's base

No matter what you are trying to build from EDK2, these steps must be completed. First, you must decide if you want to only build stuff inside of the main EDK2 repo, or if you also want stuff from edk2-platforms. Note that these guides assume you are on a Linux system (Windows Subsystem for Linux is OK)

Building without edk2-platforms

If you only want the UEFI library or virtual machine firmware, then this guide will suffice. First, we must clone EDK2

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

Note that this is the latest non-stable source. If you want the stable source then run:

git clone https://github.com/tianocore/edk2.git -b"stable/202011"

or whatever is appropriate at the time you are reading this. After that, we now must clone the submodules

cd edk2
git submodule update --init

Then, we need to setup the environment for EDK2

export EDK_TOOLS_PATH=$PWD/BaseTools
# If you are compiling for ARM, then this is needed
sudo apt install gcc-aarch64-linux-gnu        # Or whatever your package manager is
export GCC5_AARCH64_PREFIX=aarch64-linux-gnu-

# Run this no matter what you are compiling for
source edksetup.sh

The last step generates various configuration files and sets up some variables. Note that edksetup.sh must be sourced, as its variables must persist. Now we need to build the base tools

make -C BaseTools

And lastly, we must actually build EDK2 using its Python build script.

build -a YOUR_ARCH -t GCC5 -p YOUR_PACKAGE

YOUR_ARCH can be IA32, X64, AARCH64, ARM, or RISCV64. Note that not all packages compile for all architectures. YOUR_PACKAGE must point to a package in the source tree. Further guides in this article will simple tell you what -p option to pass to EDK2's build script

Building with edk2-platforms

If you actually want firmware that runs on real hardware, then you must perform the following steps instead of the one above

First, we need to create our workspace folder

mkdir edk2 && cd edk2
export WORKSPACE=$PWD

Now we need to clone the source to all repos. edk2-non-osi is optional depending on the platform you are building for, but I would recommend downloading it anyway

git clone https://github.com/tianocore/edk2.git -b"stable/202011"
git clone https://github.com/tianocore/edk2-platforms.git
git clone https://github.com/tianocore/edk2-non-osi.git
cd edk2 && git submodule update --init
cd ../edk2-platforms && git submodule update --init && cd ..

We need to let EDK2's build system know where these folders are. We'll also setup a couple other variables as well

export EDK_TOOLS_PATH="$PWD/BaseTools"
export PACKAGES_PATH="$PWD/edk2:$PWD/edk2-platforms:$PWD/edk2-non-osi"

We now must setup the environment now

. edk2/edksetup.sh
make -C edk2/BaseTools

After that, building is exactly like before. To build for a certain platform in edk2-platforms, simply find the relevant .dsc file.

NOTE: Some EDK2 platform DSC files are broken. The author of this article is working on creating patches for these issues which have been encountered by them.