GP2X Wiz

解析Pollux UART.nb0


Pollux本身內建UART Bootloader程式,該程式可以避免使用SDCard更新失敗而造成無法開機的狀況,相當便利的設計,因為這代表Wiz掌機是燒不死的,讓司徒可以更加安心的開發軟體程式,而當Pollux處於UART Bootloader模式時,它會等待使用者傳送512B或16KB的資料,Wiz掌機預設設定為等待16KB資料,所以當Pollux處於UART Bootloader模式時,Pollux會使用Baudrate 19200 bps等待使用者傳送16KB的資料到記憶體,一旦UART接收的資料達到16KB後,Pollux會直接跳到0x0000位址開始執行。

既然已經知道Pollux的基本運作原理,司徒就帶大家先來分析一下UART.nb0檔案

00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001000  fe 03 00 ea 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00001040  45 43 45 43 24 3f 00 00  24 2f 00 00 00 00 00 00  |ECEC$?..$/......|
00001050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...

當司徒一看到0x1040位址的ECEC標誌,第一個想到的就是WinCE XIP(Execution In Place) NB0檔案格式,這種檔案格式具有直接執行的優點,因此可以直接燒錄於NOR Flash Memory並執行,但是缺點就是容量會比一般壓縮過的BIN檔案還要大,而NB0的格式具有如下段落

檔案格式UART.nb0對應位址
EA Comment(64 Bytes NULL)0x1000
ECEC Signature0x1040
ROM Header Address0x1044
ROM Header Extension
Chain Information
ROM Header Structure0x3F24
Modules and Files Index Data0x3F78

=== ROM Header Structure ===
First DLL address:                              0x02000000
Last DLL address:                               0x02000000
First physical address:                         0x00001000
Highest physical address:                       0x00004098
Number of TOC entries:                          0x00000001
Start of RAM:                                   0x000F0000
Start of RAM free space:                        0x000F0000
End of RAM:                                     0x00100000
Number of copy section entries:                 0x00000001
Offset to the copy section:                     0x00003F98
Length of profile entries in RAM:               0x00000000
Offset to the profile entries:                  0x00000000
Number of files:                                0x00000000
Kernel flags:                                   0x00000000
Percentage of RAM used for the file system:     0x80808080
Device driver global starting address:          0x00000000
Device driver global length:                    0x00000000
CPU type:                                       0x01C2(Thumb)
Miscellaneous flags:                            0x0002
Pointer to ROM header extensions:               0x00000000
Tracking memory starting address:               0x00000000
Tracking memory ending address:                 0x00000000

=== TOC Entry ===
File attributes:                                0x00000001
The high 32 bits of the time value:             0x01C86EC5
The low 32 bits of the time value:              0x97AC9CC6
File size:                                      0x00002800
lpszFileName:                                   nk.exe
Offset to E32 structure:                        0x00003E64
Offset to O32 structure:                        0x00003ED4
Module load buffer offset:                      0x00001000

分析到這裡時,司徒發覺兩個地方怪怪的,第一個問題是開頭怎麼都是0x00的資料?第二個問題則是nk.exe檔案問題?針對第一個問題,司徒使用IDA Pro反組譯後,發現反組譯後的組合語言是ANDEQ R0, R0, R0,這個指令其實類似於NOP指令的作用(不做任何事情),直到0x1000位址才開始真正執行程式,只是為何要填入4096個0x00就有點怪,至於第二個問題,UART.nb0竟然包含一個nk.exe檔案,但是,司徒想了再想後,發覺可能是為了WinCE相容問題,因此才會做這樣的設計,因為就算包含ROM Header、TOC Entry資料結構,但是,Pollux一開始會從0x0000位址開始執行,所以Pollux可以不用在意後面的相關資料(因為程式不會執行到這裡)。所以結論就是UART.nb0包含兩種相容模式,第一種就是單純的Bootloader程式,第二種就是WinCE相容的XIP檔案格式,若使用在Wiz掌機身上,由於目前還沒有WinCE系統移植,因此UART.nb0算是一種單純的Bootloader程式,而真正的程式是從0x1000才開始執行。


返回上一頁