32#ifndef __LOS_VM_PHYS_H__
33#define __LOS_VM_PHYS_H__
54#define VM_LIST_ORDER_MAX 9
55#define VM_PHYS_SEG_MAX 32
58#define min(x, y) ((x) < (y) ? (x) : (y))
61#define VM_PAGE_TO_PHYS(page) ((page)->physAddr)
62#define VM_ORDER_TO_PAGES(order) (1 << (order))
63#define VM_ORDER_TO_PHYS(order) (1 << (PAGE_SHIFT + (order)))
64#define VM_PHYS_TO_ORDER(phys) (min(LOS_LowBitGet((phys) >> PAGE_SHIFT), VM_LIST_ORDER_MAX - 1))
双向链表由内联函数实现 http://weharmonyos.com/openharmony/zh-cn/device-dev/kernel/kernel-small-apx-dll....
VOID * LOS_PhysPagesAllocContiguous(size_t nPages)
分配连续的物理页
VOID OsPhysSharePageCopy(PADDR_T oldPaddr, PADDR_T *newPaddr, LosVmPage *newPage)
拷贝共享页面
struct VmPhysSeg LosVmPhysSeg
物理段描述符
LosVmPage * OsVmPaddrToPage(paddr_t paddr)
OsLruList
Lru全称是Least Recently Used,即最近最久未使用的意思 针对匿名页和文件页各拆成对应链表。
@ VM_LRU_UNEVICTABLE
禁止换出的页
@ VM_LRU_ACTIVE_ANON
活动匿名页(swap)
@ VM_LRU_ACTIVE_FILE
活动文件页(磁盘)
@ VM_LRU_INACTIVE_FILE
非活动文件页(磁盘)
@ VM_LRU_INACTIVE_ANON
非活动匿名页(swap)
VOID LOS_PhysPageFree(LosVmPage *page)
释放一个物理页框
VOID OsVmPhysPagesFreeContiguous(LosVmPage *page, size_t nPages)
连续的释放物理页框, 如果8页连在一块是一起释放的
VOID LOS_PhysPagesFreeContiguous(VOID *ptr, size_t nPages)
释放指定页数地址连续的物理内存
size_t LOS_PhysPagesAlloc(size_t nPages, LOS_DL_LIST *list)
LOS_PhysPagesAlloc 分配nPages页个物理页框,并将页框挂入list 返回已分配的页面大小,不负责一定能分配到nPages的页框
struct VmPhysSeg g_vmPhysSeg[VM_PHYS_SEG_MAX]
物理内存采用段页式管理,先切段后伙伴算法页
PADDR_T OsKVaddrToPaddr(VADDR_T kvaddr)
struct VmPhysSeg * OsVmPhysSegGet(LosVmPage *page)
获取物理页框所在段
LosVmPage * OsVmPhysToPage(paddr_t pa, UINT8 segID)
通过物理地址获取所属参数段的物理页框
LosVmPage * LOS_PhysPageAlloc(VOID)
申请一个物理页
UINT32 OsVmPhysPageNumGet(VOID)
获得物理内存的总页数
LosVmPhysSeg * OsGVmPhysSegGet(VOID)
UINT32 OsVmPagesToOrder(size_t nPages)
获取参数nPages对应的块组,例如 7 -> 2^3 返回 3
VOID OsVmPhysSegAdd(VOID)
添加物理段
VOID OsVmPhysAreaSizeAdjust(size_t size)
段区域大小调整
size_t LOS_PhysPagesFree(LOS_DL_LIST *list)
释放双链表中的所有节点内存,本质是回归到伙伴orderlist中
LosVmPage * OsVmVaddrToPage(VOID *ptr)
通过虚拟地址找映射的物理页框
VOID OsVmPhysInit(VOID)
物理段初始化
VOID * OsVmPageToVaddr(LosVmPage *page)
通过page获取内核空间的虚拟地址 参考OsArchMmuInit #define SYS_MEM_BASE DDR_MEM_ADDR /* physical memory base 物理地址的起始...
VADDR_T * LOS_PaddrToKVaddr(PADDR_T paddr)
通过物理地址获取内核虚拟地址
LOS_DL_LIST node
双循环链表用于挂空闲物理内框节点,通过 VmPage->node 挂上来
物理页框描述符 虚拟内存体现的是程序对内存资源的需求,而物理内存是对该请求的供应。 伙伴算法的思想是:把内存中连续的空闲页框空间看成是空闲页框块,并按照它们的大小(连续页框的数目)分组
LOS_DL_LIST lruList[VM_NR_LRU_LISTS]
页面置换算法,5个双循环链表头,它们分别描述五中不同类型的链表
SPIN_LOCK_S lruLock
用于置换的自旋锁,用于操作lruList
size_t lruSize[VM_NR_LRU_LISTS]
5个双循环链表大小,如此方便得到size
struct VmFreeList freeList[VM_LIST_ORDER_MAX]