reactos操作系统实现(28)
在内存管理里,绝大部份内存都是分页内存。分页内存就是把内存分成4K页大小的内存块,这些内存块不但可以在物理内存里,也可以切换时保存到硬盘里。这些内存管理里是通过下面的代码进行的,如下: #001 VOID #002 INIT_FUNCTION #003 NTAPI #004 MmInitializePagedPool(VOID) #005 { #006 /* #007 * We are still at a high IRQL level at this point so explicitly commit #008 * the first page of the paged pool before writing the first block header. #009 */
分配一页物理内存作为内存管理结构头。 #010 MmCommitPagedPoolAddress ( (PVOID)MmPagedPoolBase,FALSE ); #011
下面就根据内存数据结构初始化分页管理的内存。 #012 MmPagedPool = RPoolInit ( MmPagedPoolBase, #013 MmPagedPoolSize, #014 MM_POOL_ALIGNMENT, #015 MM_CACHE_LINE_SIZE, #016 PAGE_SIZE ); #017 #018 ExInitializeFastMutex(&MmPagedPool->Mutex); #019 }
通过上面函数就可以把分页内存初始化,准备好分页内存给其它函数使用。下面的函数就是从分页内存里分配内存出来的,如下: #001 /********************************************************************** #002 * NAME INTERNAL #003 * ExAllocatePagedPoolWithTag@12 #004 * #005 * DESCRIPTION #006 * #007 * ARGUMENTS #008 * #009 * RETURN VALUE #010 */ #011 PVOID NTAPI #012 ExAllocatePagedPoolWithTag (IN POOL_TYPE PoolType, #013 IN ULONG NumberOfBytes, #014 IN ULONG Tag) #015 { #016 int align; #017
根据分配内存大小来选择不同的对齐方式。 #018 if ( NumberOfBytes >= PAGE_SIZE ) #019 align = 2; #020 else if ( PoolType & CACHE_ALIGNED_POOL_MASK ) #021 align = 1; #022 else #023 align = 0; #024
使用分页内存的线程都需要低于APC_LEVEL级别。 #025 ASSERT_IRQL_LESS_OR_EQUAL(APC_LEVEL); #026
下面调用双向链表的内存管理器。 #027 return RPoolAlloc ( MmPagedPool,NumberOfBytes,Tag,align ); #028 } #029
分页内存管理的代码主要文件ntoskrnl/mm/ppool.c里。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |