您的位置:首页 > 其它

wince下的内存管理

2013-05-15 18:40 218 查看
wince6.0的内存管理

D:\WINCE600\PLATFORM\ELCD-S3C6410-128M-SRC\FILES\config.bib

MEMORY

#define NKNAME NK

#define NKSTART 80100000

;#define NKLEN 02800000 ; 40MB,下一片内存为:0x82900000

#define NKLEN 01E00000 ; 30MB, 下一片内存为:0x81F00000

#define RAMNAME RAM

;#define RAMSTART 82900000

#define RAMSTART 81F00000

;#define RAMLEN 03100000 ; 49MB, 下一片内存为:0x85A00000

#define RAMLEN 03D00000 ; 61MB, 下一片内存为:0x85C00000

;0x85A00000~85C00000,有2M的空间,先前并没有使用,现在修改为让系统使用。

;优化前的内存:8384+58712=67096KB

;优化后的内存:8640+60504=69144KB

;69144-67096=2048(也就是2M的空间),即:WINCE系统知道会优化:NKSTART~RAMEND这段的内存,会依据NK.nb0的大小来调节内存。

;所以,如果需要增加内存,则需要增加(RAMEND-NKSTART)值。

;-----------------------------------------------------

; NAME ADDRESS SIZE TYPE

;-----------------------------------------------------

$(NKNAME) $(NKSTART) $(NKLEN) RAMIMAGE

$(RAMNAME) $(RAMSTART) $(RAMLEN) RAM

; Common RAM areas

AUD_DMA 80002000 00002000 RESERVED

TEMPS 80010000 00010000 RESERVED

DBGSER_DMA 80022000 00002000 RESERVED

ARGS 80020800 00000800 RESERVED

SER_DMA 80024000 00002000 RESERVED

IR_DMA 80026000 00002000 RESERVED

SLEEP 80028000 00002000 RESERVED

EDBG 80030000 00020000 RESERVED

CAMERA_DMA 85C00000 00400000 RESERVED ; 4M

;CMM 85D00000 00300000 RESERVED

FIMG_BUF 86000000 00800000 RESERVED ; 8M

;DISPLAY 86800000 00C00000 RESERVED ; 12M

;MFC_JPEG 87400000 00C00000 RESERVED ; 12M

;修改的原因:MFC和JPEG共用一块内存,造成冲突。

DISPLAY 86800000 00600000 RESERVED ; 6M

JPEG_BUF 86E00000 00A00000 RESERVED ; 10M

MFC_BUF 87800000 00800000 RESERVED ; 8M

config.bib和ce.bib文件是用于nmake来产生nk.bin的,源代码其实是不用它们的。这样的话,那么config.bib内MEMORY的RESERVED有什么作用?答:msdn内对RESERVED的解释是During run-time image creation, Romimage skips these reserved sections,他们都是memory字段,这里的信息就能告诉打包程序这里是内存。

实践证明,WINCE能够管理的内存类型是:RAMIMAGE和RAM。类型RESERVED的内存是不能够管理的。RAMIMAGE和RAM段是紧靠在一起的,当nk. nb0的实际大小发生变化时, WINCE系统知道自己调节优化,不会受SIZE的约束,可缩小或扩大RAM的SIZE。如果需要增加系统可用内存,则需要增加(RAMEND-NKSTART)的值或缩小NK.nb0的实际大小。

如果调整了驱动所使用的固定内存(比如显示Buffer),那么,除了要修改RESERVED类型的MEMORY,还需要修改image_cfg.h文件(驱动程序源码并不知道config.bib),驱动程序源码是依靠头文件(image_cfg.h)内的宏定义来确定内存的。(另外,我觉得可以不修改config.bib,仅仅修改image_cfg.h即可,但是这个说法没有测试过)。image_cfg.h文件如下所示:

D:\WINCE600\PLATFORM\ELCD-S3C6410-128M-SRC\SRC\INC\image_cfg.h

