项目6:内存分配-PDA的内存管理(1)本节课程主要知识点WindowsCE5.0的内存管理WindowsCE5.0的内存结构进程地址空间结构重点和难点重点内存管理的基本概念难点虚拟内存的使用WindowsCE5.0的内存管理内存管理内存管理是操作系统中最重要的功能之一,尤其是在嵌入式系统中更为重要。内存管理的目的是为了充分利用内存,尽可能方便用户使用内存。解决程序空间比实际内存空间大的问题。WindowsCE5.0的内存管理WindowsCE5.0内存管理是在WindowsXP内存管理的基础上优化而成的。内存管理采用虚拟内存方式来管理内存的使用。物理内存WindowsCE5.0最大支持512MB的物理内存。物理内存包括RAM、ROM和Flash存储器。操作系统的映像和相关文件一般存储在Flash中。虚拟内存WindowsCE5.0支持4GB的虚拟内存。管理虚拟内存的硬件是内存管理单元MMU,负责把虚拟地址映射到内存的物理地址。整个4GB虚拟地址空间划分为两部分,地址0x80000000以上的2G空间为内核使用部分,0x80000000以下的2G空间为应用程序使用部分。内核空间与用户空间内核空间(地址0x80000000以上)运行于核心态的进程使用静态映射物理地址用户空间(地址0x80000000以下)划分为64个Slots,每一个Slot有32MB大多数情况下,动态映射物理地址物理内存映射虚拟内存2GBUser512MBUncached512MBCached32MBFlashPhysicalMemoryVirtualMemory040000008200000080000000A0000000C00000000000000064MBRAM0000000064MBRAM32MBFlash64MBRAMFFFFFFFFAddressTranslation32MBFlashKernelSpaceUserSpaceWindowsCE5.0的内存结构WindowsCE5.0的内存结构2GBUserSpaceSlot97:NK.EXEReservedStaticallyMappedVirtualAddresses:Un-CachedStaticallyMappedVirtualAddresses:CachedSlot0–CurrentProcessSlot1–XIPDLLcodeSlots2-32-ProcessesSlots33-63ObjectStoreandMemory-MappedFilesFFFFFFFFE0000000C4000000C2000000C0000000A0000000800000007FFFFFFF42000000040000000200000000000000Total4GBVirtualSpace2GBKernelSpaceKernelSpaceUserSpaceReservedKernelAddresses:KPAGE,TrapArea,Others地址范围用途0x00000000-0x41FFFFFF33个槽,每个槽32MB,每个进程占用一个槽0x42000000-0x7FFFFFFF共享区域,应用程序创建堆、内存映射文件等0x8000000-0x9FFFFFFF物理地址映射空间,有缓冲0xA000000-0xBFFFFFFF物理地址映射空间,无缓冲0xC000000-0xC1FFFFFF系统保留0xC200000-0xC3FFFFFFNK.EXE占用0xC400000-0xDFFFFFFF用户定义静态虚拟地址空间0xE000000-0xFFFFFFFF内核使用的虚拟地址内核与用户空间的地址分配ActiveProcessActiveProcessActiveProcessActiveProcessActiveProcessWindowsXP内存结构SystemReserved(kernelmodespace)0000000080000000FFFFFFFFApplicationSpaceWindowsCE内存结构SystemReserved(kernelmodespace)00000000040000004200000080000000FFFFFFFFActiveProcessActiveProcessActiveProcessActiveProcessActiveProcessActiveProcessApplicationSpaceReservedLargeMemoryArea(memorymappedfiles)ApplicationSpace00000000040000004200000080000000LargeMemoryArea(memorymappedfiles)虚拟内存中的SlotsApplicationSlots(Slots2-32)CurrentApplication(Slots0-1)2GigabytesDividedinto6432MByteSlots31slotsforLMA31slotsforapplications2slotsforcurrentapplicationSlot当一个应用程序启动时,内核为这个程序选择一个空闲的槽(Slot),并且加载所有的代码、资源,并分配堆栈,加载DLL等。当这个进程得到CPU使用权时,它的整个地址空间被内核映射到Slot0,也就是当前进程使用的地址空间,然后开始运行。Slot0每个进程在执行前都要映射到Slot0。由于进程使用的所有DLL可能来自不同的Slot,为避免所使用的DLL在映射到Slot0中出现地址空间冲突的现象,内核的加载器在加载DLL时会查找所有槽中加载的DLL的地址,保证在映射到Slot0时不会发生地址冲突现象。Slot2–Slot8Slot2:通常被Filesys.exe占用Slot3:通常被shell.exe占用Slot4:通常被device.exe占用Slot5:通常被gwes.exe占用Slot6:通常被ceemulsrv.exe占用Slot7:通常被explorer.exe占用Slot8:通常被services.exe占用Slot中的内存分配进程最低部的64KB作为保留区域。代码段从0x00010000开始加载,内核为代码段分配足够的虚拟地址空间。为只读数据和可读/可写数据分配空间。为资源数据分配空间。为默认堆和栈分配空间。Slot中的DLL加载非XIPDLL从进程最高端地址向下开始加载。非XIPDLL的加载按如下规则:内核先检查要加载的DLL是否已经被其它进程加载,如果加载过,就做一个地址的重定位。避免系统内多次加载相同DLL。如果没有加载过,就按照从槽的高地址到槽的低地址的顺序查找空闲的地址空间。然后分配足够的地址空间用于加载DLL。进程地址空间结构进程地址空间结构WindowsCE5.0同以前版本的WindowsCE操作系统在进程地址空间上有所不同。以前的WindowsCE把XIPDLL也加载到进程的32MB地址空间中。WindowsCE5.0把XIPDLL单独加载到Slot1中,这样对于每个进程来说,它总的地址空间就大了一倍,达到64MB。进程的地址空间Slot30Slot31Slot32...01FFFFFF000100000000000032MBProcessSpaceCurrentProcessXIPROMDLLsnk.exefilesys.exeshell.exedevice.exegwes.exeC4000000C2000000FreeVirtualSpaceSlot63...ResourceDLLsSlot2Slot3Slot4Slot5Slot1Slot00A0000003E0000003C000000400000004200000000000000040000000200000006000000080000000C000000...Slot97800000007E000000不同CPU的内存结构不同的CPU内存管理方法也不同。对于MIPS和SHX系列CPU来说,物理地址映射是由CPU完成的,WindowsCE内核可以直接访问512MB的物理内存。对于x86系列和ARM系列的CPU来说,在内核启动过程中它会将现有物理内存地址全部映射到0x80000000以上的虚拟地址空间中供内核以后使用。