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 Signature 0x1040
ROM Header Address 0x1044
ROM Header Extension
Chain Information
ROM Header Structure 0x3F24
Modules and Files Index Data 0x3F78

=== 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才開始執行。


返回上一頁