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)에 대한 간략한 개념은 '여기'를 참조하면 될 듯 하다.