

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Microchip Curiosity PIC32MZEF용 데모 부트로더
<a name="microchip-bootloader"></a>

**중요**  <a name="deprecation-message-demo"></a>
이 데모는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

**참고**  
Microchip의 합의에 따라 AWS는 FreeRTOS 참조 통합 리포지토리 메인 브랜치에서 Curiosity PIC32MZEF(DM320104)를 제거하고 새 릴리스에는 더 이상 제공하지 않을 예정입니다. Microchip은 PIC32MZEF(DM320104)를 더 이상 새로운 설계에 사용하지 않는 것이 좋다는 [공지문](https://www.microchip.com/DevelopmentTools/ProductDetails/PartNO/DM320104)을 발표했습니다. PIC32MZEF 프로젝트 및 소스 코드는 이전 릴리스 태그를 통해 계속 액세스할 수 있습니다. Microchip은 고객이 새로운 설계에 Curiosity [PIC32MZ-EF-2.0 개발 보드(DM320209)](https://devices.amazonaws.com/detail/a3G0h0000077I69EAE/Curiosity-PIC32MZ-EF-2-0-Development-Board)를 사용할 것을 권장합니다. PIC32MZv1 플랫폼은 FreeRTOS 참조 통합 리포지토리의 [v202012.00](https://github.com/aws/amazon-freertos/tree/202012.00)에서 계속 찾을 수 있습니다. 그러나 FreeRTOS 참조의 [v202107.00](https://github.com/aws/amazon-freertos/tree/202107.00)에서는 이 플랫폼을 더 이상 지원하지 않습니다.

 이 데모 부트로더는 펌웨어 버전 확인, 암호화 서명 검증, 애플리케이션 셀프 테스트를 수행합니다. 이들 기능은 FreeRTOS에 대한 펌웨어 무선 업데이트(OTA)를 지원합니다.

펌웨어 검증에는 원격(OTA)으로 수신한 새 펌웨어의 신뢰성 및 무결성 검증이 포함됩니다. 부트로더는 부팅 전에 애플리케이션의 암호화 서명을 검증합니다. 데모에서는 SHA-256을 통한 ECDSA(Elliptic-Curve Digital Signature Algorithm)를 사용합니다. 제공된 유틸리티를 사용하여 디바이스에 플래시할 수 있는 서명된 애플리케이션을 생성할 수 있습니다.

부트로더는 OTA에 필요한 다음 기능을 지원합니다.
+ 디바이스에 애플리케이션 이미지를 유지하여 이미지 간에 전환합니다.
+ 수신된 OTA 이미지의 셀프 테스트 실행 및 실패 시 롤백을 허용합니다.
+ OTA 업데이트 이미지의 서명과 버전을 확인합니다.

**참고**  
FreeRTOS 데모를 설정하고 실행하려면 [FreeRTOS 시작하기](freertos-getting-started.md)의 단계를 따릅니다.

## 부트로더 상태
<a name="bootloader-states"></a>

부트로더 프로세스는 다음과 같은 상태 시스템으로 표시됩니다.

![\[오류 알림 옵션을 사용하여 초기화, 확인, 실행 상태 및 오류 상태를 보여주는 부트로더 상태 시스템을 시작합니다.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/images/bootloader-states.png)


다음 표에는 부트로더 상태에 대한 설명이 나와 있습니다.


| 부트로더 상태 | 설명 | 
| --- | --- | 
|  Initialization(초기화)  |  부트로더가 초기화 상태입니다.  | 
|  Verification(확인)  |  부트로더가 디바이스에 있는 이미지를 확인 중입니다.  | 
|  Execute Image(이미지 실행)  |  부트로더가 선택한 이미지를 시작 중입니다.  | 
|  Execute Default(기본 실행)  |  부트로더가 기본 이미지를 시작 중입니다.  | 
|  오류  |  부트로더가 오류 상태입니다.  | 

위 다이어그램에서 `Execute Image`와 `Execute Default`는 `Execution` 상태로 표시됩니다.

**부트로더 실행 상태**  
부트로더가 `Execution` 상태이고 확인된 선택 이미지를 시작할 준비가 되었습니다. 애플리케이션은 항상 하위 뱅크용으로 빌드되기 때문에 상위 뱅크에서 이미지를 시작할 경우 이미지를 실행하기 전에 뱅크가 바뀝니다.

**부트로더 기본 실행 상태**  
기본 이미지를 실행하는 구성 옵션이 활성화된 경우 부트로더는 기본 실행 주소에서 애플리케이션을 시작합니다. 이 옵션은 디버깅할 때를 제외하고는 비활성화해야 합니다.

**부트로더 오류 상태**  
부트로더가 오류 상태이고, 디바이스에 유효한 이미지가 없습니다. 부트로더가 사용자에게 알려야 합니다. 기본 구현은 콘솔에 로그 메시지를 전송하고, 보드의 LED를 계속 빠르게 깜박이는 것입니다.

## 플래시 디바이스
<a name="flash-device"></a>

Microchip Curiosity PIC32MZEF 플랫폼에는 두 개의 뱅크로 나뉜 2MB의 내부 프로그램 플래시가 있습니다. 이 플래시는 이 뱅크 두 개와 실시간 업데이트 간에 메모리 맵 스왑을 지원합니다. 데모 부트로더는 별도의 하위 부트 플래시 영역에서 프로그래밍됩니다.

![\[각각 부트로더, 애플리케이션 뱅크 0 및 애플리케이션 뱅크 1MB에 매핑된 2MB 리전의 하위 부팅 플래시, 하위 프로그램 플래시 및 상위 프로그램 플래시를 보여주는 메모리 레이아웃 다이어그램입니다.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/images/flash-device.png)


## 애플리케이션 이미지 구조
<a name="application-image-structure"></a>

![\[헤더, 설명자, 애플리케이션 바이너리(서명자 서비스에서 서명) 및 매직 코드, 시퀀스 번호, 시작 및 종료 주소, 실행 주소, 하드웨어 ID와 같은 필드가 있는 트레일러 섹션을 보여주는 OTA 이미지 구조입니다.\]](http://docs.aws.amazon.com/ko_kr/freertos/latest/userguide/images/application-image-structure.png)


이 다이어그램은 디바이스의 각 뱅크에 저장된 애플리케이션 이미지의 기본 구성 요소를 보여 줍니다.


| 구성 요소 | 크기(바이트) | 
| --- | --- | 
|  이미지 헤더  |  8 bytes  | 
|  이미지 설명자  |  24바이트  | 
|  애플리케이션 이진 파일  |   < 1MB - (324)  | 
|  트레일러  |  292바이트  | 

## 이미지 헤더
<a name="image-header"></a>

디바이스의 애플리케이션 이미지는 매직 코드와 이미지 플래그로 구성된 헤더로 시작해야 합니다.


| 헤더 필드 | 크기(바이트) | 
| --- | --- | 
|  매직 코드  |  7바이트  | 
|  이미지 플래그  |  1바이트  | 

### 매직 코드
<a name="magic-code"></a>

플래시 디바이스의 이미지는 매직 코드로 시작해야 합니다. 기본 매직 코드는 `@AFRTOS`입니다. 부트로더는 이미지를 부팅하기 전에 유효한 매직 코드가 있는지 검사합니다. 이것이 검증의 첫 단계입니다.

### 이미지 플래그
<a name="image-flags"></a>

이미지 플래그는 애플리케이션 이미지의 상태를 저장하는 데 사용됩니다. 플래그는 OTA 프로세스에서 사용됩니다. 두 뱅크의 이미지 플래그는 디바이스의 상태를 결정합니다. 실행 이미지가 커밋 대기 중으로 표시되면 디바이스는 OTA 셀프 테스트 단계입니다. 디바이스의 이미지가 유효한 것으로 표시되더라도 부팅할 때마다 동일한 검증 단계를 거칩니다. 이미지가 새 이미지로 표시된 경우, 부트로더는 해당 이미지를 커밋 대기 중으로 표시하고 검증 후 셀프 테스트를 위해 이미지를 시작합니다. 또한 부트로더는 감시 타이머를 초기화하고 시작함으로써 새 OTA 이미지가 셀프 테스트에 실패할 경우 디바이스가 재부팅되고, 부트로더는 이미지를 삭제하여 거부하고, 이전의 유효한 이미지를 실행하도록 합니다.

디바이스에는 유효한 이미지가 한 개만 있어야 합니다. 다른 이미지는 새 OTA 이미지이거나 커밋 대기 중(셀프 테스트) 상태일 수 있습니다. OTA 업데이트가 성공하면 디바이스에서 이전 이미지가 삭제됩니다.


| 상태 표시기 | 값 | 설명 | 
| --- | --- | --- | 
|  새로운 이미지  |  0xFF  |  애플리케이션 이미지가 새 이미지이며 실행되지 않습니다.  | 
|  커밋 대기 중  |  0xFE  |  애플리케이션 이미지가 테스트 실행용으로 표시되었습니다.  | 
|  유효함  |  0xFC  |  애플리케이션 이미지가 유효로 표시되고 커밋되었습니다.  | 
|  잘못됨  |  0xF8  |  애플리케이션 이미지가 잘못됨으로 표시되었습니다.  | 

## 이미지 설명자
<a name="image-descriptor"></a>

플래시 디바이스의 애플리케이션 이미지는 이미지 헤더 뒤에 이미지 설명자를 포함해야 합니다. 이미지 설명자는 구성 파일(`ota-descriptor.config`)을 사용하여 해당 설명자를 생성하고 이 설명자를 애플리케이션 이진 파일에 추가하는 포스트 빌드 유틸리티를 통해 생성됩니다. 이 빌드 후 단계의 출력은 이진 이미지이며 OTA에 사용할 수 있습니다.


| 설명자 필드 | 크기(바이트) | 
| --- | --- | 
|  시퀀스 번호  |  4 bytes  | 
|  시작 주소  |  4 bytes  | 
|  종료 주소  |  4 bytes  | 
|  실행 주소  |  4 bytes  | 
|  하드웨어 ID  |  4 bytes  | 
|  예약  |  4 bytes  | 

**시퀀스 번호**  
시퀀스 번호가 증가한 뒤에 새 OTA 이미지를 빌드해야 합니다. `ota-descriptor.config` 파일을 참조하십시오. 부트로더는 이 번호로 부팅할 이미지를 결정합니다. 유효한 값은 1\$14294967295입니다.

**시작 주소**  
디바이스에 있는 애플리케이션 이미지의 시작 주소입니다. 이미지 설명자가 애플리케이션 이진 파일에 추가되기 때문에 이 주소는 이미지 설명자의 시작입니다.

**종료 주소**  
디바이스에 있는 애플리케이션 이미지의 종료 주소입니다(이미지 트레일러 제외).

**실행 주소**  
이미지의 실행 주소입니다.

**하드웨어 ID**  
OTA 이미지가 올바른 플랫폼용으로 빌드되었는지 확인하기 위해 부트로더가 사용하는 고유한 하드웨어 ID입니다.

**예약**  
나중에 사용하기 위해 예약되어 있습니다.

## 이미지 트레일러
<a name="image-trailer"></a>

이미지 트레일러는 애플리케이션 이진 파일에 추가됩니다. 서명 유형 문자열, 서명 크기, 이미지의 서명 등이 들어 있습니다.


| 트레일러 필드 | 크기(바이트) | 
| --- | --- | 
|  서명 유형  |  32바이트  | 
|  서명 크기  |  4 bytes  | 
|  서명  |  256 bytes  | 

**서명 유형**  
이 서명 유형은 사용되는 암호화 알고리즘을 나타내며, 트레일러를 위한 마커 역할을 합니다. 부트로더는 ECDSA(Elliptic-Curve Digital Signature Algorithm)를 지원합니다. 기본값은 sig-sha256-ecdsa입니다.

**서명 크기**  
암호화 서명의 크기(바이트)입니다.

**서명**  
이미지 설명자와 함께 추가된 애플리케이션 이진 파일의 암호화 서명입니다.

## 부트로더 구성
<a name="bootloader-configuration"></a>

기본 부트로더 구성 옵션은 `freertos/vendors/microchip/boards/curiosity_pic32mzef/bootloader/config_files/aws_boot_config.h`에 제공됩니다. 일부 옵션은 디버그용으로만 제공됩니다.

**기본 시작 활성화**  
기본 주소에서 애플리케이션을 실행할 수 있도록 하고, 디버그용으로만 활성화합니다. 이미지는 검증 없이 기본 주소에서 실행됩니다.

**암호화 서명 검증 활성화**  
부팅 시 암호화 서명 검증을 활성화합니다. 실패한 이미지는 디바이스에서 삭제됩니다. 이 옵션은 디버그용으로만 제공되며, 프로덕션 환경에서 활성 상태로 유지해야 합니다.

**잘못된 이미지 삭제**  
뱅크에서 이미지 검증이 실패할 경우 전체 뱅크를 삭제합니다. 이 옵션은 디버그용이며, 프로덕션 환경에서 활성 상태여야 합니다.

**하드웨어 ID 검증 활성화**  
OTA 이미지의 설명자에 있는 하드웨어 ID와 부트로더에 프로그래밍된 하드웨어 ID를 검증합니다. 선택 사항이며, 하드웨어 검증이 필요하지 않은 경우 비활성화할 수 있습니다.

**주소 검증 활성화**  
OTA 이미지의 설명자에 있는 시작, 종료, 실행 주소를 검증합니다. 이 옵션을 항상 활성화해 놓는 것이 좋습니다.

## 부트로더 빌드
<a name="building-bootloader"></a>

데모 부트로더는 FreeRTOS 소스 코드 리포지토리의 `freertos/vendors/microchip/boards/curiosity_pic32mzef/aws_demos/mplab/`에 있는 `aws_demos` 프로젝트에 로드 가능한 프로젝트로 포함되어 있습니다. 빌드된 `aws_demos` 프로젝트는 먼저 부트로더를 빌드한 다음 애플리케이션을 빌드합니다. 최종 출력은 부트로더와 애플리케이션을 포함하여 통합 16진 이미지입니다. 암호화 서명이 있는 통합 16진 이미지를 생성할 수 있도록 `factory_image_generator.py` 유틸리티가 제공됩니다. 부트로더 유틸리티 스크립트는 `freertos/demos/ota/bootloader/utility/`에 있습니다.

### 부트로더 빌드 전 절차
<a name="bootloader-pre-build"></a>

이 빌드 전 절차는 코드 서명 인증서에서 퍼블릭 키를 추출하는 `codesigner_cert_utility.py` 유틸리티 스크립트를 실행하고, 퍼블릭 키를 포함하는 C 헤더 파일을 ASN.1(Abstract Syntax Notation One) 인코딩 형식으로 생성합니다. 이 헤더는 부트로더 프로젝트에 컴파일됩니다. 생성된 헤더에는 퍼블릭 키 배열과 키 길이, 두 개의 상수가 들어 있습니다. `aws_demos`를 사용하지 않고 부트로더 프로젝트를 빌드할 수도 있으며 일반 애플리케이션처럼 디버깅할 수 있습니다.