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的内存管理
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的内存管理
相关文章推荐
- WinCE 进程、线程和内存管理之同步
- [转]WinCE 进程、线程和内存管理(一)(by fllsoft)
- [转]WinCE 进程、线程和内存管理(一)(by fllsoft)
- [转]WinCE 进程、线程和内存管理之同步(by fllsoft)
- winCE进程、线程和内存管理
- WINCE 的内存管理
- [转载]WinCE 进程、线程和内存管理之同步
- winCE的内存管理
- WinCE 进程、线程和内存管理之同步
- WINCE内存管理基础
- winCE的内存管理
- winCE的内存管理
- Windows编程那些事----内存管理方法之一【虚拟内存】
- WinCE开机默认语言设置
- linux 内核学习之内存管理-未完待续
- 全面理解Unity加载和内存管理
- WINCE 6.0安装顺序说明
- WINCE开发中eboot模式下TFTP方式下载NK镜像时的问题
- Linux内存管理基本概念
- 初始化内存管理