← 포트폴리오로 돌아가기

BOOTLOADER EVIDENCE

UDS를 통한 Flash Backup & Restore 근거 자료

메모리 구획, UDS 리프로그래밍 시퀀스, 테스트 케이스별 근거 수준, Trace32 기반 Alignment Trap 분석을 한 페이지에 모았습니다. 주소값·함수명·코드는 개인 프로젝트에서 실제로 사용한 값 그대로입니다.

유형
개인 프로젝트
기간
2026.03.03–2026.03.24
팀 규모
1명
기여도
100%
환경
AURIX TC234LP · Embedded C · CANoe · Trace32

OVERVIEW

시스템 구조와 리프로그래밍 흐름

Tester → CAN·ISO-TP → BswCom → BswDcm → RTE → ECU Abstraction → MCAL → PFlash·DFlash

Programming Session · DiagnosticSessionControl(0x10) → SecurityAccess(0x27) → Erase·Backup · RoutineControl(0x31) → RequestDownload(0x34) → TransferData(0x36) → RequestTransferExit(0x37) → SHA-256 확인 → ECUReset(0x11)

당시 구현 범위

아래는 교육 당시 구현과 기록의 정리입니다. 이후 발견한 길이 상한·권한 검사 누락과 valid pattern 기록 순서 문제는 CODE REVIEW에 구분했습니다. 개선안은 적용·빌드·ECU 검증하지 않았으며, 정상 경로의 동작 기록이 모든 실패 조건에서의 안전성을 뜻하지 않습니다.

MEMORY MAP

AURIX TC234LP Bootloader의 PFlash·DFlash 구획과 Backup·Restore 방향을 실제 링커 주소로 정리했습니다.

Bootloader, Application Primary, Valid Pattern, Backup, DFlash 영역의 실제 주소와 Backup Restore 방향을 표시한 Memory Map
Bootloader용 링크 스크립트의 주소와 크기를 기준으로 시각화했습니다.

영역 정의

링커 정의 기반 Flash 구획
영역주소 범위크기용도관련 함수·심볼
Bootloader User0x80000000–0x80025FFF152 KiBBootloader 코드와 BMHD 인접 영역, 실행 시작점 0x80000020RESET
Bootloader INTTAB·Trap0x80026000–0x80027FFF8 KiB인터럽트 벡터 및 Trap TableINTTAB 0x80026000, BTV 0x80027800
Application Primary0x80100000–0x8017DFFF504 KiB현재 실행 대상 Application BinaryMEMORY_ADDRESS_APPLICATION, EA_AppToBackup()
Application INTTAB0x8017E000–0x8017FFDF8 KiB - 32 BApplication 벡터 영역pflash_app_inttab
Valid Pattern0x8017FFE0–0x8017FFFF32 B리프로그래밍 완료·실행 가능 상태 표시pflash_app_valid
Application Backup0x80180000–0x801FFFFF512 KiB업데이트 전 Application 보존 및 실패 복구EA_AppToBackup(), EA_AppRestore()
DFlash Bank 00xAF000000–0xAF01FFFF128 KiB비휘발성 상태·로그 저장 후보 영역dflash0
DFlash Bank 10xAF100000–0xAF103FFF16 KiB비휘발성 보조 영역dflash0

근거

#define INTTAB     0x80026000
#define RESET      0x80000020
#define IFXTRAPTAB (INTTAB + 0x1800)

memory pflash_app_valid {
    size = 32;
    map cached(dest_offset=0x8017FFE0, size=32);
}

memory pflash_app_backup {
    size = 512k;
    map cached(dest_offset=0x80180000, size=512k);
}

Bootloader 링크 설정에서 Application과 Backup은 reserved rom으로 선언되어 Bootloader 코드가 해당 영역에 배치되지 않습니다. SHA-256은 이 프로젝트에서 Binary 변경 여부를 판단하는 무결성 검사로 사용했습니다.

UDS SEQUENCE

UDS 7개 서비스의 대표 호출 흐름과 Backup·Restore 분기를 요약했습니다. 전체 오류 처리의 완전성이나 안전성을 입증하는 시퀀스는 아닙니다.

UDS 대표 호출 흐름과 SHA-256 불일치 Restore 분기, valid pattern 선기록 결함을 표시한 도식
교육 당시 서비스 분기와 RTE·Flash 호출 관계의 개요입니다. 해시 비교와 valid pattern 기록의 세부 순서는 아래 구현 한계 설명을 함께 확인해야 합니다.

서비스 순서

UDS 리프로그래밍 서비스와 책임
순서서비스당시 구현 흐름확인 범위·미해결 문제
10x10 DiagnosticSessionControlProgramming Session 진입정상 절차의 진입 흐름. 모든 서비스의 세션 검사를 보장하지 않음
20x27 SecurityAccessSeed/Key 교환 분기고정 Seed/Key 사용. EraseMemory 권한 검사 누락은 별도 미해결
30x31 RoutineControlEA_AppToBackup() 후 RID_EraseMemory 실행요청 길이·세션·권한·physical request 검사 누락. Backup 실패 시 Erase 차단은 공개 근거로 입증하지 못함
40x34 RequestDownload주소·길이와 전송 상태 초기화광고한 블록 길이와 실제 TransferData 길이 상한 검사는 별개이며, 후자는 누락
50x36 TransferDataBlock Sequence 처리, Binary 기록, SHA-256 누적길이 상한·ISO-TP 재조립 경계 검사 누락. 순서 오류 시험은 근거 부족
60x37 RequestTransferExit전송 종료, valid pattern 기록 및 SHA-256 비교SHA-256 검증 전에 valid pattern을 기록하는 순서 결함. 수정안 미적용
70x31 RID_CheckProgrammingDependencies프로젝트 구현의 의존성 확인 분기완전한 의존성·안전 조건 검사를 입증한 것은 아님
80x11 ECUResetReset 및 Application 실행 경로Restore 후 Application 정상 진입은 별도 실행 근거 부족

RoutineControl 실제 정의

#define RID_CheckProgrammingDependencies 0x0001u
#define RID_EraseMemory                  0x0002u
#define RCOR_EraseMemory_App             0xF001u

31 01 00 02 F0 01
|  |  |-----| |---|
SID   RID       RCOR

BswDcm
→ Rte_Call_BswDcm_rEcuAbsFls_erasePflashBlock()
→ REoiEcuAbs_pEcuAbsFls_erasePflashBlock()
→ EA_erasePflashBlock()

설계 의도와 당시 구현의 차이: SHA-256 불일치 시 EA_AppRestore()를 호출하는 복구 분기는 구현했지만, RequestTransferExit에서 해시 검증 전에 valid pattern을 기록했습니다. 검증 성공 후에만 valid pattern을 기록하도록 바꾸는 것은 미적용 개선안입니다. 이 자료는 불일치·전원 중단 상황에서 신규 Application 부팅이 항상 차단된다고 주장하지 않습니다.

TEST RESULTS

각 시험의 판정과 근거 유형을 별도 열로 표시했습니다. 아래 결과는 교육 당시 기록을 정리한 것으로, 현재 환경에서 새로 실행한 시험 결과가 아닙니다.

기록상 PASS는 당시 실행·재검증 기록에 통과 결과가 서술된 항목입니다. 현재 재시험이나 독립 검증을 뜻하지 않으며, 원본 로그가 공개되지 않은 경우도 근거 유형에 표시합니다. 정적 확인은 코드·설계 기록만 확인한 것으로 실행 시험 통과가 아닙니다. 근거 부족은 수행 서술은 있으나 판정을 뒷받침할 자료가 부족한 경우, 실행 미확인은 실행 여부부터 확인할 수 없는 경우입니다. 기록 부재를 미실행으로 단정하지 않습니다.

정리한 시험 시나리오

테스트 케이스·결과

Bootloader 공개 테스트 결과표
ID검증 목적사전 조건입력·절차기대 결과기록·확인 내용판정근거 유형공개 자료
BL-TC-01정상 리프로그래밍Programming Session·SecurityAccess 완료0x34→0x36→0x37 순서로 정상 Binary 전송전송 완료, Binary 기록, 종료 응답당시 리프로그래밍 기록에 정상 종료 서술기록상 PASS당시 실행기록 (원본 비공개)구현 개요
BL-TC-02Block Sequence 불일치TransferData 진행 중예상 번호와 다른 Block Sequence 요청NRC 후 전송 상태 유지 또는 중단처리 분기 서술만 있고 실행 판정 근거 부족근거 부족코드·프로젝트 서술 / 실행 근거 부족공개 실행 자료 없음
BL-TC-03TransferData 길이 초과Download 범위 설정 완료허용 길이를 넘는 데이터 요청길이·범위 오류로 거부 (설계 목표)실행 여부 미확인. 정적 리뷰에서는 길이 상한 누락 발견실행 미확인실행 기록 미확인 / 정적 리뷰길이 상한 결함
BL-TC-04전송 중단과 Valid Pattern기존 Application Backup 완료리프로그래밍 중단 후 ResetInvalid Pattern 감지, 신규 App Jump 금지 (설계 목표)Pattern 판단 로직 기록만 확인. 중단 후 부팅 차단을 실행으로 입증하지 못함정적 확인코드·설계 기록의 정적 확인valid pattern 순서 결함
BL-TC-05변경 Binary SHA-256 불일치변경 Binary 준비Hash 갱신 없이 Binary 변경 후 전송storedHash와 calcHash 불일치, Restore 분기당시 Secure Flash 1.0 기록에 불일치·복구 호출 서술. 안전한 valid 기록 순서는 별도 미해결기록상 PASS당시 실행기록 (원본 비공개)복구 절차 요약
BL-TC-06Primary→Backup정상 Application 존재EA_AppToBackup() 실행Secondary Erase 후 chunk 단위 복사당시 코드·실행 기록에 Backup 흐름 확인 결과 서술기록상 PASS당시 실행기록 (원본 비공개) + 코드복사 절차 요약
BL-TC-07무결성 실패 후 RestoreBackup 유효, 신규 Binary 불일치EA_AppRestore() 실행Primary Erase 후 Backup 복원당시 Restore 코드·양방향 복사 재검증 기록. 복원 후 App 실행은 BL-TC-08로 분리기록상 PASS당시 실행기록 (원본 비공개) + 코드복구 절차 요약
BL-TC-08Restore 후 Application 실행Restore 완료Reset 후 Application 실행 경로 확인복원 Application 정상 진입정상 진입 판정에 필요한 별도 실행 근거 부족근거 부족프로젝트 서술 / 실행 근거 부족공개 실행 자료 없음
BL-TC-09비정렬 버퍼 오류 재현RoutineControl Erase/Backup 요청uint8 copyBuf로 FlsLoader_Write()Alignment Trap 또는 응답 중단 재현당시 CAN 응답 중단·Trap 조사 기록과 공개 캡처기록상 PASS당시 실행기록 + 공개 CANoe·Trace32 캡처원인 분석 · DMI 캡처
BL-TC-104바이트 정렬 수정 회귀uint32 backing buffer 적용Primary↔Backup Write·Read 반복Trap 없이 복사 및 SHA-256 판정 완료당시 양방향 Write·Read 재검증 기록. 공개 자료는 수정 전후 코드와 절차 요약기록상 PASS당시 실행기록 (원본 비공개) + 수정 전후 코드수정 코드 · 절차 요약

근거 범위

당시 기록과 현재 확인

Logical Memory Redundancy, Secure Flash 1.0, Reprogramming Log Analysis, Aligned Memory Access Error의 당시 기록을 요약했습니다. 현재 TASKING·EB tresos와 대상 ECU가 없어 새 빌드나 하드웨어 재시험은 하지 않았습니다.

공개 범위

확보한 CANoe·Trace32 캡처와 코드 발췌만 공개합니다. 원본 실행 로그가 없는 링크는 구현·절차 요약으로 표시했으며, 요약 문서를 실행 로그 자체로 제시하지 않습니다.

근거 문서와 공개 형태
개인 기록공개한 내용형태
Logical Memory RedundancyEA_AppToBackup(), EA_AppRestore(), Valid Pattern코드·흐름
Secure Flash 1.0변경 Binary와 SHA-256 불일치결과 요약
Aligned Memory Access ErrorPC·BTV·Breakpoint·정렬 수정Trace32 Case Study

TRACE32 · RESTORE

SID 0x31 RoutineControl 처리 중 발생한 CAN 응답 중단을 Trace32의 함수 Breakpoint, Register·Variable View와 DMI Trap 정보로 추적했습니다. copyBuf, A5, DEADD가 동일한 비정렬 주소 0x7000240D를 가리키는 것을 확인해 FlsLoader_Write() source buffer의 4바이트 정렬 위반을 원인으로 특정했습니다.

