代码拉取完成,页面将自动刷新
36
修复los_vm_phys.c内存泄漏
已关闭
OsVmPhysPagesGet函数(https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/base/vm/los_vm_phys.c#L366)负责从系统空闲内存块链表中分配连续的物理内存,并在分配的第一页中记载页数:
page = OsVmPhysPagesAlloc(seg, nPages);// 分配连续内存
if (page != NULL) {
/* the first page of continuous physical addresses holds refCounts */
LOS_AtomicSet(&page->refCounts, 0);
page->nPages = nPages;// 记载页数
释放时按此记录将内存退还空闲链表。
问题:OsVmPhysPagesAlloc实际分配的可能不是nPages页,而是其向上取整2的整数幂,如nPages=5则实际分配8页(2^3)。这样就可能出现内存泄漏:有8-5=3页内存不会被退还空闲块链表,从而不再能被使用。
修复这个问题有两种策略:一是多分配,即记录修正为实际分配的2的整数幂;二是按需分配,即修正分配函数OsVmPhysPagesAlloc不产生多余的页。这里采用后一种。