一、编译出NK,但是但是下载NK后不会启动。
原因:就是DNW设置地址不对,并不是每个NK下载到0x32000000都能运行的。欲知详情,请看下面。
先看这个能在0x32000000运行的NK的内存映射表
OEMAddressTable
;;;-------------------------------------------------------------
;;; Virt Addr Phys Addr MB
;;;-------------------------------------------------------------
DCD 0x80000000, 0x02000000, 30 ; 30 MB SRAM(SRAM/ROM) BANK 0
DCD 0x82000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1
DCD 0x84000000, 0x10000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 2
DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3
DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4
DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5
DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0, 1
DCD 0x90800000, 0x48000000, 1 ; Memory control register
DCD 0x90900000, 0x49000000, 1 ; USB Host register
DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register
DCD 0x90B00000, 0x4B000000, 1 ; DMA control register
DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register
DCD 0x90D00000, 0x4D000000, 1 ; LCD control register
DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register
DCD 0x90F00000, 0x4F000000, 1 ; Camera control register
DCD 0x91000000, 0x50000000, 1 ; UART control register
DCD 0x91100000, 0x51000000, 1 ; PWM timer register
DCD 0x91200000, 0x52000000, 1 ; USB device register
DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register
DCD 0x91400000, 0x54000000, 1 ; IIC control register
DCD 0x91500000, 0x55000000, 1 ; IIS control register
DCD 0x91600000, 0x56000000, 1 ; I/O Port register
DCD 0x91700000, 0x57000000, 1 ; RTC control register
DCD 0x91800000, 0x58000000, 1 ; A/D convert register
DCD 0x91900000, 0x59000000, 1 ; SPI register
DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register
DCD 0x91B00000, 0x5B000000, 1 ; AC97 Interface register
DCD 0x91C00000, 0x5C000000, 1 ; ATAPI register cs0 add by fly
DCD 0x91D00000, 0x5D000000, 1 ; ATAPI register cs1 add by fly
DCD 0x00000000, 0x00000000, 0 ; End of Table (MB MUST BE ZERO!)
END
现在再来看这个NK对应的config.bib文件的内存分配
MEMORY
;NK 29MB
NK 8C200000 01D00000 RAMIMAGE----注意这个8C200000刚好对应的是物理地址0x30200000!
;RAM 96MB
RAM 8E000000 02000000 RAM
; Common RAM areas
AUD_DMA 8c002000 00002000 RESERVED
DRV_GLB 8c010000 00010000 RESERVED
DBGSER_DMA 8c022000 00002000 RESERVED
SER_DMA 8c024000 00002000 RESERVED
IR_DMA 8c026000 00002000 RESERVED
SD_DMA 8c028000 00008000 RESERVED
EDBG 8c030000 00020000 RESERVED
CAMERA 8c050000 00110000 RESERVED
DISPLAY 8c160000 000A0000 RESERVED
注意红色那行,由此可知,DNW不是随便乱填就可以下载的,我想这个应该是唯一的,必须看内存映射表以及config.bib的设置。在这里不想多举例子,最后我想提醒大家看看这个config.bib的配置,各个部分是不能重叠的。
还有:在WINCE5.0下无法生成NK.nbo,后来在网上看到相关文章,才知道需要修改config.bib这个文件,需要添加如下参数:
ROMSTART
ROMWIDTH
ROMSIZE
三、(1)boot.bib中和config.bib定义的内存段有重复的地方,比如说EBOOT 8c038000 00020000 RAMIMAGE 和
EDBG 8c030000 00020000 RESERVED 这样是否有影响,我看到有文章说,EBOOT镜像在的地方不可以被重写和覆盖,但是,这里却重复了???
(2)按理说,congfig.bib中的定义和头文件中定义的地址一致才对,以下是我从loarder.h中截出来的,请看
// Nk Memory reigions defined in config.bib...
//
#define ROM_RAMIMAGE_START 0x8C100000
#define ROM_RAMIMAGE_SIZE 0x01000000
// Start addresses must match config.bib's RAMIMAGE
#define RAM_START 0x8d100000
#define RAM_SIZE 0x00F00000
按照config.bib的定义,以上应该是以下才对
// Nk Memory reigions defined in config.bib...
//
#define ROM_RAMIMAGE_START 8C200000
#define ROM_RAMIMAGE_SIZE 02400000
// Start addresses must match config.bib's RAMIMAGE
#define RAM_START 8E600000
#define RAM_SIZE 01900000
这个是我的理解错误,还是什么的,请各位大侠指教,我的是wince5.0
牛人回答
1. eboot所在的位置不能被覆盖,是指flash中。ram中,当eboot启动,加载了OS后,系统控制权就交给OS了,eboot就不会再被用到,所以其在RAM中的空间可以被再次利用。这次覆盖是在OS启动之后加载驱动时才会产生。
2. OS的IMG你可以用UEdit打开看一下,前面有一部分是空白区域。这里定义的起始地址,是对应了有效的可执行OS镜像的开始。所以跟上面看到的有偏移。
-------------从这个牛人这里可以看出,如果改动了config.bib,那么loader.h也要跟着改动了,估计是这样,不然启动不了的。先试试