1.1 파일 포맷과 빌드 도구
1. ELF 포맷
1) ELF
- Executable and Linkable Format의 약어로 실행파일, Object 파일 Shared 라이브러리 파일과 Core Dump 파일 구조를 정의하고 있는 표준 형식
2) ELF 포맷 구조
- ELF Header, Program Header Table, Section Header Table로 구분 할 수 있다.

① ELF Header : 전체 파일 구조 정보를 포함하는 Road Map 같은 역할
② Program Header Table : 실행을 위해 메모리에 재배치되기 위한 정보. 세그먼트 단위로 정의됨
③ Section Header Table : 섹션에 대한 정보를 포함. 섹션 정보를 Linking시 활용
※ 세그먼트 : Section들의 집합. 데이터의 용도에 따른 논리적인 구분 단위
- .text, .rodata, .data 등을 Section 이라고 한다.
ㄴ .text : 코드 영역
ㄴ .data : 초기화된 전역변수
ㄴ .rodata : 읽기 전용 전역변수
ㄴ .bss : 초기화되지 않은 전역변수
2. Binutils
1) Binutils : 바이너리 관련 도구를 모아놓은 GNU 유틸리티 패키지
2) Binutils 대표 도구
- ld : GNU Linker
- as : GNU assembler
- nm : 오브젝트 파일의 심볼 출력
- objdump : 오브젝트 파일의 정보 출력
- readelf : elf 파일에 대한 내용 출력
- strip : 오브젝트 파일의 심볼 제거
1.2 스타트업 코드
1. 스타트업 코드
1) 스타트업 코드
- 하드웨어에 전원이 인가되고 처음 실행되는 코드
- 하드웨어 검사 및 초기화, 메모리 초기화 및 부트로더 로딩, 실행 점프 기능 수행하는 코드
- Boot code, bootstrap, BIOS라고 부르기도 한다.
2) 스타트업 코드의 동작 순서
① PowerOn Self Test 수행
② 인터럽트 벡터 테이블 셋업
③ 모든 인터럽트 실행 차단
④ 장치 초기화 (GPIO, SDRAM, Clock, Watch-dog 등)
⑤ 메모리 영역 초기화 (Stack, BSS 등)
⑥ 부트로더 SDRAM으로 복사
⑦ 부트로더 실행으로 점프
1.3 칩 셀렉트와 메모리 초기화
1. 메모리 시스템 설계
1) 메모리 시스템 설계
- 임베디드 시스템은 특수 목적으로 설계되는 관계로 다양한 구조로 설계 된다
- RAM, ROM 크기가 설계 단계에서는 유동적인 변수이다.
ㄴ ROM은 부팅시 RAM으로 로딩되는 프로그램 코드가 저장되는 공간으로 최근에는 Flash Memory가 사용되고 있다
ㄴ 대부분의 시스템은 ROM 영역의 0번 주소부터 코드를 읽어 동작하도록 구성되는데 리셋 벡터의 주소가 이에 해당한다.
2) 메모리 시스템 설계 과정
① RAM, ROM, I/O Device의 필요 조건 및 크기, 칩의 수 결정
② 메모리 맵 작성
③ 어드레스 디코딩 로직 작성
④ 칩 셀렉트 로직 설계
⑤ 메모리 테이블 작성 및 버스 접속 설계
2. 메모리 초기화 과정
① 메모리 제어기 초기화
② ROM의 Data(RO, RW)를 RAM에 복사
③ ZI 영역을 생성하고, 0으로 초기화
④ Stack 영역 생성
⑤ Heap영역 생성
⑥ main 함수 호출
1.4 OS 부팅
1. OS 부팅
1) OS 부팅 과정
① 시스템 전원이 인가되면 가장 먼저 Reset Vector 값이 PC에 옮겨지는 것으로 부팅 시작된다. 이 위치는 ROM이나 Flash Memory 칩 첫 번쨰 주소부터 저장된다. 해당 주소에는 Startup 코드가 저장되어 있다.
② Start-Up code는 POST (Power On Self Test) 과정을 수행하고, 초기화 작업을 수행한다.
③ Start-Up code는 부트 디스크의 MBR을 찾아서 RAM으로 부트로더를 로딩한다. 부트 디스크는 첫 번째 섹터의 마지막 2Byte 값이 0xAA, 0x55 값으로 저장되어 있어야 한다. (X86 시스템은 0x55, 0xAA이다)
④ 부트로더를 실행한다.
⑤ 커널을 로딩하고 커널 압축을 해제한다.
⑥ 커널을 실행하고 OS 파일 시스템을 구성한다.
⑦ OS 프로세스 구동한다.