Trace32 디버깅 흐름

  1. 1. 증상SID 0x31 RoutineControlRCOR_EraseMemory_App 처리에서 EA_AppToBackup() 호출 이후 ECU의 CAN 응답이 중단됐습니다.
  2. 2. 함수 BreakpointBreak.Set EA_AppToBackup 후 함수 진입과 FlsLoader_Write() 인수를 추적했습니다.
  3. 3. Source address 확인Variable View의 copyBuf와 Register A5가 모두 0x7000240D를 가리키는 것을 확인했습니다.
  4. 4. Alignment Trap 확인DMI에서 ALN ErrorDEADD = 0x7000240D를 확인해 오류 주소를 교차 검증했습니다.
  5. 5. Trap Vector 포착Break.Set 0x80027800++0xFF /Program /Onchip 적용 후 BTV = 0x80027800, PC = 0x80027840 상태를 확인했습니다.
  6. 6. 원인static uint8 copyBuf[]의 실제 배치가 Flash Loader의 4바이트 source buffer 정렬 조건을 충족하지 못한 것으로 특정했습니다.
  7. 7. 수정·재검증uint32 backing array와 uint8* view를 적용한 뒤 Application→Backup→Application 양방향 Write·Read와 SHA-256 판정을 다시 수행했습니다.

실제 디버깅 근거

아래 화면은 실제 프로젝트 수행 중 CANoe와 Trace32에서 수집했습니다. UDS 요청·응답, 함수 인수, Register, Variable View와 DMI 상태를 함께 비교해 Memory Alignment Error의 발생 주소와 원인을 확인했습니다.

CANoe UDS RoutineControl 요청 응답 Trace
UDS 응답 흐름

DiagnosticSessionControl(0x10), SecurityAccess(0x27), RoutineControl(0x31)의 요청·응답과 중단 구간을 확인했습니다.

copyBuf A5 alignment error address Trace32 화면
Source address 추적

copyBuf 시작 주소와 A5, Trace32 오류 표시가 0x7000240D로 일치했습니다.

DMI ALN Error DEADD 0x7000240D 화면
DMI Trap 분석

ALN ErrorDEADD = 0x7000240D를 확인해 정렬 위반 주소를 교차 검증했습니다.

BTV 0x80027800 PC 0x80027840 Trap Vector Breakpoint 화면
Trap Vector Breakpoint

BTV = 0x80027800, PC = 0x80027840을 확인해 Trap Vector 범위 진입을 직접 포착했습니다.

정렬 수정 전후 코드

수정 전

static uint8 copyBuf[MEMORY_COPY_CHUNK_SIZE];

memcpy(copyBuf,
       (const void *)(MEMORY_ADDRESS_APPLICATION + offset),
       copySize);

*errorResult = (uint8)FlsLoader_Write(
    MEMORY_ADDRESS_BACKUP + offset,
    copySize,
    copyBuf);

수정 후 핵심

static uint32 copyBufAligned[
    MEMORY_COPY_CHUNK_SIZE / sizeof(uint32)
];
uint8 *copyBuf = (uint8 *)copyBufAligned;

/* uint32 backing storage: 4-byte alignment
 * uint8* view: byte-wise memcpy compatibility */

Backup·Restore 재검증

양방향 Flash 복구 절차
방향EraseSourceDestination검증
Application Primary → BackupPFLASH_AREA_APPICATION_SECONDARYMEMORY_ADDRESS_APPLICATION + offsetMEMORY_ADDRESS_BACKUP + offsetWrite return, read-back, SHA-256
Backup → Application PrimaryPFLASH_AREA_APPICATION_PRIMARYMEMORY_ADDRESS_BACKUP + offsetMEMORY_ADDRESS_APPLICATION + offsetWrite return, read-back, SHA-256

정렬 수정 후 Application Primary→Backup(EA_AppToBackup())과 Backup→Application Primary(EA_AppRestore()) 양방향 Flash Write·Read, UDS 응답 흐름과 SHA-256 판정을 다시 확인했습니다.

CODE REVIEW

기능 동작으로 끝내지 않고 완성된 C/H를 다시 읽어 입력 경계와 검증 순서를 점검했습니다. 아래는 스스로 찾아 문서화한 결함입니다.

이 항목들은 게시된 소스를 정적으로 검토해 확인한 것이며, 개선안을 실제로 구현·빌드·ECU에서 검증한 결과가 아닙니다. 교육 당시 snapshot은 무결성 비교를 위해 수정하지 않고 보존했습니다.