// DRAM Base Address

#define DRAM_BASE_PA_START (0x50000000)

#define DRAM_BASE_CA_START (0x80000000)

#define DRAM_BASE_UA_START (0xA0000000)

#define DRAM_SIZE (0x08000000)

// MFC Video Process Buffer

// 12MB modify to 8M

//#define IMAGE_MFC_BUFFER_OFFSET (0x07400000)

#define IMAGE_MFC_BUFFER_OFFSET (0x07800000)

#define IMAGE_MFC_BUFFER_PA_START (DRAM_BASE_PA_START+IMAGE_MFC_BUFFER_OFFSET)

#define IMAGE_MFC_BUFFER_UA_START (DRAM_BASE_UA_START+IMAGE_MFC_BUFFER_OFFSET)

//#define IMAGE_MFC_BUFFER_SIZE (0x00C00000)

#define IMAGE_MFC_BUFFER_SIZE (0x00800000)

// JPEG Process Buffer

// 10MB

#define IMAGE_JPEG_BUFFER_OFFSET (0x06E00000)

#define IMAGE_JPEG_BUFFER_PA_START (DRAM_BASE_PA_START+IMAGE_JPEG_BUFFER_OFFSET)

#define IMAGE_JPEG_BUFFER_UA_START (DRAM_BASE_UA_START+IMAGE_JPEG_BUFFER_OFFSET)

#define IMAGE_JPEG_BUFFER_SIZE (0x00A00000)

Config.bib内的

D:\WINCE600\OSDesigns\ELCD-S3C6410-128M-PRJ\ELCD-S3C6410-128M-PRJ\RelDir\ZhiYuan_ELCD-S3C6410-128M-SRC_Release\ce.bib

MODULES

; Name Path Memory Type

; -------------- --------------------------------------------- -----------

; @CESYSGEN IF CE_MODULES_NK

nk.exe oal.exe NK SHZ

kernel.dll kern.dll NK SHZ

oemaddrtab_cfg.inc

;------------------------------------------------------------------------------

;

; TABLE FORMAT

; cached address, physical address, size

;------------------------------------------------------------------------------

g_oalAddressTable

DCD 0x80000000, 0x50000000, 128 ; 128 MB DRAM

DCD 0x90000000, 0x70000000, 4 ; SROM SFR

;DCD 0x90100000, 0x70100000, 1 ; OneNAND SFR

;DCD 0x90200000, 0x70200000, 1 ; NFCON SFR

;DCD 0x90300000, 0x70300000, 1 ; CFCON SFR

DCD 0x90400000, 0x71000000, 4 ; TZIC0

;DCD 0x90500000, 0x71100000, 1 ; TZIC1

;DCD 0x90600000, 0x71200000, 1 ; INTC0

;DCD 0x90700000, 0x71300000, 1 ; INTC1

DCD 0x90800000, 0x72000000, 1 ; FIMG-3DSE SFR

;DCD 0x90800000, 0x73000000, 2 ; ETB Memory

;DCD 0x90900000, 0x73100000, 1 ; ETB Registers

DCD 0x90A00000, 0x74000000, 2 ; Indirect Host I/F

;DCD 0x90B00000, 0x74100000, 1 ; Direct Host I/F(MODEM)

DCD 0x90C00000, 0x74300000, 2 ; USB Host

;DCD 0x90D00000, 0x74400000, 1 ; MDP I/F

DCD 0x90E00000, 0x75000000, 2 ; DMA0

;DCD 0x90F00000, 0x75100000, 1 ; DMA1

DCD 0x91000000, 0x76100000, 3 ; 2D Graphics

;DCD 0x91100000, 0x76200000, 1 ; TV Encoder

;DCD 0x91200000, 0x76300000, 1 ; TV Scaler

DCD 0x91300000, 0x77000000, 3 ; Post Processor

;DCD 0x91400000, 0x77100000, 1 ; LCD Controller