2. 리눅스 커널 초기화 과정
① SVC 모드 전환 및 인터럽트 중지
- 커널 시작되면 프로세스 초기 동작 모드는 SVC 모드이다.
- 인터럽트가 동작하지 않도록 레지스터를 설정한다.
② 메모리 관련 초기화
- 페이지 테이블 설정, MMU, Cache에 대한 설정 과정이 진행됨
- 스택과 BSS 영역 초기화 실행
③ 커널 서비스 초기화
- init/main.c 존재하는 start_kernel 함수가 호출되면서 커널 서비스 초기화
- 배너 출력, 트랩 초기화, 인터럽트 초기화 등 수행
- 모든 단계 완료되면 인터럽트 Enable
④ 시그널 및 IPC 초기화
- 시그널 동작을 위한 슬랩 캐시 생성
- IPC (세마포어, 메시지 큐, 공유 메모리) 초기화 수행
⑤ 입출력 장치 초기화
- 입출력 버스, 소켓, 장치 드라이버 초기화
⑥ RAMDISK 로딩 및 파일 시스템 마운팅
- RAMDISK 로딩, 루트 파일 시스템 마운트, 디바이스 파일 시스템 마운트
⑦ Init 프로세스 실행
- 데몬 및 각종 서비스 제공을 위한 init 프로세스 구동
1.5 초기 RAM Disk
1. 초기 RAM Disk
1) 초기 RAM Disk
- OS 부팅에 필요한 최소 구성요소를 속도가 빠른 RAM에 적재하여 사용하기 위해서 만들어진 방식
- BIOS는 IDE 장치만 인식이 가능하여 SCSI 장치는 인식이 되지 않아 부트 디스크로 사용할 수 없음의 이유로 사용됨
2) 초기 RAM Disk (Initrd) 수행 과정
① 부트로더가 커널과 초기 RAM Disk 이미지를 로드
② 커널이 메모리에 RAM Disk를 만들고 initrd 이미지의 압축을 풀어놓음
③ RAM Disk를 루트 파일 시스템으로 마운트
④ 추가 드라이버 로드 또는 구동 스크립트 등 실행
⑤ 실제 디스크를 루트 파일 시스템으로 마운트 및 Initrd 파일 시스템 제거
3) 초기 RAM Disk (Initrd) 파일 제작 과정
① dd if=/dev/zero of=ramdisk_image.img count=4096 bs 1024
ㄴ ramdisk_image.img 파일을 /dev/zero로 가득 채워 4Mbyte(4096 * 1024) 크기로 생성
② mkfs -t ext2 ramdisk_image.img
ㄴ 생성된 ramdisk_image.img 파일을 Ext2 파일 시스템으로 포맷
③ mount -t ext2 -o loop /RAM_DISK ramdisk_image.img
ㄴ ramdisk_image.img 파일을 /RAM_DISK 디렉토리에 마운트
※ loop device : 가상의 블록 디바이스
④ 필요한 파일 복사
⑤ umount /RAM_DISK
⑥ bootloader에 해당 파일 전송
1.6 플래시 메모리
1. MTD (Memory Technology Device)
- Flash Memory와 같은 메모리 장치를 동일한 방식으로 사용하기 위해서 추상적인 계층을 제공
- 하드웨어 장치와 VFS (Virtual File System) 사이에 표준 인터페이스를 제공

1.7 전원 관리
1. 전력 사용 모드의 종류
- 최대 절전 모드 : RAM 데이터를 비활성 저장소에 복사하고 모든 전력 사용 중단
- 일시 중단 모드 : RAM을 제외한 모든 하드웨어 전원 차단. 메모리의 refresh 전력만을 공급
2. 운영체제의 전원 관리
1) 운영체제의 전원 관리
- 시스템이 유휴 상태일 때 운영체제는 전원관리 프레임워크를 통해 시스템을 저전력 작동 모드로 전환하여 전력 소모를 줄임
- 주변 기기의 전력 상태, 시스템 전원 상태 등을 운영체제가 제어하여 전력을 끄거나 stanby 또는 sleep 상태로 전환
2) 전원 관리 응용 프로그램
① APM
- Advanced Power Management의 약어로 인텔과 마이크로 소프트가 컴퓨터의 전력 소모를 줄이기 위해 만든 BIOS와 응용 프로그램 간 인터페이스를 제공하는 장치이다.
- BIOS를 기반으로 동작하도록 설계되어, BIOS 의존적인 동작을 한다.
- 하드웨어적인 I/O만을 부하로 판단하기 때문에 계산 위주의 프로그램 혹은 동영상 재생과 같은 작업이 지속되는 경우 절전모드가 동작하는 문제가 있다.
② ACPI
- Advanced Configuration and Power Interface의 약어로 HP, Intel, Microsoft, 피닉스, 도시바가 개발하고 1996년 12월에 처음 공개된 open 표준으로 하드웨어 감지, 메인보드 및 장치 구성, 전원 관리를 담당하는 일반적인 인터페이스를 정의 하는 규격
- 운영체제를 통한 전원 관리 인터페이스를 제공함
- 별도의 전원 관리 디바이스 드라이버를 지원하지 않는 응용 프로그램도 전원 관리가 가능하게 되었다.
3. 디바이스 드라이버의 전원 관리
1) 디바이스 드라이버의 전원 관리
- 장치를 ON/OFF 하거나 Standby/Sleep 상태로 전환
- 디바이스 상태를 모니터링하여 클럭 주파수를 조정
2) 전원 관리 기술
- DVFS
ㄴ Dynamic Voltage and Frequency Scailing의 약어로 하드웨어 동작 클럭 주파수와 전압을 부하 정도에 따라 조절하여 절전 기능을 제공하는 기술
ㄴ 하드웨어에 부하가 없으면 Idle 모드나 Sleep 모드로 진입하여 전력 소비량을 최소화 할 수 있다.
# References
- https://ko.wikipedia.org/wiki/ELF_%ED%8C%8C%EC%9D%BC_%ED%98%95%EC%8B%9D
- https://www.golinuxcloud.com/linux-boot-process-explained-step-detail/
- https://www.linuxjournal.com/magazine/flash-filesystems-embedded-linux-systems
'임베디드 기사 > 실기 - 임베디드 펌웨어' 카테고리의 다른 글
| 임베디드 펌웨어 실기 용어 정리 (0) | 2023.10.07 |
|---|---|
| 3. 디바이스 드라이버 작성하기 (0) | 2023.09.25 |
| 2. 임베디드 이해 및 포팅하기 (0) | 2023.09.24 |