안경잡이개발자

728x90
반응형

  최근 MinnowBoard를 이용하여 프로젝트를 진행하고 있는데, UEFI 펌웨어를 수정해서 업로드를 해야하는 일이 생겼다. EDK2크로스 플랫폼 펌웨어 개발 환경이다. UEFI 명세를 따르고 있기 때문에, 이를 이용하여 UEFI 펌웨어 개발을 진행할 수 있다. 특히 EDK2는 MinnowBoard를 지원한다는 점이 특징이다. 그래서 EDK2 개발 환경을 이용하여 MinnowBoard UEFI 업데이트를 진행하고자 한다.

 

  기본적으로 인텔(Intel)에서 공식적으로 제공하고 있는 문서는 다음과 같다.

 

  https://software.intel.com/en-us/articles/minnowboard-maxturbot-uefi-firmware

 

MinnowBoard MAX* and MinnowBoard Turbot* - UEFI Firmware

MinnowBoard MAX* and MinnowBoard Turbot* firmware releases that include functional and security updates.

software.intel.com

  기본적으로 문서에서 요구하는 대로 진행하면 어려움 없이 UEFI 펌웨어가 빌드(Build) 되기는 하지만, 개발환경에 따라서 조금씩 시행착오가 있을 수 있다. 따라서, 본인은 EDK2 UEFI 펌웨어를 개발할 때 개인 PC 개발환경을 이용하는 것보다는 Ubuntu 16.04 가상머신을 이용하는 것을 추천한다.

 

※ UEFI 펌웨어 개발 환경 구축 ※

 

  웬만하면 구름(Goorm IDE) 서비스를 이용하여 Ubuntu 16.04 LTS 운영체제의 개발 환경을 이용하자. 빈 프로젝트(Blank Project)로 시작하는 것이 깔끔하며, 기본적으로 gcc 5.4 버전이 설치되어 있어서 바로 사용할 수 있다. 이후에 다음과 같은 과정을 따르면 된다.

 

1) 워크스페이스 경로로 이동

 

  일단 EDK2 개발 환경으로 이용할 워크스페이스 폴더를 생성한다. 이러한 워크스페이스 폴더에 프로젝트 파일을 옮겨서 개발을 진행할 것이다. 따라서 가장 먼저 워크스페이스 폴더를 생성하고 그 폴더로 이동하자. 이후에 다음의 과정을 따라가면 된다.


2) EDK2 소스코드 다운로드

git clone https://github.com/tianocore/edk2.git -b UDK2017 
cd edk2 
git checkout vUDK2017 
cd .. 

 

3) EDK2 MinnowBoard 플랫폼 소스코드 다운로드

git clone https://github.com/tianocore/edk2-platforms.git -b devel-MinnowBoardMax-UDK2017 
cd edk2-platforms 
git checkout 2a5f80b862e46de213a3f3635c43394deacdfb05 
cd .. 

 

4) BaseTools 바이너리 다운로드

git clone https://github.com/tianocore/edk2-BaseTools-win32.git 
cd edk2-BaseTools-win32 
git checkout 0e088c19ab31fccd1d2f55d9e4fe0314b57c0097 
cd .. 

 

5) 바이너리 오브젝트 모듈 설치

  일단 워크스페이스 경로에 'silicon' 이라는 이름의 폴더를 생성한다. 이후에 다음의 웹 사이트에 접속한 뒤에 "MinnowBoard_MAX-1.01-Binary.Objects.zip"를 설치하여 압축을 풀어준다.

 

  http://firmware.intel.com/projects/minnowboard-max

  압축 폴더 안에 포함된 다음의 세 폴더를 워크스페이스 내 'silicon' 폴더 안으로 옮긴다. (구름 IDE를 이용하는 경우, 압축 파일을 옮겨서 해결할 수 있다.) 

  IA32FamilyCpuPkg
  Vlv2BinaryPkg
  Vlv2MiscBinariesPkg

 

  결과적으로 최종적인 워크스페이스 내 폴더 구성은 다음과 같다.

 