;DCD 0x91500000, 0x77200000, 1 ; Rotator

DCD 0x91600000, 0x78000000, 1 ; Camera I/F

DCD 0x91700000, 0x78800000, 1 ; JPEG

DCD 0x91800000, 0x7C000000, 5 ; USB OTG LINK

;DCD 0x91900000, 0x7C100000, 1 ; USB OTG PHY SFR

;DCD 0x91A00000, 0x7C200000, 1 ; SD-MMC Controller 0

;DCD 0x91B00000, 0x7C300000, 1 ; SD-MMC Controller 1

;DCD 0x91C00000, 0x7C400000, 1 ; SD-MMC Controller 2

DCD 0x91D00000, 0x7D000000, 13 ; D&I(Security Subsystem Config) SFR

;DCD 0x91E00000, 0x7D100000, 1 ; AES_RX

;DCD 0x91F00000, 0x7D200000, 1 ; DES_RX

;DCD 0x92000000, 0x7D300000, 1 ; HASH(SHA/PRNG)_RX

;DCD 0x92100000, 0x7D400000, 1 ; RX_FIFO SFR

;DCD 0x92200000, 0x7D500000, 1 ; AES_TX

;DCD 0x92300000, 0x7D600000, 1 ; DES_TX

;DCD 0x92400000, 0x7D700000, 1 ; HASH(SHA/PRNG)_TX

;DCD 0x92500000, 0x7D800000, 1 ; TX FIFO SFR

;DCD 0x92600000, 0x7D900000, 1 ; RX_FIFO

;DCD 0x92700000, 0x7DA00000, 1 ; TX_FIFO

;DCD 0x92800000, 0x7DB00000, 1 ; SDMA0

;DCD 0x92900000, 0x7DC00000, 1 ; SDMA1

DCD 0x92A00000, 0x7E000000, 1 ; DMC, MFC, WDT, RTC, HSI TX/RX, Keypad, ADC, SYSCON

DCD 0x92B00000, 0x7F000000, 1 ; TZPC, AC97, I2S, I2C, UART, PWM, IrDA, GPIO, PCM, SPI

DCD 0x93000000, 0x00000000, 16 ; 32 MB SROM(SRAM/ROM) BANK 0

; nCS1~nCS5, nCS0

DCD 0x94000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1 = DM9000A

;DCD 0x96000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 2

;DCD 0x98000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3

;DCD 0x9A000000, 0x30000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4

;DCD 0x9C000000, 0x38000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5

;DCD 0x9E000000, 0x10000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0

DCD 0x00000000, 0x00000000, 0 ; end of table

g_oalAddressTable其实就是物理地址到Catch地址的映射关系,这里包含了整个ARM的物理地址空间,如果访问这里之外的物理空间就会产生错误。

如果内存大小发生了变化,则需要修改oemaddrtab_cfg.inc内的值,以便让系统知道;还需要修改image_cfg.h和image_cfg.inc,里面也有内存大小的宏定义。eboot内的startup.s内使用image_cfg.inc内的宏定义来初始化;其他工程使用image_cfg.h内的宏定义来初始化。

初始化MMU是用“g_oalAddressTable”,有三个地方用到了此变量:

1. EBOOT时进行过一次;

2. OAL时进行第二次。

3. 为了快速映射物理内存,\SRC\DRIVERS\DrvLib\DriverLib_mem.c,编写了两个函数:

DrvLib_MapIoSpace和DrvLib_UnmapIoSpace,DrvLib_MapIoSpace函数就查询“g_oalAddressTable”,然后直接返回相应的虚拟地址。这是第三次。



Image_cfg.inc内定义了一些内存相关的宏,在需要清零、初始化内存、其他功能时被用到。有三个地方用到,分别是:第一级启动代码stepldr、第二级启动代码eboot、OAL启动代码。



Image_cfg.inc是给汇编代码文件.s使用的;image_cfg.h是给驱动源码文件.c使用的。

wince7.0的内存管理
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: