강좌 & 팁
글 수 2,412
2015.12.05 23:01:33 (*.39.166.169)
41839
[UEFI] Build FAQ 번역
이번 번역글은 UEFI 의 Build에 대한 FAQ 입니다.
번역 원문은 http://tianocore.sourceforge.net/wiki/Build 입니다.
발로 번역한 거라 내용중 틀릴 수도 있는데 그런 부분은 꼭! 지적해 주세요.
번역된 내용은 나중에 한글 FAQ 사이트에 올려 오픈 소스 하시는 분들에게 도움이 되고 싶습니다.
번역을 도와 주신 미지님께 감사 드립니다.
Build Questions
### EDK II 빌드 명령 라인에서 다른 컴파일러 툴 체인을 어떻게 지정하나요?
빌드 명령에 -t 옵션을 사용하여 지정합니다.
예를 들어,
비주얼 스튜디오 2005 C 컴파일러 툴 체인과 윈도우 툴을 지정하기 위해서는
>Build –t VS2005 를 사용합니다.
다른 툴을 사용하려면, "시작하기 섹션"을 보십시오.
http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=Getting_Started_with_EDK_II
시작하기 섹션은 다른 툴 체인을 사용하기 위한 여러가지 내용을 다룹니다.
툴 체인과 관련된 타겟 리스트는 conf/tools_def.txt 에 있습니다.
### PCDs@build time을 사용할 수 있나요?
사용가능 유무는 어떤 것을 하고자 하는 것에 따라 달라집니다.
일단 코드 상에서는 사용 가능합니다.
예를 들면 Featureflag PCD 타입이 사용되는 경우 입니다.
이러한 선언을 빌드 과정에서 하려면
"Build –D MACRO-NAME" 옵션을 사용하는 것이 좋습니다.
### 리눅스에서 빌드와 관련된 정보가 있나요?
EDK II를 리눅스에서 빌드하기 위한 정보는 있습니다.
빌드 도구는 GCC로 재 컴파일되어야 합니다.
네이티브 GCC로 EDK II를 사용하는 경우
- http://tianocore.sourceforge.net/wiki/Using_EDK_II_with_Native_GCC
네이티브 GCC로 EDK II를 사용하는 경우
Unix 호환 시스템 (오래된 리눅스 배포판 또는 Cygwin이나 Mac OS X를 사용할 때)
- http://tianocore.sourceforge.net/wiki/Unix-like_systems
### Python 상태란 무엇인가요?
EDK II를 빌드 하기 위해서는 최소 2.5 버전 이상의 Python 이 필요합니다.
우리는 리눅스 2.6 과 2.7을 사용했습니다.
현재 Python 3+에서는 빌드할 수 없습니다.
윈도우에서, python은 EDK II를 빌드하기 위해 빌드를 설치할 필요가 없습니다.
tianocore. org의 EDI 툴킷은 Python 인터프리터를 포함하고 있습니다
이때의 Python 버전은 2.4 입니다.
오랫동안 EDK II로 옮기려는 계획을 가지고 있었습니다.
현재 (2012년 1월) 알파 스테이지에 AppPkg는 가장 최신 버전의 Python을 포함하고 있습니다.
EFI 툴킷을 위한 웹 링크 :
http://sourceforge.net/apps/mediawiki/tianocore/index.php?title=EFI_Toolkit
### 파싱 툴은 뭘 하나요?
파싱은 빌드의 첫번째 처리 과정입니다.
다음과 같은 파일들을 파싱하기 위한 툴이 있습니다.
* 빌드 설정 디스크립션 파일들
* 팩키지나 플랫폼을 위한 target.txt 파일
* make 파일을 생성하기 위한 중간 파일
* 자동 생성 파일들
### EDK II에서 UEFI 어플리케이션을 작성하고자 했을 때,
빌드가 끝난 후 바이너리 UEFI 어플리케이션과 빌드 결과는 어디에 만들어지나요?
빌드 출력 디렉토리는 DSC 파일의 define 섹션에서 지정합니다.
Nt32Pkg\Nt32Pkg.dsc 파일의 내용을 살펴보면
UEFI 어플리케이션이 생성되는 위치는 Build\NT32\DEBUG_MYTOOLS\IA32 로 지정하고 있습니다.
OUTPUT_DIRECTORY = Build/NT32
SUPPORTED_ARCHITECTURES = IA32
BUILD_TARGETS = DEBUG
### 타겟 UEFI 시스템에서 UEFI 어플리케이션을 어떻게 실행할 수 있나요?
빌드 결과로 출력 디렉토리에 생성된 UEFI 어플리케이션 바이너리 이미지를
USB 저장 장치로 복사하십시오.
UEFI 타겟 시스템에 USB 저장 장치를 삽입하십시오. 부팅하여 EFI 쉘로 진입하십시오.
USB 저장 장치는 FSO 와 같은 파일 시스템으로 포맷되어 있어야 합니다.
USB 드라이브로 이동하고 CD와 쉘 프롬프트 상태에서 UEFI 어플리케이션을 실행하세요.
### 빌드 툴의 소스도 전체 빌드 소스 코드에 포함되어 있습니까?
아닙니다. 툴 소스는 분리된 프로젝트로써 별도의 SVN 저장소를 사용합니다.
제공되는 디폴트 바이너리 툴들은 윈도우용입니다.
윈도우가 아닌 환경에서 빌드 툴을 사용하기 위해 재 컴파일되는 지침이 따로 있습니다.
www.Tianocore.org 를 참조하십시오.
BaseTools 디렉토리에 프리 빌드된 윈도우용 실행 파일과 함께 툴 소스가 있습니다.
이 소스들이 제공되는 이유는 바이너리를 빌드할 때 필요한 소스이기 때문입니다.
윈도우에서는, 새로 빌드될 필요가 없습니다.
프리 빌드된 바이너리를 바로 사용할 수 있습니다.
리눅스, 유닉스, OS/X 시스템 중 하나의 경우에는,
이 소스들은 OS 에서 수행 가능한 바이너리로 빌드되어야 합니다.
반면에 Python 일 경우에는 OS 와 상관없이 바로 실행 가능합니다.
tianocore.org 의 BaseTools 소스 프로젝트는
EDK II 툴의 확장판으로 개발이 종료 되었습니다.
툴 개발자들은 새로운 기능이 확정될 때까지 분리된 프로젝트로 작업할 것입니다.
새로운 기능이 확정되면 BaseTools 디렉토리에 추가되고
새로운 바이너리가 생성됩니다.
### Ifdefs를 사용할 수 있나요?
Ifdefs의 사용은 권장되지 않지만 빌드 과정 중에 DSC나 FDF 에서 사용할 수 있습니다.
다음은 그 사용 예입니다.
!ifdef $(SOURCE_DEBUG_ENABLE)
MSFT:*_*_X64_GENFW_FLAGS = --keepexceptiontable
GCC:*_*_X64_GENFW_FLAGS = --keepexceptiontable
INTEL:*_*_X64_GENFW_FLAGS = --keepexceptiontable
!endif
### 리포트 제너레이터는 모듈에 의해 생성된 프로토콜을 보여줄 수 있습니까?
리포트 제너레이터는 모듈에 의해 생성된 프로토콜을 보여줄 수 있습니다.
실행 중에 dxe 코어는 핸딩 오프 전에 놓친 프로토콜을 표출할 것입니다.
### 왜 EDK II 어플리케이션과 드라이버를 빌드할 때
버퍼 시큐리티 체크 플래그(빌드 옵션)를 디저블 하고
툴을 빌드할 때는 이네이블 하나요?
왜 이렇게 할까요?
운영 체제 환경에서는 UEFI 어플리케이션과 드라이버를 실행시킬 수 없습니다.
질문했던 체크 플래그는 코드 생성에 매우 중요한 영향을 끼칩니다.
해당 체크 플래그는 pre-boot에서 처리할 수 없는 코드에 두 가지 기능을 제공합니다.
해당 플래그는 컴파일 된 코드상에 코드가 추가되는 것을 가능하게 합니다.
이것은 프리 부트상태에서 허용하는 것보다 더 큰 스택 공간을 요구하게 합니다.
해당 플래그는 펌웨어 빌드 단계에서 없었던 특별한 컴파일러 함수 호출을 삽입하고
에뮬레이트에 필요한 정보는 제거합니다.
함수 없는 코드 생성이 가능하면 이 설정을 디저블 시킬 수 있습니다.
하지만, 검증과 개발 단계의 펌웨어에서 스택 오버플로우를 검출하는 것은
매우 위험하므로 가급적 다른 방법을 찾아 보십시오.
일반적으로 /Gs 플래그(위에서 주의를 주었듯이)는 사용할 수 없습니다.
툴들은 이 플래그 셋을 지원하고, 오퍼레이팅 시스템 환경에서 사용되므로,
컴파일러에 의해 추가된 내재 코드의 수행은 보장됩니다.
### EDK II에 듀얼-모드 드라이버가 있나요?
EDK II 빌드 시스템은 PI 규격된 듀얼 모드 드라이버를 지원하지 않습니다.
이러한 모듈 타입을 완전하게 구현하기는 매우 어렵습니다.
그래서 우리는 개발자들이 두 개의 각 모듈을 직접 구현할 것을 권합니다.
EDK II 에서 두개의 모듈은 같은 소스를 사용할 수 있지만,
빌드될 때, 두 개의 다른 PE/COFF 이미지가 만들어집니다.
### 바이오스 빌드 트리를 분석하는 도구가 있나요?
a) 명령 라인에서 "Build - Y" 를 입력하여 빌드 툴이 리포트 생성 빌드가 되게 하십시오.
Build - Y REPORTTYPE, --report-type=REPORTTYPE
생성될 빌드 리포트 타입을 제어하는 플래그.
[PCD, LIBRARY, FLASH, DEPEX, BUILD_FLAGS, FIXED_ADDRESS, EXECUTION_ORDER] : 이 중 하나여야만 합니다.
명령 라인에서 한 개 이상의 플래그를 지정해야 하며,
이 옵션은 다른 타입으로 여러 번 지정할 수 있습니다.
[PCD, LIBRARY, FLASH, DEPEX, BUILD_FLAGS, FIXED_ADDRESS] 은 디폴트 플래그 셋 입니다.
“–Y DEPEX”를 사용하면 의존관계 리포트 파일이 텍스트 파일 형식으로 생성됩니다.
b) 디스패치 순서를 예측하는 것에는 한계가 있습니다.
왜냐하면 모듈이 수행될 것으로 예상하기 때문입니다.
특정한 상황에서 만들어진 몇몇 PPI 와 DXE 프로토콜은 처리할 수 없습니다.
EDK2010 에 첨부된 문서는 2010년 3월에 릴리즈 되었습니다.
c) 디스패치 동작 - 에러 레벨 PcdDebugPrintErrorLevel 로
PCD의 DSC에 선언된 DEBUG_DISPATCH 필터링을 처리합니다.
### 빌드 도구는 0xFFFFFFF0에 리셋 벡터를 어떻게 로드하나요?
질문과 관련된 내용은 PI Specification Volume 3. UEFI 규격에 정의되어 있습니다.
펌웨어 볼륨 FV에는 Volume Top File 라고 불리는 것이 있습니다.
파일 타입에 상관없이, VTF는 EFI_FFS_VOLUME_TOP_FILE_GUID 라는 GUID를
파일 이름으로 가져야만 합니다.
PI 의 관점에서 실행되는 첫번째 모듈은 SEC 코어입니다.
VTF 파일은 리셋 벡터를 포함하는 기본 코드이고, SEC 코드 수행을 건너뜁니다.
https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2/UefiCpuPkg/ResetVector/Vtf0/ 를 보십시오.
FV (Firmware Volume) 는 수정할 수 없는 비트 데이터입니다.
이 FV 는 VTF( Volume Top File) 을 포함합니다.
VTF는 시작에 필요한 리셋 벡터 주소를 FV 끝에 위치 시킵니다.
대개 EFI 빌드 시스템은 재배치 가능한 PE/COFF 이미지를 구성하고,
모든 이미지는 주소가 0인 상태로 링크됩니다.
플래쉬에서 직접 수행되어야 하고 , FV가 PE/COFF 이미지로 구성되어졌다면
이런 것을 XIP(eXecute In Place) 라고 합니다.
이런 경우 PE/COFF image 를 재배치하는데
FDF 파일의 정보를 기반으로 작성된 FV 가 끝나는 위치를 기준으로 합니다.
이런 것은 빌드 시스템에서 처리됩니다.
EFI 코드가 RAM 에서 실행한다면 PE/COFF 로더에 의해 로드되고,
해당 로드 주소로 재배치됩니다.