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不产生多余的页。这里采用后一种。