|
|
@ -38,46 +38,47 @@
|
|
|
|
#include "los_vm_page.h"
|
|
|
|
#include "los_vm_page.h"
|
|
|
|
#include "los_arch_mmu.h"
|
|
|
|
#include "los_arch_mmu.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 全局变量,代表启动内存的基地址,初始化为__bss_end的地址(通常是未初始化数据段的结束地址)
|
|
|
|
UINTPTR g_vmBootMemBase = (UINTPTR)&__bss_end;
|
|
|
|
UINTPTR g_vmBootMemBase = (UINTPTR)&__bss_end;
|
|
|
|
|
|
|
|
// 全局变量,表示内核堆是否已初始化,初始化为FALSE
|
|
|
|
BOOL g_kHeapInited = FALSE;
|
|
|
|
BOOL g_kHeapInited = FALSE;
|
|
|
|
|
|
|
|
// 启动内存分配函数,用于在系统启动阶段从启动内存中分配内存
|
|
|
|
VOID *OsVmBootMemAlloc(size_t len)
|
|
|
|
VOID *OsVmBootMemAlloc(size_t len)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
UINTPTR ptr;
|
|
|
|
UINTPTR ptr;
|
|
|
|
|
|
|
|
// 如果内核堆已经初始化,则不能使用启动内存分配,返回NULL并报错
|
|
|
|
if (g_kHeapInited) {
|
|
|
|
if (g_kHeapInited) {
|
|
|
|
VM_ERR("kernel heap has been initialized, do not to use boot memory allocation!");
|
|
|
|
VM_ERR("kernel heap has been initialized, do not to use boot memory allocation!");
|
|
|
|
return NULL;
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 对启动内存基地址进行对齐处理,然后更新基地址为分配后的下一个位置
|
|
|
|
ptr = LOS_Align(g_vmBootMemBase, sizeof(UINTPTR));
|
|
|
|
ptr = LOS_Align(g_vmBootMemBase, sizeof(UINTPTR));
|
|
|
|
g_vmBootMemBase = ptr + LOS_Align(len, sizeof(UINTPTR));
|
|
|
|
g_vmBootMemBase = ptr + LOS_Align(len, sizeof(UINTPTR));
|
|
|
|
|
|
|
|
// 返回分配的内存地址
|
|
|
|
return (VOID *)ptr;
|
|
|
|
return (VOID *)ptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 系统内存初始化函数,用于初始化系统内存管理相关资源
|
|
|
|
UINT32 OsSysMemInit(VOID)
|
|
|
|
UINT32 OsSysMemInit(VOID)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
STATUS_T ret;
|
|
|
|
STATUS_T ret;
|
|
|
|
|
|
|
|
// 如果定义了LOSCFG_KERNEL_VM,则初始化内核的地址空间
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
OsKSpaceInit();
|
|
|
|
OsKSpaceInit();
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// 初始化内核堆,如果失败则返回错误并报错
|
|
|
|
ret = OsKHeapInit(OS_KHEAP_BLOCK_SIZE);
|
|
|
|
ret = OsKHeapInit(OS_KHEAP_BLOCK_SIZE);
|
|
|
|
if (ret != LOS_OK) {
|
|
|
|
if (ret != LOS_OK) {
|
|
|
|
VM_ERR("OsKHeapInit fail\n");
|
|
|
|
VM_ERR("OsKHeapInit fail\n");
|
|
|
|
return LOS_NOK;
|
|
|
|
return LOS_NOK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 如果定义了LOSCFG_KERNEL_VM,则启动虚拟页和映射的初始化,然后设置内核堆为已初始化状态
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
#ifdef LOSCFG_KERNEL_VM
|
|
|
|
OsVmPageStartup();
|
|
|
|
OsVmPageStartup();
|
|
|
|
g_kHeapInited = TRUE;
|
|
|
|
g_kHeapInited = TRUE;
|
|
|
|
OsInitMappingStartUp();
|
|
|
|
OsInitMappingStartUp();
|
|
|
|
#else
|
|
|
|
#else // 否则直接设置内核堆为已初始化状态
|
|
|
|
g_kHeapInited = TRUE;
|
|
|
|
g_kHeapInited = TRUE;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
// 返回成功状态码
|
|
|
|
return LOS_OK;
|
|
|
|
return LOS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|