1. 优化OsVmRegionSplit结点操作。https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/base/vm/los_vm_map.c#L661

现在的操作顺序是先删除oldRegion,然后调整其大小,如果大小不为0再加回来。红黑树结点增删较费时,删后再增是不合适的。因此调整操作顺序为先调整大小,如果为0再删除。

2. 修改OsVmRegionAdjust起始地址不在某region时的行为。https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/base/vm/los_vm_map.c#L685

现在的代码逻辑是,如果传入的newRegionStart不在某个region就报错返回,这限制了函数的用途,如调用链:OsVmRegionAdjust <- OsRegionsRemove <- OsUnMMap <- LOS_UnMMap <- OsAllocSpecificRange,最后一个函数(https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/base/vm/los_vm_map.c#L406)在起始地址或结束地址或一段地址属于某region时,都将使用这个调用链,显然两种情形将失败。

分析该函数的使用场景,逻辑应调整为:起始地址不在某region时,就继续处理结束地址。代码修改看起来挺多,实际就将一个语句改换了位置。

3. 修复OsIsRegionCanExpand中的计算错误。https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/base/vm/los_vm_map.c#L799

OsIsRegionCanExpand将size参数视为增量大小进行计算,而该函数唯一的调用者LOS_DoMremap传入的是实际大小。按实际大小调整计算比较合适。