💻
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. UEFI 개념

3. BIOS vs UEFI

Previous2. UEFI 개념Next4. UEFI 부팅 단계

Last updated 2 years ago

UEFI 부팅 모드
Legacy 부팅 모드

UEFI는 GUI 사용자 인터페이스를 제공한다.

Legacy Boot 모드는 기본적인 인터페이스만 제공된다.

GPT 파티셔닝 방식을 사용한다.

MBR 파티션 구성표를 사용한다.

UEFI는 더 빠른 부팅 시간을 제공한다.

UEFI에 비해 속도가 느리다.

UEFI는 GPT 파티셔닝 방식을 사용하므로 최대 9ZB의 저장 장치를 지원할 수 있다.

Legacy에서 사용하는 MBR 분할 방식은 최대 2TB 저장 장치만 지원한다.

UEFI는 32비트 및 64비트에서 실행되므로 마우스 및 터치 탐색이 지원된다.

Legacy는 키보드 탐색만 지원하는 16비트 모드에서 실행된다.

승인되지 않은 응용 프로그램의 로드를 방지하는 보안 부팅이 있다. 또한 운영 체제(OS)를 응용 프로그램으로 취급하기 때문에 이중 부팅을 제한할 수 있다.

인증되지 않은 응용 프로그램을 로드할 수 있는 보안 부팅 방법을 제공하지 않아 이중 부팅이 가능하다,

쉬운 업데이트 프로세스가 있다.

상대적으로 UEFI보다 복잡한 업데이트 프로세스가 존재한다.

EBC라는 바이트코드 실행 환경을 지원하기 때문에 플랫폼의 환경과 상관 없이 범용적으로 사용될 수 있다.

플랫폼에 의존적인 특징이 있어, 다른 ISA를 가진 프로세서를 사용하는 플랫폼과는 혼용이 불가능하다.

펌웨어에서 디스크에 있는 부트로더를 찾아서 실행할 수 있는 방법에 대해 생각해보면 MBR(Master Boot Record) 영역을 사용하는 것이다. MBR은 가장 보편화된 파티션 기술 이름이기도 하지만 디스크의 첫 번째 섹터(Sector 0)을 의미한다. 이 영역에는 파티션을 구성하고 있는 정보와 부트로더를 실행하기 위한 가장 기본적이고 첫 번째로 실행되어야 할 코드가 담겨있다. UEFI에서 사용하는 GPT(GUID Partition Table)도 MBR 영역 개념을 활용하고 있다.

아래 그림을 살펴보면서 BIOS와 UEFI에서 부트로더를 찾는 방법을 비교해본다. 그림을 살펴보기 전에 Core.img라고 적혀있는 부분은 부트로더를 의미하고 /boot/grub라고 적혀있는 부분은 운영체제라고 생각하면 된다.

그림을 보면 펌웨어는 MBR이나 GPT나 MBR 영역을 첫 번째로 실행하고 이 코드가 다른 곳에 저장되어 있는 부트로더를 이어서 실행한다. 그리고 운영체제를 읽어와 부팅하게 된다. 이것이 펌웨어부터 운영체제까지의 부팅과정이다.

그림에서 MBR과 GPT의 눈에 띄는 차이점은 부트로더의 위치이다. MBR은 기술 규약에 따라 부트로더가 MBR 영역에 이어서 저장되어 있지만 GPT는 부트로더의 위치를 따로 지정하지 않고 MBR에 담긴 정보를 통해 찾아가게 된다.

📖
https://blog.knoldus.com/uefi-v-s-bios/
https://en.wikipedia.org/wiki/Boot_sector