💻
UEFI 프로젝트
  • 🧑‍🏫프로젝트 개요
  • 📖UEFI 개념
    • 1. BIOS의 과거
    • 2. UEFI 개념
    • 3. BIOS vs UEFI
    • 4. UEFI 부팅 단계
  • 🖥️UEFI 개발
    • UEFI 개발 시작하기
      • 0. EDK II 빌드 환경 구성
      • 1. 간단한 EFI application 만들기
      • 2. 간단한 Pkg 만들기
      • 3. Hello World 출력하기
      • 4. 라이브러리와 Hello World
      • 5. Conf를 통한 Build 단순화
    • 핸들 및 프로토콜
      • 6. 핸들/프로토콜 데이터 베이스 구조 - Part 1
      • 7. 핸들/프로토콜 데이터 베이스 구조 - Part 2
      • 8. HandleProtocol API 함수 & ImageHandle 프로토콜을 통한 정보
      • 9. ProtocolsPerHandle API를 통한 ImageHandle 프로토콜 가져오기
      • 10. EFI_STATUS 타입 과 EFI_ERROR 매크로
    • 메모리 맵
      • 11. EFI 메모리 맵 정보 얻기
      • 12. EFI 메모리 맵을 리눅스 커널 스타일로 바꾸기
    • 명령줄 인수를 받는 간단한 앱 만들기
      • 13.ShellAppMain Entry point
      • 14.gRT->GetNextVariableName API를 사용하여 모든 변수 이름 및 GUID 가져오기
    • 부팅 옵션
      • 15. gRT->GetVariable API를 사용하여 부팅 변수 가져오기 및 구문 분석
      • 16. OVMF 이미지 내에 부팅 옵션 추가
      • 17. 부팅 옵션에 WaitForEvent 함수 추가
      • 18. ReadKeyStroke 함수로 사용자 입력 처리
      • 19. bcfg 명령어를 사용한 부팅 옵션 수정
    • PCD
      • 20. PCD 소개
      • 21. PCD 변수에 대한 Overriding
      • 22. Feature Flag PCD와 BOOLEAN FixedAtBuild PCD의 비교
      • 23. PatchableInModule PCD 및 GenPatchPcdTable/PatchPcdValue 유틸리티를 통해 PCD를 변경하는 방법
      • 24. Dynamic/DynamiEx PCDs
      • 25. PCD 더 알아보기
    • 테이블
      • 26. EFI_CONFIGURATION_TABLE에서 참조되는 테이블
      • 27. dmem/EFI_SMBIOS_PROTOCOL/smbiosview를 통해서 SMBIOS 정보 가져오기
      • 28. EFI_SHELL_PROTOCOL을 통하여 ACPI 테이블을 파일에 저장하기
      • 29. EFI_ACPI_SDT_PROTOCOL 및 ShellLib를 사용하여 ACPI BGRT 테이블에서 BMP 이미지 저장하기
    • PCI
      • 30. PCI 루트 브리지 찾은 후 시스템의 모든 PCI 기능 가져오기
      • 31. ShellLib/PrintLib 함수를 사용해 PCI Vendor/Device 정보 가져오기
      • 32. EFI_PCI_IO_PROTOCOL을 사용해 PCI Option ROM 이미지 표시
      • 33. EfiRom 유틸리티를 사용한 PCI Option ROM 이미지 파싱 및 생성
    • 드라이버 및 라이브러리
      • 34. 간단한 UEFI 드라이버 생성
      • 35. 애플리케이션에서 사용할 간단한 라이브러리 생성
      • 36. Library의 constructor와 destructor, NULL Library
      • 37. Shell에 acpiview 명령을 추가하는 방법 조사
      • 38. 사용자 지정 프로토콜을 만들고 사용하기
      • 39. RegisterKeyNotify / UnrigisterKeyNotify 함수를 사용해 단축키 기능을 추가하는 드라이버 만들기
      • 40. Key #### NVRAM 변수
    • 디버그
      • 41. DEBUG 출력문 내부 구조와 DEBUG 문 제어를 위한 PCD 분석, 그리고 OVMF 부트 로그 가져오기
      • 42. GDB를 이용한 Driver/Application 및 OVMF Debug
    • HII
      • 43. HII 데이터베이스 개념 및 출력
      • 44. HII 데이터베이스 내부
      • 45. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 문자열 목록 게시
      • 46. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 HII 패키지 목록 게시
      • 47. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 HII 패키지 목록 게시
      • 48. UNI 파일 및 HiiLib를 사용하여 HII String 패키지 게시 및 작업하기
      • 49.MODULE_UNI_FILE/PACKAGE_UNI_FILE/[UserExtensions.TianoCore."ExtraFiles"]의 도움으로 UNI 파일 선언하기
      • 50.UEFI_HII_RESOURCE_SECTION을 사용하여 문자열 패키지와 함께 HII 패키지 목록 게시하기
      • 51. UEFI APP에 메뉴얼 추가하기(shell의 -?와 help 옵션)
      • 52. Russian 글꼴 추가 - Part 1.
      • 53. Russian 글꼴 추가 - Part 2.
      • 54. EFI_HII_STRING_PROTOCOL의 NewString 및 SetString 함수를 사용하여 다른 언어에 대한 문자열 패키지를 동적으로 추가
      • 55. PlatformLangCodes EFI 변수 수정 및 다른 언어를 동적 추가하기
      • 56. 코드에서 FILE_GUID 및 BASE_NAME을 가져오기
    • VFR
      • 57. VFR을 사용해 간단한 폼 생성 및 EFI_FORM_BROWSER2_PROTOCOL.SendForm()를 통해 화면에 폼 표시하기
      • 58. VFR 요소 : subtitle 및 text
      • 59. 간단한 폼 애플리케이션을 UEFI 드라이버 Form으로 변환하기
      • 60. gRT->SetVariable() 함수를 사용한 UEFI 변수 생성, 변경 및 삭제
      • 61.dmpstore 명령을 사용하여 변수를 파일에 저장/로드하기
      • 62. UEFI Device path의 구조
      • 63. checkbox를 가진 HII 폼 만들기
      • 64. checkbox를 가진 HII폼 만들기
      • 65. VFR 추가 입력 요소 Part 1: number
      • 66. VFR 추가 입력 요소 Part 2: string
      • 67. VFR 추가 입력 요소 Part 3: date & time
      • 68. VFR 추가 입력 요소 Part 3: oneof & orderedlist
      • 69. VFR의 조건부 키워드
      • 70. VFR의 상수 및 연산자가 내장된 기본 조건문
      • 71. 기본 VFR 내장 문자열용 함수
      • 72. label 키워드를 이용하여 HII 양식에 동적 요소 추가하기
      • 73. VFR question 기본값 설정
  • 🔐UEFI 보안
    • 1. 개요
    • 2. 공격 벡터
    • 3. mitigation
    • 4. 정적 분석 방법
    • 5. 동적 분석 방법