※ 리눅스 환경에서 빌드 ※

  이제 Ubuntu 16.04 환경에서 EDK2 프로젝트를 빌드(Build)하는 방법을 자세히 알아보도록 하자. 일단 필수적인 패키지들을 설치하여, 빌드 환경을 구축한다.

sudo apt-get update 
sudo apt-get install build-essential 
sudo apt-get install uuid-dev 
sudo apt-get install git 


  만약에 패키지 리스트 업데이트 과정에서 공개키 관련 오류가 발생한다면 다음과 같이 키 설정을 해준다.

gpg --keyserver keyserver.ubuntu.com --recv 5DC22404A6F9F1CA 
gpg --export --armor 5DC22404A6F9F1CA | sudo apt-key add - 


  이후에 필요한 라이브러리들을 설치해준다. (UEFI 펌웨어 빌드를 위해 꼭 필요한 라이브러리들이다.) 구체적으로 NASM와 ACPICA를 설치해주어야 하는데, 두 가지 방법이 있다.

 

1) NASM 및 ACPICA 설치 첫 번째 방법

 

  다음의 네 명령어를 이용하면, 간단히 설치를 진행할 수 있다.

sudo apt-get install nasm 
sudo apt-get install bison 
sudo apt-get install flex 
sudo apt-get install acpica-tools

 

2) NASM 및 ACPICA 설치 두 번째 방법

 

  여기에서 소개할 방법은 인텔 공식 문서에 기재되어 있는 방법이다. 먼저 NASM을 설치한다. 이를 위해 다음의 공식 사이트에 접속하자.

 

  https://www.nasm.us/pub/nasm/releasebuilds/2.12.02

  위 사이트에 접속한 뒤에 nasm-2.12.02.tar.gz 파일을 다운로드해서 임의의 폴더에 압축을 풀어준다.  (구름 IDE로 옮길 때, 잘 안 옮겨진다면 .zip 파일로 변경해서 옮겨보자.)  이후에 nasm 도구를 설치할 것이다.  다만 만약에 폴더에 Makefile.in 파일만 존재하고, Makefile이 없는 경우 Makefile.in 파일을 Makefile로 변경해주면 된다.

chmod +x configure 
sudo ./configure 
sudo make 
sudo make install 


  설치가 완료된 이후에는 nasm --v를 입력하여 설치된 NASM의 버전을 확인할 수 있다. 이제 ACPICA를 설치한다. 다음의 공식 사이트에 접속하자.

 

  https://acpica.org/downloads

  위 사이트에 접속한 뒤에 acpica-unix-20170728.tar.gz 파일을 다운로드해서 임의의 폴더에 압축을 풀어준다. 이제 bison과 flex를 설치한다.

  sudo apt-get install bison flex

  이후에 ACPICA를 설치할 수 있다.

  sudo make clean
  sudo make iasl
  sudo make install

 

  참고로 이러한 과정에서 nasm 및 acpica-tools 라이브러리를 반드시 제대로 설치해주어야 한다. 라이브러리가 설치되어 있지 않은 경우, 빌드 과정에서 특정한 프로그램 혹은 파일을 찾을 수 없다는 오류가 발생할 수 있다.

 

※ UEFI 빌드를 위한 OpenSSL 설치 ※

cd /워크스페이스/edk2/CryptoPkg/Library/OpensslLib/ 
git clone https://github.com/openssl/openssl openssl 
cd openssl 
git checkout OpenSSL_1_1_0e

 

  이 과정에서 openssl 폴더로 들어간 뒤에 checkout 명령을 이용해 반드시 버전을 변경해야 한다. 그러면, 요구하는 특정한 .c 파일이 없다는 메시지가 나오며 빌드에 실패하게 된다.

※ 빌드 진행 ※

1) 먼저 빌드에 필요한 스크립트 및 바이너리 파일을 실행 가능하도록 설정한다.

