WEC7: 2種類のBootloaderライブラリ
非常に専門的な話ですが、最近はまったことがありましたのでここで紹介します。
Windows CEではOSを起動する際にブートローダーと呼ぶプログラムを使用します。このプログラムはOSイメージを(通常は)RAM上に展開してスタートアドレスにジャンプすることによってOSを起動するものですが、OSが動き始める前に使用するものなので、基本的なサービスまですべてプログラムで実装する必要があります。ところが、これではあまりにも大変なので、Platform BuilderにはCOMMONライブラリという形でよく使う機能をあらかじめライブラリとしてマイクロソフトが用意し、ブートローダーの開発が負担にならないように考慮されています。
ところで、WEC7のBSP開発マニュアルによると、「まずWindows Embedded CE 6.0用のBSPを開発しこれをWEC7に移植しろ」みたいな書き方になっているのですが、当然WEC7から新しく用意されたBSP機能もあるようです。その一つがこれから紹介するbldrコモンライブラリです。Windows Embedded CE 6.0までは
\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT
が唯一のBOOTLOADER用コモンライブラリだったのですが、WEC7では
\WINCE700\PLATFORM\COMMON\SRC\COMMON\BOOT
\WINCE700\PLATFORM\COMMON\SRC\COMMON\BLDR
の2系統になっており、一部重複する機能が実装されています。
実際にこれらのフォルダでSOURCESファイル中のTARGETNAMEを検索してみると...
=================================================
Find all "TARGETNAME", Match case, Subfolders, Find Results 1, "D:\WINCE700\platform\common\src\common\bldr", "sources; dirs; makefile; *.inc; *.cmn"
D:\WINCE700\platform\common\src\common\bldr\block\bios\sources(13):TARGETNAME=boot_driver_block_bios
D:\WINCE700\platform\common\src\common\bldr\block\fal\sources(13):TARGETNAME=boot_driver_block_fal
D:\WINCE700\platform\common\src\common\bldr\block\flash\sources(13):TARGETNAME=boot_driver_block_flashmdd
D:\WINCE700\platform\common\src\common\bldr\block\ide\sources(13):TARGETNAME=boot_driver_block_ide
D:\WINCE700\platform\common\src\common\bldr\block\utils\sources(13):TARGETNAME=boot_driver_block_utils
D:\WINCE700\platform\common\src\common\bldr\core\arm_with_mmu\sources(13):TARGETNAME=boot_core_arm_mmu
D:\WINCE700\platform\common\src\common\bldr\core\arm_without_mmu\sources(13):TARGETNAME=boot_core_arm
D:\WINCE700\platform\common\src\common\bldr\core\common\sources(13):TARGETNAME=boot_core
D:\WINCE700\platform\common\src\common\bldr\core\x86_bios\sources(14):TARGETNAME=boot_core_x86_bios
D:\WINCE700\platform\common\src\common\bldr\display\bios\sources(13):TARGETNAME=boot_driver_display_bios
D:\WINCE700\platform\common\src\common\bldr\download\binFile\standard\sources(13):TARGETNAME=boot_driver_download_bin
D:\WINCE700\platform\common\src\common\bldr\fileSystem\binFs\sources(13):TARGETNAME=boot_driver_filesystem_binfs
D:\WINCE700\platform\common\src\common\bldr\fileSystem\fat\sources(13):TARGETNAME=boot_driver_filesystem_fat
D:\WINCE700\platform\common\src\common\bldr\fileSystem\utils\sources(14):TARGETNAME=boot_driver_filesystem_utils
D:\WINCE700\platform\common\src\common\bldr\log\sources(13):TARGETNAME=boot_log
D:\WINCE700\platform\common\src\common\bldr\terminal\bios\sources(13):TARGETNAME=boot_driver_terminal_bios
D:\WINCE700\platform\common\src\common\bldr\terminal\debug\sources(13):TARGETNAME=boot_driver_terminal_debug
D:\WINCE700\platform\common\src\common\bldr\terminal\utils\sources(13):TARGETNAME=boot_driver_terminal_utils
D:\WINCE700\platform\common\src\common\bldr\transport\edbg\sources(13):TARGETNAME=boot_driver_transport_edbg
D:\WINCE700\platform\common\src\common\bldr\transport\fileSys\sources(13):TARGETNAME=boot_driver_transport_filesys
D:\WINCE700\platform\common\src\common\bldr\transport\serial\sources(13):TARGETNAME=boot_driver_transport_serial
Matching lines: 21 Matching files: 21 Total files searched: 51
Find all "TARGETNAME", Match case, Subfolders, Find Results 1, "D:\WINCE700\platform\common\src\common\BOOT", "sources; dirs; makefile; *.inc; *.cmn"
D:\WINCE700\platform\common\src\common\boot\blcommon\blcommon\sources(14):TARGETNAME=oal_blcommon
D:\WINCE700\platform\common\src\common\boot\blmenu\base\sources(14):TARGETNAME=oal_blmenu
D:\WINCE700\platform\common\src\common\boot\blmenu\pci\sources(14):TARGETNAME=oal_blmenu_pci
D:\WINCE700\platform\common\src\common\boot\blnk\sources(14):TARGETNAME=oal_blnk
D:\WINCE700\platform\common\src\common\boot\blserial\sources(14):TARGETNAME=oal_blserial
D:\WINCE700\platform\common\src\common\boot\bootpart\sources(29):TARGETNAME=bootpart
D:\WINCE700\platform\common\src\common\boot\eboot\sources(14):TARGETNAME=eboot
D:\WINCE700\platform\common\src\common\boot\fallite\sources(29):TARGETNAME=fallite
D:\WINCE700\platform\common\src\common\boot\fmd\nor\sources(14):TARGETNAME=oal_boot_fmdnor
D:\WINCE700\platform\common\src\common\boot\iplcommon\sources(14):TARGETNAME=iplcommon
Matching lines: 10 Matching files: 10 Total files searched: 24
Find all "TARGETNAME", Match case, Subfolders, Find Results 1, "D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT", "sources; dirs; makefile; *.inc; *.cmn"
D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\BLCOMMON\BLCOMMON\sources(14):TARGETNAME=oal_blcommon
D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\BLCOMMON\BLCOMMON_SECURE\sources(14):TARGETNAME=oal_blcommon_secure
D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\BLMENU\BASE\sources(14):TARGETNAME=oal_blmenu
D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\BLMENU\PCI\sources(14):TARGETNAME=oal_blmenu_pci
D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\BLNK\sources(14):TARGETNAME=oal_blnk
D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\BLSERIAL\sources(14):TARGETNAME=oal_blserial
D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\FMD\NOR\sources(14):TARGETNAME=oal_boot_fmdnor
D:\WINCE600\PLATFORM\COMMON\SRC\COMMON\BOOT\SBLMINCRYPT\sources(29):TARGETNAME=SBLMincrypt
Matching lines: 8 Matching files: 8 Total files searched: 20
=================================================
みたいな感じで、要するに boot_XXXXX というスタティックライブラリ名になっているのが新しいbldrコモンライブラリのライブラリ名のようです。
ここで興味深いのが、bldrライブラリには"boot_core_arm_mmu.lib"のようなMMUを有効化するコードが含まれていたり、ファイルシステムのコードが含まれていたりしていることです。現状のBSPをサーチしたところでは実際に boot_core_arm_mmu.lib をリンクしたものはなかったのですが、Template BSPではこれの使用を想定しているコードが存在しました(ただし、ARMとx86しかサポートされていないのかもしれません。) いずれにしても今後追加されるBSPではこれらの新しいbldrライブラリを使用したものが出てくるかもしれません。