结构体 | |
struct | file |
struct | page_mapping |
struct | VmMapRange |
struct | VmFault |
缺页结构信息体 更多... | |
struct | VmFileOps |
虚拟内存文件操作函数指针,上层开发可理解为 class 里的方法,注意是对线性区的操作 , 文件操作 见于g_commVmOps 更多... | |
struct | VmMapRegion |
struct | VmSpace |
虚拟空间,每个进程都有一个属于自己的虚拟内存地址空间 更多... | |
类型定义 | |
typedef struct VmMapRange | LosVmMapRange |
typedef struct VmMapRegion | LosVmMapRegion |
typedef struct VmFileOps | LosVmFileOps |
typedef struct VmSpace | LosVmSpace |
虚拟空间,每个进程都有一个属于自己的虚拟内存地址空间 更多... | |
typedef struct VmFault | LosVmPgFault |
缺页结构信息体 更多... | |
typedef struct VmFileOps LosVmFileOps |
在文件 los_vm_map.h 第 91 行定义.
typedef struct VmMapRange LosVmMapRange |
typedef struct VmMapRegion LosVmMapRegion |
在文件 los_vm_map.h 第 89 行定义.
typedef struct VmFault LosVmPgFault |
缺页结构信息体
typedef struct VmSpace LosVmSpace |
虚拟空间,每个进程都有一个属于自己的虚拟内存地址空间
在文件 los_vm_map.h 第 93 行定义.
LosVmSpace * LOS_CurrSpaceGet | ( | VOID | ) |
获取当前进程空间结构体指针
在文件 los_vm_map.c 第 112 行定义.
LosVmSpace * LOS_GetKVmSpace | ( | VOID | ) |
LosVmSpace * LOS_GetVmallocSpace | ( | VOID | ) |
LOS_DL_LIST * LOS_GetVmSpaceList | ( | VOID | ) |
获取进程空间链表指针 g_vmSpaceList中挂的是进程空间 g_kVmSpace, g_vMallocSpace,所有用户进程的空间(独有一个进程空间)
在文件 los_vm_map.c 第 135 行定义.
给定地址范围是否都在内核空间中
在文件 los_vm_map.h 第 219 行定义.
BOOL LOS_IsRangeInSpace | ( | const LosVmSpace * | space, |
VADDR_T | vaddr, | ||
size_t | size | ||
) |
BOOL LOS_IsRegionFileValid | ( | LosVmMapRegion * | region | ) |
映射类型为文件的线性区是否有效
在文件 los_vm_map.c 第 512 行定义.
STATIC INLINE BOOL LOS_IsRegionFlagPrivateOnly | ( | LosVmMapRegion * | region | ) |
STATIC INLINE BOOL LOS_IsRegionPermUserReadOnly | ( | LosVmMapRegion * | region | ) |
STATIC INLINE BOOL LOS_IsRegionTypeAnon | ( | LosVmMapRegion * | region | ) |
STATIC INLINE BOOL LOS_IsRegionTypeDev | ( | LosVmMapRegion * | region | ) |
STATIC INLINE BOOL LOS_IsRegionTypeFile | ( | LosVmMapRegion * | region | ) |
虚拟地址[vaddr,vaddr + len]是否在用户空间
在文件 los_vm_map.h 第 281 行定义.
VOID LOS_KernelFree | ( | VOID * | ptr | ) |
VOID * LOS_KernelMalloc | ( | UINT32 | size | ) |
thread safety these is used to malloc or free kernel memory. when the size is large and close to multiples of pages, will alloc pmm pages, otherwise alloc bestfit memory.
VOID * LOS_KernelRealloc | ( | VOID * | ptr, |
UINT32 | size | ||
) |
PADDR_T LOS_PaddrQuery | ( | VOID * | vaddr | ) |
通过虚拟地址查询映射的物理地址
在文件 los_vm_map.c 第 550 行定义.
LosVmMapRegion * LOS_RegionAlloc | ( | LosVmSpace * | vmSpace, |
VADDR_T | vaddr, | ||
size_t | len, | ||
UINT32 | regionFlags, | ||
VM_OFFSET_T | pgoff | ||
) |
这里不是真的分配物理内存,而是逻辑上画一个连续的区域,标记这个区域可以拿用,表示内存已经归你了。 但真正的物理内存的占用会延迟到使用的时候才由缺页中断调入内存
If addr is NULL, then the kernel chooses the address at which to create the mapping; this is the most portable method of creating a new mapping. If addr is not NULL, then the kernel takes it as where to place the mapping;
在文件 los_vm_map.c 第 581 行定义.
STATIC INLINE VADDR_T LOS_RegionEndAddr | ( | LosVmMapRegion * | region | ) |
LosVmMapRegion * LOS_RegionFind | ( | LosVmSpace * | vmSpace, |
VADDR_T | addr | ||
) |
查找线性区 根据起始地址在进程空间内查找是否存在
在文件 los_vm_map.c 第 414 行定义.
STATUS_T LOS_RegionFree | ( | LosVmSpace * | space, |
LosVmMapRegion * | region | ||
) |
释放进程空间指定线性区
复制线性区
劈开线性区
对线性区进行调整
删除线性区
根据指定参数范围[addr,addr+len] 释放用户空间中堆区所占用的物理内存
线性区是否支持扩展
解除一定范围的虚拟地址的映射关系
释放所有线性区
释放虚拟空间
释放虚拟空间,注意内核空间不能被释放掉,永驻内存
虚拟地址和size是否在空间
在进程空间中预留一块内存空间
实现从虚拟地址到物理地址的映射,将指定长度的物理地址区间与虚拟地址区间做映射,需提前申请物理地址区间
对外接口|释放内核堆空间内存
内核空间内存分配,申请小于16KiB的内存则通过堆内存池获取,否则申请多个连续物理页
申请具有对齐属性的内存,申请规则:申请小于16KiB的内存则通过堆内存池获取,否则申请多个连续物理页
重新分配内核内存空间
在文件 los_vm_map.c 第 694 行定义.
LosVmMapRegion * LOS_RegionRangeFind | ( | LosVmSpace * | vmSpace, |
VADDR_T | addr, | ||
size_t | len | ||
) |
STATIC INLINE VOID LOS_SetRegionTypeAnon | ( | LosVmMapRegion * | region | ) |
STATIC INLINE VOID LOS_SetRegionTypeDev | ( | LosVmMapRegion * | region | ) |
STATIC INLINE VOID LOS_SetRegionTypeFile | ( | LosVmMapRegion * | region | ) |
LosVmSpace * LOS_SpaceGet | ( | VADDR_T | vaddr | ) |
获取虚拟地址对应的进程空间结构体指针
在文件 los_vm_map.c 第 117 行定义.
STATUS_T LOS_VaddrToPaddrMmap | ( | LosVmSpace * | space, |
VADDR_T | vaddr, | ||
PADDR_T | paddr, | ||
size_t | len, | ||
UINT32 | flags | ||
) |
VOID LOS_VFree | ( | const VOID * | addr | ) |
VOID * LOS_VMalloc | ( | size_t | size | ) |
thread safety it is used to malloc continuous virtual memory, no sure for continuous physical memory.
STATUS_T LOS_VmSpaceClone | ( | LosVmSpace * | oldVmSpace, |
LosVmSpace * | newVmSpace | ||
) |
在文件 los_vm_map.c 第 318 行定义.
STATUS_T LOS_VmSpaceFree | ( | LosVmSpace * | space | ) |
STATUS_T LOS_VmSpaceReserve | ( | LosVmSpace * | space, |
size_t | size, | ||
VADDR_T | vaddr | ||
) |
VADDR_T OsAllocRange | ( | LosVmSpace * | vmSpace, |
size_t | len | ||
) |
分配指定长度的线性区
在文件 los_vm_map.c 第 436 行定义.
VADDR_T OsAllocSpecificRange | ( | LosVmSpace * | vmSpace, |
VADDR_T | vaddr, | ||
size_t | len, | ||
UINT32 | regionFlags | ||
) |
分配指定开始地址和长度的线性区
在文件 los_vm_map.c 第 485 行定义.
LosVmMapRegion * OsCreateRegion | ( | VADDR_T | vaddr, |
size_t | len, | ||
UINT32 | regionFlags, | ||
unsigned long | offset | ||
) |
创建一个线性区
在文件 los_vm_map.c 第 531 行定义.
LosVmSpace * OsCreateUserVmSpace | ( | VOID | ) |
创建用户进程空间
在文件 los_vm_map.c 第 281 行定义.
从外部权限标签转化为线性区权限标签
在文件 los_vm_map.h 第 197 行定义.
LosMux * OsGVmSpaceMuxGet | ( | VOID | ) |
VOID OsInitMappingStartUp | ( | VOID | ) |
OsInitMappingStartUp 开始初始化mmu
在文件 los_arch_mmu.c 第 1263 行定义.
BOOL OsInsertRegion | ( | LosRbTree * | regionRbTree, |
LosVmMapRegion * | region | ||
) |
向红黑树中插入线性区
在文件 los_vm_map.c 第 521 行定义.
STATUS_T OsIsRegionCanExpand | ( | LosVmSpace * | space, |
LosVmMapRegion * | region, | ||
size_t | size | ||
) |
STATIC INLINE BOOL OsIsVmRegionEmpty | ( | LosVmSpace * | vmSpace | ) |
VOID OsKSpaceInit | ( | VOID | ) |
内核虚拟空间初始化
在文件 los_vm_map.c 第 250 行定义.
STATUS_T OsRegionsRemove | ( | LosVmSpace * | space, |
VADDR_T | vaddr, | ||
size_t | size | ||
) |
STATUS_T OsUnMMap | ( | LosVmSpace * | space, |
VADDR_T | addr, | ||
size_t | size | ||
) |
INT32 OsUserHeapFree | ( | LosVmSpace * | vmSpace, |
VADDR_T | addr, | ||
size_t | len | ||
) |
BOOL OsUserVmSpaceInit | ( | LosVmSpace * | vmSpace, |
VADDR_T * | virtTtb | ||
) |
OsUserVmSpaceInit 用户空间的TTB表是动态申请得来,每个进程有属于自己的L1,L2表 初始化用户进程虚拟空间,主要划分数据区,堆区,映射区和创建mmu
virtTtb | |
vmSpace |
在文件 los_vm_map.c 第 265 行定义.
STATUS_T OsVmRegionAdjust | ( | LosVmSpace * | space, |
VADDR_T | vaddr, | ||
size_t | size | ||
) |
LosVmMapRegion * OsVmRegionDup | ( | LosVmSpace * | space, |
LosVmMapRegion * | oldRegion, | ||
VADDR_T | vaddr, | ||
size_t | size | ||
) |
STATUS_T OsVmSpaceRegionFree | ( | LosVmSpace * | space | ) |