wince下的内存管理

  1. 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_MapIoSpaceDrvLib_UnmapIoSpaceDrvLib_MapIoSpace函数就查询“g_oalAddressTable”,然后直接返回相应的虚拟地址。这是第三次。

 

 

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

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

 

 

wince7.0的内存管理

 

转载于:https://www.cnblogs.com/yfm1202/archive/2013/05/15/3080407.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值