임베디드기사 실기 05 — 펌웨어 설계·구현·테스팅 (ELF·링커·스타트업 코드·부팅·플래시)
출제기준 2-1: 펌웨어 설계, 구현 및 테스팅하기
스타트업 코드는 2015·2020·2024 같은 문제가 3번!
readelf, MTD, 링킹도 2~3번씩 나온 핵심 단원이에요.
📎 필기 시리즈의 펌웨어 편과 함께 보면 좋아요. (링크 추가 예정)
실기 출제 포인트 ⭐⭐⭐
| 키워드 | 핵심 내용 | 빈도 | 기출 |
|---|---|---|---|
| 키워드 | 핵심 내용 | 빈도 | 기출 |
| 스타트업 코드 | 전원 인가 후 가장 먼저 실행, 7단계 순서 | ⭐⭐⭐ | 2015 Q11, 2020 Q1, 2024 Q12 |
| ELF / readelf | ELF 구조 확인 명령어 | ⭐⭐⭐ | 2016 Q16, 2020 Q4, 2025 Q8 |
| 링킹 / 링커 | 오브젝트 + 라이브러리 → 실행 파일, 정적/동적 | ⭐⭐⭐ | 2021 Q12, 2022 Q7, 2023 Q16, 2024 Q19, 2025 Q1 |
| MTD / FTL | 플래시 파티션 분할 / 블록 디바이스처럼 사용 | ⭐⭐⭐ | 2016 Q18, 2021 Q3, 2024 Q9 |
| 부트로더 | 커널 이미지를 RAM에 복사하고 제어권 이양 | ⭐⭐ | 2018 Q7, 2019 Q13 |
| BIOS | 전원 인가 시 최초 실행, ROM BIOS | ⭐ | 2020 Q13 |
| MBR | 첫 섹터 512바이트, 파티션 정보+부트로더 | ⭐ | 2023 Q6 |
| 초기 RAM Disk / 전원 관리 / 칩 셀렉트 |
개념 보강 | 기출 없음 | 보강 |
키워드 박스 — 답안에 반드시 들어가야 할 단어
스타트업 코드 : 전원 인가 후 가장 먼저 / 초기화 / 부트로더를 SDRAM으로 복사 / 점프
readelf : ELF 파일의 내부 구조(헤더·섹션·심볼)를 읽어 표시
링커 : 오브젝트 파일 + 라이브러리 → 최종 실행 파일
동적 링킹 : 실행 시(런타임) 필요한 라이브러리만 로드 (.so)
MTD : 플래시를 논리 파티션으로 분할 관리하는 커널 계층
MBR : 첫 번째 섹터(512B), 파티션 정보 + 부트로더 정보
ELF와 binutil ⭐⭐⭐
소스코드를 컴파일·링킹하면 ELF (Executable and Linkable Format) 파일이 만들어져요.
ELF 구성
ELF Header : 파일 기본 정보 (아키텍처, 엔디안, 엔트리 포인트 주소)
Program Header Table : 세그먼트 정보 (런타임 실행에 필요)
Section Header Table : 섹션 정보 (링킹·재배치에 필요)
대표 섹션 : .text(코드) / .data(초기화된 데이터) / .bss(초기화 안 된 데이터)
기출 (2016 Q16 = 2020 Q4 = 2025 Q8 동일) ELF 파일의 내부 구조와 내용을 읽고 표시해주는 리눅스 명령어는?
→ readelf
| 명령어 | 용도 |
readelf -h <파일> |
ELF 헤더 (아키텍처, 엔디안, 엔트리 포인트) |
readelf -S <파일> |
섹션 헤더 (.text, .data, .bss …) |
readelf -s <파일> |
심볼 테이블 |
objdump -d <파일> |
역어셈블 (디스어셈블) |
file <파일> |
32/64비트, 빅/리틀 엔디안 간단 확인 |
⚠️ 함정: readelf는 구조를 읽어서 보여주는 명령이고, 기계어를 어셈블리로 바꿔 보여주는 건 objdump -d 예요.
컴파일과 링킹 ⭐⭐⭐
컴파일 전체 과정 (4단계)
소스(.c)
↓ 1. 전처리 — #include, #define 처리, 매크로 확장
↓ 2. 컴파일 — 고급언어 → 어셈블리 코드
↓ 3. 어셈블 — 어셈블리 → 오브젝트 파일(.o)
↓ 4. 링킹 — 오브젝트 + 라이브러리 → 최종 실행 파일
기출 (2023 Q16) 원시 프로그램 → 컴파일러 → 어셈블러 → ( A ) → 실행 프로그램. ( A )는?
→ Linker (링커)
기출 (2021 Q12 = 2024 Q19 동일) 컴파일된 오브젝트들과 라이브러리를 합쳐 최종 실행 파일로 만드는 과정은?
→ 링킹 (Linking) / 링커 (Linker)
정적 링킹 vs 동적 링킹
| 항목 | 정적 링킹 (Static) | 동적 링킹 (Dynamic) |
| 시점 | 컴파일(링크) 시 | 런타임(실행 시) |
| 라이브러리 | 실행 파일에 모두 포함 | 필요할 때만 메모리에 로드 |
| 파일 크기 | 큼 | 작음 (참조만) |
| 의존성 | 없음 (독립 실행) | 있음 (.so 필요) |
| 임베디드 사용 | 자주 사용 | 드물게 사용 |
기출 (2022 Q7 = 2025 Q1 동일) 라이브러리 링킹 방법 중 실행 프로그램에서 필요할 때만 라이브러리를 메모리에 올리는 방법은?
→ 동적 링킹 (Dynamic Linking)
동적 링킹 관련 함수: dlopen(로드) → dlsym(함수 주소 검색) → dlclose(언로드)
리눅스 동적 라이브러리: .so (예: libc.so.6)
임베디드에서 정적 링킹을 많이 쓰는 이유는 메모리 사용을 예측할 수 있고, 외부 라이브러리 의존성이 없기 때문이에요.
스타트업 코드 ⭐⭐⭐
기출 (2015 Q11 = 2020 Q1 = 2024 Q12 동일) 시스템 전원 인가 후 가장 먼저 실행되는 초기화 코드로, ① 모든 인터럽트 차단 ② 장치 초기화 ③ 부트로더를 SDRAM으로 복사 ④ 부트로더 실행 기능을 수행하는 어셈블리 코드는?
→ 스타트업 코드 (Startup Code)
스타트업 코드 동작 순서 (7단계)
① POST (Power-On Self-Test) 수행
② 인터럽트 벡터 테이블 셋업
③ 모든 인터럽트 실행 차단
④ 장치 초기화 (GPIO, SDRAM, Clock, Watchdog 등)
⑤ 메모리 영역 초기화 (Stack, BSS 영역 등)
⑥ 부트로더를 SDRAM으로 복사
⑦ 부트로더 실행으로 점프
별칭: bootcode, bootstrap, (BIOS)
⚠️ 함정
- 서술형으로 "동작 순서를 쓰시오"가 나오면 ①~⑦ 순서를 그대로 쓰기
- "인터럽트 차단"은 장치 초기화 "전에" 온다 (초기화 중 인터럽트로 꼬이지 않게)
- BSS 초기화(⑤)는 "메모리 영역 초기화"에 해당 → 스택·BSS를 0으로 준비
메모리 초기화와 링커 스크립트 — 코드·데이터·BSS를 메모리 어디에 둘지 정하는 것은 링커 스크립트가 담당하고, 스타트업 코드는 그 배치에 맞춰 스택과 BSS를 초기화합니다. (기출에서는 링커 스크립트가 링킹 문제에 간접적으로만 등장)
부트로더·BIOS·MBR·OS 부팅 ⭐⭐
부트로더
기출 (2018 Q7) 커널에서 압축된 커널 이미지를 램에 저장하는 기능을 수행하는 것은?
→ 부트로더 (Bootloader)
기출 (2019 Q13) 부팅 과정에서 CPU·메모리를 초기화하고, 저장 장치의 압축된 커널 이미지를 RAM으로 복사한 뒤 커널로 실행을 넘기는 프로그램은?
→ 부트로더 (동일 인정: 부트 로더, Boot Loader)
부트로더 종류: U-Boot, GRUB, BLOB, BOOTLDR
BIOS
기출 (2020 Q13) 전원을 켜면 맨 처음 컴퓨터의 제어를 맡아 가장 기본적인 기능을 처리하는 프로그램. 롬 바이오스라고도 하며, 스타트업 루틴·서비스 처리 루틴·하드웨어 인터럽트 처리 부분으로 구성된다.
→ BIOS (Basic Input/Output System)
MBR
기출 (2023 Q6) 플래시 혹은 하드디스크의 첫 번째 데이터 저장 공간으로, 파티션 정보 및 부트로더 정보가 담겨 있는 곳은?
→ MBR (Master Boot Record)
| 부분 | 크기 | 내용 |
| 부트로더 코드 | 446 바이트 | 부팅 초기 코드 |
| 파티션 테이블 | 64 바이트 | 최대 4개 기본 파티션 정보 |
| 부트 시그니처 | 2 바이트 | 0xAA55 |
| 합계 | 512 바이트 | 가장 첫 번째 섹터 |
OS 부팅 흐름 정리
전원 인가
→ 스타트업 코드(BIOS/ROM 코드)가 하드웨어 초기화
→ 부트로더 실행 (커널 이미지를 RAM에 복사)
→ 커널 시작 (start_kernel)
→ init 프로세스 실행 (사용자 공간 시작)
⚠️ 스타트업 코드 vs 부트로더 혼동 주의
스타트업 코드 → "부트로더를 SDRAM으로 복사하고 점프"
부트로더 → "커널 이미지를 RAM으로 복사하고 커널로 점프"
같은 "복사 후 점프"라도 복사 대상이 달라요!
플래시 메모리 관리 — MTD와 FTL ⭐⭐⭐
기출 (2021 Q3) 임베디드 리눅스에서 플래시 메모리를 논리적으로 여러 파티션으로 나누어 관리하는 커널 계층은?
→ MTD (Memory Technology Device)
기출 (2016 Q18 = 2024 Q9 동일) 플래시를 블록 디바이스처럼 사용하기 위한 것으로, 플래시 메모리 장치에서 여러 개의 파티션을 나눌 수 있게 하는 기술은?
→ MTD 또는 FTL (Flash Translation Layer)
MTD 구조
플래시 메모리 (물리) → MTD 계층 → mtd0(부트로더) / mtd1(커널) / mtd2(루트 FS) / mtd3(사용자 데이터)
FTL 기능: 논리 주소↔물리 주소 매핑, 마모 평준화(Wear Leveling), 가비지 컬렉션
⚠️ MTD vs FTL 구분 (정리본이 모호한 문항이에요)
문제에 "파티션을 나눈다 / 논리적으로 분할" 이 중심이면 → MTD
문제에 "블록 디바이스처럼 사용" 이 중심이면 → FTL
애매하면 "MTD (또는 FTL)"처럼 둘 다 적는 것이 안전
플래시 위에 올라가는 파일시스템(JFFS2, YAFFS 등)은 10편에서 다룹니다.
기출 없음 — 개념 보강 📌
초기 RAM Disk (initrd/initramfs)
: 커널 부팅 직후 임시로 쓰는 루트 파일시스템. 실제 루트 FS를 마운트하기 전에
필요한 드라이버·스크립트를 제공
전원 관리
: 클록·전압을 낮추거나 절전 모드로 소비 전력을 줄이는 기법 (DVFS 등)
동적 전력은 대략 전압² × 주파수에 비례 → 전압을 낮추는 효과가 크다
칩 셀렉트 로직
: 주소 디코딩으로 어떤 메모리·장치를 선택할지 결정
기출 문제 모음
Q. 시스템 전원 인가 후 가장 먼저 실행되는 초기화 코드는? (2015·2020·2024)
A. 스타트업 코드 (Startup Code)
Q. ELF 파일의 내부 구조와 내용을 읽고 표시해주는 리눅스 명령어는? (2016·2020·2025)
A. readelf
Q. 원시 프로그램 → 컴파일러 → 어셈블러 → ( A ) → 실행 프로그램 (2023 Q16)
A. 링커 (Linker)
Q. 필요할 때만 라이브러리를 메모리에 올리는 링킹 방법은? (2022·2025)
A. 동적 링킹
Q. 압축된 커널 이미지를 RAM에 복사하고 커널로 실행을 넘기는 것은? (2018·2019)
A. 부트로더
Q. 첫 번째 섹터에 파티션 정보와 부트로더 정보를 담는 곳은? (2023 Q6)
A. MBR
💡 실무에서는?
- 부팅 체인 — 서버의 UEFI/BIOS → GRUB → 커널 → init(systemd) 구조가 곧 "스타트업 코드 → 부트로더 → 커널 → init" 이에요. 부팅 장애가 났을 때 어느 단계에서 멈췄는지 가르는 기준이 됩니다.
- MBR vs GPT — 서버 디스크 설계에서 2TB 이상 디스크는 GPT를 쓰는 이유(MBR은 최대 4개 기본 파티션, 2TB 제한)가 이 개념에서 나와요.
- 정적/동적 링킹 — 컨테이너·임베디드 배포에서 "라이브러리 의존성 문제"를 피하려고 정적 빌드를 선택하기도 합니다.
ldd로 동적 의존성을 확인하는 게 실무 기본이에요. - readelf/objdump — 바이너리 분석, 보안 점검, 크래시 덤프 분석에서 자주 쓰는 도구입니다.
핵심 정리
✅ 스타트업 코드 7단계: POST → 벡터 셋업 → 인터럽트 차단 → 장치 초기화 → 메모리(Stack·BSS) 초기화 → 부트로더 복사 → 점프
✅ readelf = ELF 구조 확인 (-h 헤더, -S 섹션, -s 심볼) / objdump -d = 역어셈블
✅ 컴파일 4단계: 전처리 → 컴파일 → 어셈블 → 링킹
✅ 정적 링킹 = 컴파일 시 포함 / 동적 링킹 = 런타임에 필요한 것만 (.so, dlopen)
✅ 부트로더 = 커널 이미지를 RAM에 복사 후 커널로 점프 (U-Boot, GRUB)
✅ MBR = 첫 512B = 부트코드 446 + 파티션 테이블 64 + 시그니처 2
✅ MTD = 플래시 파티션 분할 / FTL = 블록 디바이스처럼 (매핑·마모 평준화)
다음 편에서는 임베디드 OS 이해·포팅(출제기준 2-2)으로 이어갑니다!
궁금한 점은 댓글로 남겨주세요!
'자격증 정복 > 임베디드기사(기능사)' 카테고리의 다른 글
| 임베디드기사 실기 04 — 주변장치 분석 (DMA·워치독·I2C·SPI·JTAG·레지스터 제어) (0) | 2026.10.26 |
|---|---|
| 임베디드기사 실기 03 — 시스템 성능·구조 분석 (ARM 어셈블리·엔디안·캐시·페이징·인터럽트) (0) | 2026.10.25 |
| 임베디드기사 실기 02 — 하드웨어 및 회로 분석 (논리회로·플립플롭·카르노맵·SRAM/DRAM) (0) | 2026.10.24 |
| 임베디드기사 실기 01 — 시리즈 소개와 실기 출제 맵 (출제기준·기출 분석·답안 작성 전략) (0) | 2026.10.23 |
| 임베디드기능사 필기 09 — 최종 예상 기출문제 풀이 (전 범위 핵심 총정리) (0) | 2026.09.17 |