임베디드기사 필기 06 — 펌웨어 [2-1] (스타트업코드·부트로더·OS부트과정·전원관리)
2과목 [2-1] 펌웨어 파트입니다.
스타트업코드 순서와 OS 부트 5단계는 실기까지 최빈출이에요.
기출 검증 완료된 내용으로 정확하게 정리했습니다.
JTAG 하드웨어 ⭐⭐
JTAG(IEEE 1149.1)은 PCB 테스트·디버깅·펌웨어 다운로드를 위한 직렬(Serial) 인터페이스예요.
⚠️ JTAG는 직렬 방식 — "병렬 방식이다"는 오답!
JTAG 5신호
| 신호 | 이름 | 역할 |
| TCK | Test Clock | JTAG 전용 클록 (시스템 클록과 별개) |
| TMS | Test Mode Select | 동작 상태 설정 |
| TDI | Test Data In | 데이터 입력 |
| TDO | Test Data Out | 데이터 출력 |
| TRST | Test Reset | JTAG 초기화 |
JTAG 내부 레지스터
명령어 레지스터 (Instruction Register)
식별 레지스터 (Identification Register)
우회 레지스터 (Bypass Register)
바운더리 스캔 레지스터 (Boundary-Scan Register)
⚠️ 함정:
"Boundary Register" → 존재하지 않음! (오답)
정확한 명칭: Boundary-Scan Register
"TCK는 시스템 클록과 동일하다" → 오답! (별도 클록)
"TDI는 출력신호다" → 오답! (입력신호)
"JTAG는 메모리의 데이터를 실행시킨다" → 오답! (실행기 아님)
기출 문제
Q. JTAG 5개 신호를 모두 나열하시오.
A. TCK / TMS / TDI / TDO / TRST
Q. JTAG 레지스터에 속하지 않는 것은? (보기: Boundary Register / Bypass Register / Instruction Register / Identification Register)
A. Boundary Register — 존재하지 않음 (Boundary-Scan Register가 정확한 명칭)
스타트업 코드 ⭐⭐ (실기 최빈출!)
main() 호출 전 C 실행 환경을 준비하는 어셈블리 코드예요.
스타트업 코드 동작 순서
1. 스택 포인터(SP) 초기화
2. 스택 영역 할당·초기화
3. 힙(Heap) 영역 생성·초기화
4. BSS 영역(미초기화 전역변수) 0으로 클리어
+ 초기값 있는 데이터를 ROM→RAM 복사
5. main() 함수 호출
인터럽트 처리 순서 ⭐⭐:
초기화 진행 중 → 인터럽트 금지(비활성화)
초기화 완료 후 → 인터럽트 허용
⚠️ "인터럽트를 먼저 허용한 뒤 초기화, main() 전 금지"
→ 오답! (순서가 정반대)
메모리 영역
ROM(플래시) — 프로그램 코드, 읽기 전용 데이터
RAM — 실행 중 변경되는 변수
BSS — 초기화되지 않은 전역/정적 변수 → 0으로 초기화
기출 문제
Q. 임베디드 스타트업 코드의 동작으로 틀린 것은?
"모든 인터럽트를 허용한 후 초기화를 진행하고, main() 호출 직전에 인터럽트를 금지한다"
A. 틀림 — 초기화 중에는 인터럽트를 금지한 채 진행하고, 초기화 완료 후 인터럽트를 허용한다.
부트로더 ⭐⭐⭐
부트로더의 역할
하드웨어 초기화 (클럭, 메모리 컨트롤러)
커널 적재 및 부팅
예약 명령 처리 (복구 모드 진입 등)
⚠️ "커널 설정 변경"은 부트로더 역할이 아님! (커널 빌드 단계에서 결정)
부트로더 종류 ⭐⭐
| 종류 | 특징 |
| LILO | 리눅스 구형 표준, 대화형 없음, 네트워크 부팅 미지원 |
| GRUB | GNU 표준, 스테이지 단위 구성, 리눅스 현재 표준, 대화형·네트워크 부팅 지원 |
| U-Boot | ARM/PowerPC/MIPS 지원, ARM 임베디드 표준 |
| BLOB | CLI 제공, 커널·램디스크 다운로드는 직렬(시리얼) 통신 |
| BOOTLDR | 임베디드 부트로더 종류 중 하나 |
⚠️ "COMMAND"는 부트로더가 아님! (MS-DOS 셸 혼동 함정)
⚠️ BLOB: "병렬 통신으로 다운로드" → 오답! (직렬/시리얼 통신)
기출 문제
Q. ARM 프로세서에 주로 사용되는 임베디드 전용 부트로더는?
A. U-Boot
Q. 부트로더 종류가 아닌 것은? (LILO / GRUB / BLOB / COMMAND)
A. COMMAND (MS-DOS 셸이지 부트로더가 아님)
OS 부트 과정 ⭐⭐⭐
리눅스 부팅 5단계
전원 공급 → BIOS → 부트로더 → 커널 → init 프로세스
⭐ init은 항상 마지막!
ARM 기반 임베디드 부팅 순서 (그림 문제 반복 출제!)
1. CPU 리셋 → DMA가 4KB 초기화 코드를 내부 SRAM으로 복사
2. 초기화 코드가 부트로더를 SDRAM으로 복사
3. 부트로더가 커널 이미지(zImage) 압축 해제 → SDRAM 로드
4. 램디스크(ramdisk)를 SDRAM으로 복사
상세 OS 부트 과정
전원 공급(Power On)
→ BIOS 실행 및 POST(자체 진단)
→ 부트 섹터 로딩
→ 부트 코드 실행 & 커널 로더 로딩
→ 커널 로더 실행 & 커널 로딩
→ 커널 실행 (init 호출)
기출 문제
Q. 리눅스 부팅 과정 5단계를 순서대로 나열하시오.
A. 전원 공급 → BIOS → 부트로더 → 커널 → init 프로세스
플래시 메모리 관리 — 퓨징(Fusing)
퓨징 대상: 부트로더 / 커널 이미지 / 루트 파일시스템
⚠️ "응용 프로그램"은 퓨징 대상이 아님!
(부팅 후 루트 파일시스템 위에서 별도 설치)
부트로더 탑재 방법:
ICE 장비로 플래시에 직접 기록
ROM Writer로 별도 프로그래밍 후 삽입
기존 부트로더로 새 부트로더 업데이트(Self-update)
⚠️ "PTOC 동글" → 실존하지 않는 방법 (오답)
램디스크 (RAM Disk) ⭐
RAM의 일부를 디스크처럼 사용
블록 장치(Block Device)로 분류
특징:
빠른 읽기/쓰기
휘발성 — 재부팅 시 데이터 소실!
⚠️ 함정:
"압축하면 메모리 가용량이 늘어난다" → 오답! (물리 메모리 증가 아님)
"재부팅 시 기존 데이터 보관" → 오답! (휘발성으로 소실)
"마운트 없이 프로그램 탑재" → 오답! (반드시 마운트 필요)
블록 장치 vs 문자 장치:
블록 장치: 플로피/하드디스크/CD-ROM/RAM Disk
문자 장치: Terminal Device (블록 장치 아님!)
TFTP / NFS ⭐
TFTP — UDP 기반 파일 전송 (TCP 아님!)
호스트→타깃 이미지 전송용
보안 취약, 단순함
NFS — 네트워크 파일 시스템
다른 컴퓨터 파일 시스템을 자신의 것처럼 사용
TCP/UDP 모두 가능 (시리얼 포트 아님!)
NFS 데몬: nfsd / mountd / nfsiod
⚠️ "portmap"은 NFS 데몬이 아님! (RPC 서비스)
⚠️ "장치 파일을 NFS 디렉토리에서 생성 가능" → 오답!
교차개발환경 (Cross Development Environment)
호스트 — 코드 작성·컴파일 (개발 도구 있는 PC)
타깃 — 실제 실행 (임베디드 보드)
통신 — 시리얼/이더넷/JTAG 케이블
⚠️ "IDE 케이블" → 저장장치용, 교차개발 통신 아님!
툴체인 구성: binutils + gcc + glibc
⚠️ "Qt" → 툴체인 아님! (GUI 프레임워크)
전원관리
PMIC — 충전·전압·시퀀싱 통합 관리
LDO — 전력 손실 최소화 레귤레이터
DC-DC 컨버터 제어:
경부하 → PFM 방식 효율적
⚠️ "경부하일 때 PWM이 유리" → 오답!
부트로더 전원관리:
PLL 초기화 (클럭 설정)
PMIC 초기화 (전압 공급)
Wake-on 조건 판별
💡 실무에서는?
보안 SI에서 ICS/SCADA 시스템 보안 점검 시 JTAG 포트가 비활성화 안 된 장비는 펌웨어 추출·변조 위험이 있어요. 스타트업 코드의 인터럽트 처리 순서를 이해하면 임베디드 장비 부팅 시 인터럽트 관련 취약점을 파악하는 데 도움이 돼요. 20년 인프라 경력에서 네트워크 장비 펌웨어 업그레이드(TFTP 활용)를 자주 했는데, TFTP가 UDP 기반이라 패킷 손실에 주의해야 한다는 게 실무에서 중요한 포인트예요.
핵심 정리
✅ JTAG 5신호: TCK/TMS/TDI/TDO/TRST
✅ TCK=시스템클록과 별개 / TDI=입력 / "Boundary Register"없음
✅ JTAG=직렬방식 (병렬 아님!)
✅ 스타트업코드: 초기화중 인터럽트 금지 → 완료후 허용
✅ 부트로더: 커널설정변경은 역할 아님
✅ GRUB=리눅스표준 / U-Boot=ARM임베디드표준
✅ BLOB=시리얼통신 (병렬 아님!)
✅ 부팅5단계: 전원→BIOS→부트로더→커널→init
✅ 퓨징대상: 부트로더/커널/루트FS (응용프로그램 제외)
✅ 램디스크: 휘발성, 반드시 마운트 필요
✅ TFTP=UDP (TCP 아님!)
✅ 경부하=PFM (PWM 아님!)
다음 편에서는 OS 포팅 — 커널소스트리·리눅스부팅·runlevel로 이어갑니다!
궁금한 점은 댓글로 남겨주세요!
'자격증 정복 > 임베디드기사(기능사)' 카테고리의 다른 글
| 임베디드기사 필기 05 — 하드웨어 ③ 주변장치 (UART·JTAG·I2C·RS-232·ADC/DAC) (0) | 2026.08.09 |
|---|---|
| 임베디드기사 필기 04 — 하드웨어 ② 컴퓨터구조 및 마이크로프로세서 (0) | 2026.08.08 |
| 임베디드기사 필기 03 — 임베디드 하드웨어 ① 논리회로 (0) | 2026.08.07 |
| 임베디드기사 필기 02 — 4과목 핵심 키워드 총정리 (0) | 2026.08.06 |
| 임베디드기사 완벽 소개 — 2013년 개설, 아직도 생소한 그 자격증 (3) | 2026.08.04 |