Powered by GitBook
On this page
  • 1. SEC
  • 2. PEI
  • 3. DXE
  • 4. BDS
  • 5. TLS
  • 6. RT
  1. UEFI 개념

4. UEFI 부팅 단계

Previous3. BIOS vs UEFINextUEFI 개발 시작하기

Last updated 2 years ago

UEFI를 통한 시스템의 부팅 과정은 Legacy BIOS보다 더 방법론적이며 조직적인 구성을 나타낸다.

총 7단계로 나타낼 수 있으며 각 단계별 수행 동작 정보는 아래와 같다.

SEC-PEI, DXE Phase까지는 BIOS의 POST(Power-On Self Test)에 해당하는 PI(Platform Initialization) 단계이다.

1. SEC

CPU의 초기화는 32비트 protected mode나 64비트 long mode로 수행할 수 없기 때문에 16비트 real mode의 instruction을 실행한다. 이 real mode에서 수행되는 작업은 프로세서를 보호 모드로 전환하는 것이다. 그리고 DRAM이 초기화되기 이전이기 때문에 CPU cache를 임시 RAM으로 사용할 수 있도록 한다(Cache-As-Ram).

2. PEI

SPI flash 내부의 FV(firware volume)에 존재하며 윈도우 PE형식과 유사한 TE형식의 모듈로 구성되어 있다. 주 메모리 검색 및 초기화를 담당하고, 메인 RAM 사용이 가능해지면 CAR 메모리를 마무리하고 마더보드의 다른 장치 초기화를 이행한다.

  • TE(Trese Executable): PE 형식보다 더 작은 이미지 크기를 지닌 파일 형식

3. DXE

DXE 단계에서는 PEI와 유사하게 FV가 존재한다. 하지만 TE file 형식이 아닌 실행 모듈을 이용하며, PE32와 PE32+(64비트) file이 사용된다. 모든 DXE 모듈을 열거하고 하나씩 실행하는 전용 디스패처가 존재한다. 각 모듈은 SMM 설정, 네트워킹, 스토리지 및 파일 시스템 스택 노출 등 기본적으로 UEFI 기반 부트로더가 OS(커널)을 불러오는데 필요한 모든 서비스를 제공한다. 보안 부팅이 구현되는 곳이며 가장 중요한 단계이다.

  • SMM(System Management Mode): SMI(System Management Interrupt)에 의해 호출되어지며 root 권한으로 펌웨어를 실행하는 모드이다.

4. BDS

DXE 단계 이후에 GPT 디스크와 EFI 시스템 파티션을 찾는다. 윈도우의 경우에는 bootmgfw.efi 가 로드되고 실행되며, 리눅스의 경우에는 grub.efi 등 각 운영체제별 부트로더 정보가 존재한다.

5. TLS

이 단계에서는 OS가 없는 UEFI 셸(shellx64.efi) 실행이 가능하며 일반적인 부트 로더가 실행된다. winload.efi와 같은 부트로더는 커널을 위한 실행 환경을 구축하고 커널 자체를 로드한다. 완료 후에는 ExitBootServices()라는 UEFI 서비스를 호출하고 부트 프로세스의 종료를 알린다.

6. RT

EFI는 부트 프로세스 종료 이후에 커널이 동작을 수행하고 있는 동안에 디바이스 드라이버를 로드하거나 서비스 및 백그라운드 프로세스 생성에 이용되어 진다. core 서비스들 중에서 부트 프로세스 종류 이후에도 메모리에 상주되는 런타임 서비스들이 이에 관여한다.

📖
UEFI boot process