chmod +x /워크스페이스/edk2/edksetup.sh 
chmod -R 777 /워크스페이스/edk2/BaseTools/ 
cd /워크스페이스/edk2-platforms/Vlv2TbltDevicePkg 
chmod +x bld_vlv.sh Build_IFWI.sh GenBiosId     

 

2) 릴리즈(Release) 모드로 빌드를 진행한다.

cd /워크스페이스/edk2-platforms/Vlv2TbltDevicePkg 
. Build_IFWI.sh MNW2 Release

 

  릴리즈 모드로 빌드를 하면, 8MB 크기의 .bin 파일이 생성된다. 이제 이 파일을 MinnowBoard로 옮긴 뒤에 실제로 MinnowBoard에서 플래시(Flash)를 진행하면 된다.

 

※ 펌웨어 업로드 및 플래시(Flash) ※


  실제로 빌드가 된 펌웨어 바이너리(Binary) 파일을 플래시하기 위해서는 두 가지가 필요하다.

  ① 펌웨어 업데이트 유틸 ② 펌웨어 바이너리 파일

  따라서 가장 먼저, 아래 사이트에 접속하여 펌웨어 업데이트 유틸을 다운로드 해준다.

 

  https://software.intel.com/en-us/articles/minnowboard-maxturbot-uefi-firmware

  이제 UEFI Shell에 접속한 뒤에, 펌웨어 업데이트 유틸을 이용하여 업데이트를 진행하면 된다. 기본적으로 MinnowBoard에 전원을 공급하여, 모니터를 연결하면 UEFI Shell로 접속하게 된다. 이 때, MinnowBoard에 USB나 SD Card를 삽입하면 해당 파일 시스템에 접속할 수 있게 된다.

  일반적으로 fs0 번호로 파일 시스템이 적용되므로, UEFI Shell에서 fs0:을 입력한다. 이후에 ls를 입력하여 펌웨어 업데이트 유틸, 펌웨어 바이너리 파일을 확인하자. 이제 해당 유틸을 이용하여 펌웨어 업데이트를 진행하면 된다. 자세한 내용은 아래 문서를 참고하자.

https://software.intel.com/sites/default/files/managed/4e/e1/using-the-minnowboard-max-flash-utility-1.1.pdf

 

※ 참고해야 할 사항 ※

  기본적으로 펌웨어 프로그램이 제대로 빌드(Build)되지 않는다고 하더라도 Stitch 폴더 안에는 .bin 파일이 생성된다. 다만, 제대로 펌웨어 프로그램이 만들어지지 않은 경우에는 펌웨어 프로그램의 크기가 8MB가 아니게 된다.

  심지어 저자의 경우에는 빌드 과정에서 경고(warning) 메시지만 나오고 오류(error) 메시지는 나오지 않았음에도 만들어진 펌웨어 프로그램의 크기가 7MB였다. 이처럼 기본적으로 인텔(Intel) 문서상에 명시되어 있는 툴 체인의 버전을 최대한 맞춘다고 하더라도, 빌드 오류를 만나거나 빌드 결과가 잘못 될 수 있다는 점을 기억하자.

  결과적으로 저자의 경우 리눅스 환경을 버리고, 인텔 문서에서 제공하고 있는 윈도우 빌드 환경을 따랐다.  (마찬가지로 윈도우 버전의 가이드를 그대로 따라가면 된다. Visual Studio 2015를 설치해야 하는 것을 제외하고는,  리눅스 빌드 환경과 사실상 동일하다. 다만 Visual Studio가 미리 설치되어 있는 컴퓨터인 경우에는 기존의 Visual Studio를 완전히 삭제해 버리고, Visual Studio 2015 Update 3 버전을 재설치 해주어야 한다.)

  아무튼 윈도우에서 빌드를 수행하니, 성공적으로 8MB 의 펌웨어 파일이 만들어졌고, 빌드가 된 펌웨어 파일과 펌웨어 업데이트 유틸리티를 USB에 담아서 미노보드에 꽂아 실행해보았다. 결과적으로 펌웨어 업데이트는 다음과 같이 성공적으로 수행되었다.

 

 

728x90
반응형