'부트로더'에 해당되는 글 2건

  1. 2007.12.05 Windows CE Boot Loader의 흐름
  2. 2007.11.28 부트로더(Bootloader)
2007. 12. 5. 14:11

Windows CE Boot Loader의 흐름



Windows CE에서의 'Boot Loader'라는 녀석의 흐름은 대충 이렇다.
$(_PUBLICROOT)\COMMON\OAK\DRIVER\ETHDBG\BLCOMMON
이라는 폴더를 살펴보게 되면, EBOOT(Ethernet Booterloader)의 작성을 도와주기 위한 라이브러리 소스가 있다.

MS에서 제공하는 것으로 개발자가 부트로더를 개발할 때 이 라이브러리들을 참고해 손쉽게 부트로더를 개발할 수 있도록 하는 것이라고 한다.

BLCOMMON(blcommon.c)라는 녀석의 함수중 크게 중요(?)한 것은 BootloaderMain()과 DownloadImage()이다.  대부분의 부트로더 관련 함수들은 이 두 함수에서 호출하여 사용하고 있다.
사용자 삽입 이미지
BLCOMMON에서의 흐름
StartUp()
대부분 어셈블러로 작성된 코드이다. CPU에 전원이 공급괴고, Reset되어 실행되는 최초의 코드이기 때문에 'StartUp'이라고 한다. 이 녀석은 CPU를 초기화 한다. MMU, 캐시 등을 초기화해 가상 메모리 사용을 가능하도록 한다.
일반적으로 StartUp()은 C 로 작성된 main()으로 점프한다.

BootLoadMain()
Boot Loader의 Main이다.
StartUp()에서 main()으로 점프한 뒤 바로 BootLoaderMain()으로 점프한다. 이 녀석은 OEMDebugInit(), OEMPlatformInit(), OEMPreDownLoader(), DownloadImage(), OEMLaunch()를 호출하여 BootLoader의 동작을 수행하게 된다.
이 후의 과정은 BootloaderMain()이 통제하게 된다.
각각의 OEM Function을 호출하기 전에 BootLoaderMain()은 KernelRelocate()를 먼저 실행하게 된다. 이는 BootLoader의 Global Variable을 DRAM에 롬기는 과정을 수행한다.
KernelRelocate()에서 사용하는 pTOC에서는 BootLoader와 Windows CE Kernel에 필요한 정보를 point하는데 Platfrom Builder에 포함된 tool인 'RomInage.exe'에 해당 값들이 고정되어 있어 Boot Loader 생성시 해당 값들이 넣어진다.
KernelRelocate()가 수행되기 전에는 Global Variable을 사용할 수 없다.

OEMDebugInit()
Boot Loader에서 사용하는 Message들을 Debug output port에 출력하기 위한 시리얼포트 초기화 함수이다.
일반적으로 Boot Loader는 Serial Port를 사용하여 Boot Loader의 Message나 status, menu등을 출력한다.
개발자가 준비해야 할 함수이다.

OEMPlatformInit()
OS를 Download받기 위해 필요한 device(Ethernet, Flash, Clock)를 초기화 하는 함수이다. 부트로더로서 역할을 수행하기 위해서 필요한 타겟 플랫폼을 초기화하라는 의미이며, 이더텟 포트를 초기화 하는 부을 포함하고 있다.
이 과정에서 사용자로부터 Boot option(설정)을 입력받기 위한 menu를 출력하고, 사용자로부터 입력받은 Boot option에 따라 Boot Loader를 동작시킨다.

OEMPreDownLoad()
OEMDebugInit()와 OEMPlatformInit()를 통해 디버그 포트와 다운로드 포트의 초기화가 이루어지면, 다운로드 포트를 통해 원격지에 있는 호스트들로부터 타겟 플랫폼과 연결될 호스트를 찾기 위해 BOOTME 패킷을 Broadcast형식으로 내보내는 작업(Target Device Name, IP Address, Mac Address를 이용)을 한다.
리턴값으로 이미 플래시 메모리에 다운로드돼있는 이미지를 사용해 바로 부팅할 것인지, 호스트로 부터 새로운 이미지를 다운로드를 할지를 결정한다.

DownLoadImage()
OEM이 제공하는 OEMReadData() 함수를 사용해 다운로드 포트로부터 운영체제 이미지를 원하는 양만큼 레코드 단위로 반복적인 읽기를 시도한다.
이 함수는 부트로더의 정책에 의해 플래시 메모리에 기록하는 작업을 시도하는데, 이때 플래시 기록작업을 도와주는 OEM의 플래시 관련 함수들을 호출하게 된다.

OEMLaunch()
다운로드가 완료된 OS Image를 launch하는 함수이다.

'jay_korea님의 블로그'와 노란책을 참조해서 작성한 문서이고, 부트로더(Boot Loader)에 대한 간략한 개념은 '여기'를 참조하면 될 듯 하다.

2007. 11. 28. 19:08

부트로더(Bootloader)



부트로더는 데스크톱의 BIOS와 비슷한 역할을 한다. 처음 전원을 이가하거나 하드웨어적으로 리셋을 시키면 부트로더는 시스템을 시작하기 위해 필요한 최소한의 하드웨어를 초기화 한다. 그리고난 후 메모리에 담겨져 있는 커널 이미지와 루트파일 시스템을 찾아서 RAM으로 복사를 하고 커널이미지를 위치로 옮겨 부팅을 하게 한다.

Windows CE에서의 부트로더도 다르지 않다.
부트로더(Bootloader)는 호스트에서 타겟(혹은 타겟 내의 저장공간)에서 메모리로 OS Image를 읽어들이는 역할을 한다.
간단히 말하자면, 호스트(개발 PC)에서 타겟장치(개발하는 보드)로 부팅시키고자 하는 이미지를 올리는 작업을 하는 녀석이다. 추가로 부트로더는 타겟 플랫폼의 디바이스를 초기화한다.

일반적으로 부트로더의 역할은 다음 세가지로 요약할 수 있다.
1. 타겟 플랫폼 디바이스를 초기화한다.

CPU를 사용가능한 환경으로 초기화 한다. CPU내의 MMU(Memory Management Unit)와 캐시 등을 활성화 하고, 리얼타임 클럭, 다운로드 경로로 사용될 하드웨어를 초기화 한다.

2. 부팅 과정을 통제(부팅과정 중 옵션을 사용)한다.

다운로드 경로(USB, 패러럴, 이더넷 등)을 선택
호스트에서 RAM으로 직접 다운로드
다운로드 하기 전에 사용될 메모리 진단
다운로드될 장소를 결정

3. Windows CE 이미지를 다운로드 하고 실행시킨다.

패러럴 포트, USB, 이더넷과 같은 비교적 전송속도가 빠른 경로를 사용해서 호스트에서 타겟 플랫폼으로 OS Image를 다운로드 시킨다.