부트로더(Bootloader)

· 1648 words · 4 minute read

이 포스팅의 내용은 임베디드 리눅스에서의 부트로더 역할에 대해 중점적으로 다룬다. 부트로더는 시스템을 초기화하고 임베디드 운영체제를 탑재하거나 실행하기 위해서 시스템 초기화 코드, 하드웨어 제어 프로그램, 네트워크, USB 등의 프로토콜과 일부 파일 시스템을 관리한다.

브투로더는 개인용 컴퓨터의 BIOS(Basic Input Output System)와 유사하다고 생각하면 된다. BIOS는 처음 전원을 공급하면 메인보드의 CMOS에 저장된 설정값을 읽어서 하드웨어를 초기화하고 그래픽 카드 정보 및 바이오스 정보를 출력한 다음 POST(Power-On Self Test) 과정을 수행하고 하드디스크나 CD-ROM 또는 플로피디스크에서 운영체제를 찾아 부팅한다.

부트로더의 역할 🔗

타깃 초기화 🔗

부트로더는 전원이 입력되면 타깃이 정상 동작하도록 하드웨어 및 소프트웨어 환경을 설정한다. 이 과정은 시스템 리셋 핸들러의 동작과 같다. 불필요한 하드웨어의 동작 중지, 시스템 클록 설정, 메모리 제어기 설정, 필요에 따라 MMU(Memory Management Unit)나 MPU(Micro-Processing Unit)를 설정한다.

시스템 동작에 필요한 하드웨어 설정이 완료된 후에는 실제 프로그램 동작에 필요한 재배치와 스택 영역 설정 및 C에서 사용하는 변수 영역을 설정한 다음 C로 작성된 함수를 호출한다. 필요에 따라 IRQ와 같은 예외 처리 벡터 및 핸들러도 제공해야 한다.

타깃 동작 환경 설정 🔗

타깃의 동작 환경 설정은 BIOS의 CMOS 설정과 유사하며, 부트 방법, 부트 디바이스, 네트워크를 이용한 부트를 지원하기 위한 네트워크 설정, IP 주소 설정 등 부트로더 동작에 필요한 정보를 설정한다.

일반적으로 설정된 환경 변수값은 플래시 메모리 또는 EEPROM에 저장 관리된다.

EEPROM vs. 플래시 메모리

이 둘의 공통점은 임베디드 분야에서 저장장치로 사용되는 메모리라는 점이다. 흔히, PC에 비유해보자면 EEPROM을 BIOS로, 플래시 메모리는 하드디스크로 비유할 수 있겠다.

EEPROM(Electrically Erasable PROM)은 On-Board 상태에서 사용자가 내용을 바이트 단위로 읽거나 쓸 수 있으므로 사실상 SRAM 처럼 사용할 수 있는 비휘발성 메모리이다. 하지만 읽기 동작은 다소 느릴지라도 SRAM과 유사하여 별 문제가 없지만 쓰기 동작을 수행하는 경우에 1 바이트를 write 할 때마다 수 ms 이상의 지연 시간이 필요하여 SRAM과 동일하게 사용될 수 없다. 따라서 EEPROM은 실시간으로 사용되는 변수를 저장하는 메모리로써는 사용 불가능하고 지워져서는 안되는 중요한 데이터를 백업해 둬야 하는 설정값 저장용 메모리로 주로 사용된다. 이 메모리 소자는 28Cxxx의 형태로 이름을 짓는 경우가 많다.

플래시 메모리는 흔히 디지털 카메라, 스마트폰을 예로 들 수 있다. 일반적인 데이터를 저장하고 컴퓨터 사이에 데이터를 옮기는 용도로서 USB 드라이브를 사용하는데 이 때도 플래시 메모리가 사용된다. 임베디드용 하드디스크라고 생각하면 쉬우며, NOR 플래시 메모리와 달리 NAND 플래시 메모리의 경우는 주소가 없기 때문에 저장된 코드를 곧바로 실행할 수 없다는 단점을 가지고 있다.

시스템 운영체제 부팅 🔗

일반적으로 임베디드 시스템의 운영체제는 플래시 메모리에 탑재되어 있으므로 부팅 과정에서 주메모리(일반적으로 DRAM 사용)에 탑재한 후 실행한다. 따라서 부트로더는 플래시 메모리에 있는 운영체제를 DRAM에 복사하고 제어권을 운영체제의 시작점으로 넘겨주는 기능을 제공한다.

플래시 메모리 관리 🔗

임베디드 시스템에서 플래시 메모리는 다양한 용도로 사용되기 때문에 가장 효율적인 보조 기억장치라고 할 수 있다. 보통 플래시 메모리에 부트로더가 탑재된다.

모니터 기능 🔗

모니터 기능이란 시스템의 동작 상태를 감시하고 하드웨어 정상 동작 여부 검사, 메모리 검사를 비롯한 POST(Power-On Self Test) 등의 기능을 말한다. 부트로더는 필요에 따라 이와 같은 모니터 기능을 가진다.

부트로더 특징 🔗

부트로더는 하드웨어 의존성이 강하다. 일반적으로 클록, 메모리 제어기 설정 등의 하드웨어 설정을 먼저 수행한다. 따라서 부트로더를 작성하려면 프로세서 구조와 특징 및 사용법을 알아야 한다. 특히 부트로더의 시작 부분은 어셈블리어로 작성되기 때문에 명령어 사용법을 알고 있어야 한다.

또한, 부트로더 콘솔을 구현하기 위해서는 UART 제어기의 구조와 제어 방법을 알고 있어야 하며 네트워크, USB를 이용하려면 이더넷 제어기 및 USB 디바이스 제어기에 대해서도 알아야 한다.

하지만 직접 구현은 힘들기 때문에 LILO, GRUB, Loadlin, EtherBoot, Blob, PMON, RedBoot, U-Boot과 같은 부트로더를 이용한다.

출처 🔗