자격증 정복/임베디드기사(기능사)

임베디드기사 필기 06 — 펌웨어 [2-1] (스타트업코드·부트로더·OS부트과정·전원관리)

올드 IT직장인 2026. 8. 10. 19:00

임베디드기사 필기 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로 이어갑니다!

 

궁금한 점은 댓글로 남겨주세요!

반응형
개인정보처리방침  |  블로그 소개