57#ifndef __LOS_VM_FILEMAP_H__
58#define __LOS_VM_FILEMAP_H__
130#define PGOFF_MAX 2000
131#define MAX_SHRINK_PAGECACHE_TRY 2
132#define VM_FILEMAP_MAX_SCAN (SYS_MEM_SIZE_DEFAULT >> PAGE_SHIFT)
133#define VM_FILEMAP_MIN_SCAN 32
212 return (page->
n_maps != 0);
258#ifdef LOSCFG_DEBUG_VERSION
VOID LOS_BitmapSet(UINT32 *bitmap, UINT16 pos)
对状态字的某一标志位进行置1操作
VOID LOS_BitmapClr(UINT32 *bitmap, UINT16 pos)
对状态字的某一标志位进行清0操作
unsigned long VM_OFFSET_T
STATIC INLINE VOID OsSetPageActive(LosVmPage *page)
给页面贴上活动的标签
VOID OsDeletePageCacheLru(LosFilePage *page)
删除页高速缓存和LRU,对应 OsAddToPageacheLru
OsPageFlags
Flags由 bitmap 管理
@ FILE_PAGE_REFERENCED
被引用页
VOID OsPageRefDecNoLock(LosFilePage *page)
STATIC INLINE VOID OsSetPageFree(LosVmPage *page)
给页面贴上被释放的标签
LosMapInfo * OsGetMapInfo(LosFilePage *page, LosArchMmu *archMmu, VADDR_T vaddr)
通过虚拟地址获取文件页映射信息,archMmu每个进程都有属于自己的mmu
VOID OsFileCacheFlush(struct page_mapping *mapping)
文件缓存冲洗,把所有fpage冲洗一边,把脏页洗到dirtyList中,配合OsFileCacheRemove理解
VOID OsPageRefIncLocked(LosFilePage *page)
VOID OsLruCacheAdd(LosFilePage *fpage, enum OsLruList lruType)
VOID OsAddMapInfo(LosFilePage *page, LosArchMmu *archMmu, VADDR_T vaddr)
STATIC INLINE VOID OsCleanPageReferenced(LosVmPage *page)
给页面撕掉被引用的标签
INT32 OsVfsFileMmap(struct file *filep, LosVmMapRegion *region)
STATIC INLINE VOID OsCleanPageDirty(LosVmPage *page)
给页面撕掉数据被修改的标签
VOID OsMarkPageDirty(LosFilePage *fpage, LosVmMapRegion *region, int off, int len)
STATIC INLINE VOID OsCleanPageFree(LosVmPage *page)
给页面撕掉被释放的标签
STATIC INLINE VOID OsSetPageLRU(LosVmPage *page)
给页面贴上置换页的标签
struct file_map * GetFileMappingList(void)
STATIC INLINE VOID OsCleanPageLocked(LosVmPage *page)
给页面撕掉被锁的标签
STATIC INLINE VOID OsSetPageDirty(LosVmPage *page)
给页面贴上数据被修改的标签
VOID OsUnmapAllLocked(LosFilePage *page)
解除文件页在所有进程的映射
VOID OsLruCacheDel(LosFilePage *fpage)
VOID OsVmmFileRegionFree(struct file *filep, LosProcessCB *processCB)
VOID OsDoFlushDirtyPage(LosFilePage *fpage)
冲洗脏页数据,将脏页数据回写磁盘
STATIC INLINE VOID OsCleanPageShared(LosVmPage *page)
给页面撕掉共享页标签
STATIC INLINE BOOL OsIsPageMapped(LosFilePage *page)
文件页是否映射过了
STATIC INLINE BOOL OsIsPageActive(LosVmPage *page)
页面是否活动
STATIC INLINE BOOL OsIsPageDirty(LosVmPage *page)
页面是否为脏页,所谓脏页就是页内数据是否被更新过,只有脏页才会有写时拷贝
LosFilePage * OsPageCacheAlloc(struct page_mapping *mapping, VM_OFFSET_T pgoff)
struct FilePage LosFilePage
文件页结构体
VOID OsUnmapPageLocked(LosFilePage *page, LosMapInfo *info)
STATIC INLINE BOOL OsIsPageShared(LosVmPage *page)
是否为共享页
int OsTryShrinkMemory(size_t nPage)
VOID OsDelMapInfo(LosVmMapRegion *region, LosVmPgFault *pgFault, BOOL cleanDirty)
删除映射信息
STATIC INLINE VOID OsSetPageShared(LosVmPage *page)
STATIC INLINE VOID OsSetPageLocked(LosVmPage *page)
给页面贴上被锁的标签
VOID ResetPageCacheHitInfo(int *try, int *hit)
STATIC INLINE BOOL OsIsPageReferenced(LosVmPage *page)
页面是否被引用,只被一个进程引用的页叫私有页,多个进程引用就是共享页,此为共享内存的本质所在
VOID OsFileCacheRemove(struct page_mapping *mapping)
struct MapInfo LosMapInfo
虚拟地址和文件页的映射信息,在一个进程使用文件页之前,需要提前做好文件页在此内存空间的映射关系,如此通过虚拟内存就可以对文件页读写操作.
STATIC INLINE VOID OsSetPageReferenced(LosVmPage *page)
给页面贴上被引用的标签
STATIC INLINE VOID OsCleanPageActive(LosVmPage *page)
给页面撕掉活动的标签
LosFilePage * OsFindGetEntry(struct page_mapping *mapping, VM_OFFSET_T pgoff)
STATIC INLINE BOOL OsIsPageLocked(LosVmPage *page)
页面是否被锁
STATUS_T OsNamedMMap(struct file *filep, LosVmMapRegion *region)
LosFilePage * OsDumpDirtyPage(LosFilePage *oldPage)
备份脏页,老脏页撕掉脏页标签
OsLruList
Lru全称是Least Recently Used,即最近最久未使用的意思 针对匿名页和文件页各拆成对应链表。
内存管理单元(英语:memory management unit,缩写为MMU),有时称作分页内存管理单元(英语:paged memory management unit,缩写为PMMU)。
LOS_DL_LIST lru
lru节点, 结合 LosVmPhysSeg: LOS_DL_LIST lruList[VM_NR_LRU_LISTS] 理解
struct VmPage * vmPage
物理页框
struct VmPhysSeg * physSeg
VM_OFFSET_T pgoff
页标,文件被切成一页一页读到内存
struct page_mapping * mapping
此结构由文件系统提供,用于描述装入点 见于 ..\third_party\NuttX\fs\fs.h
LOS_DL_LIST node
节点,节点挂到page_mapping.page_list上,链表以 pgoff 从小到大方式排序.
虚拟地址和文件页的映射信息,在一个进程使用文件页之前,需要提前做好文件页在此内存空间的映射关系,如此通过虚拟内存就可以对文件页读写操作.
LosFilePage * page
文件页中只记录物理地址,是不会变的.但它是需要被多个进程访问,和映射的.
VADDR_T vaddr
虚拟地址.每个进程访问同一个文件页的虚拟地址都是不一样的
LosArchMmu * archMmu
mmu完成vaddr和page->vmPage->physAddr物理地址的映射
LOS_DL_LIST node
节点,挂到page->i_mmap链表上.链表上记录要操作文件页的进程对这个page的映射信息
物理页框描述符 虚拟内存体现的是程序对内存资源的需求,而物理内存是对该请求的供应。 伙伴算法的思想是:把内存中连续的空闲页框空间看成是空闲页框块,并按照它们的大小(连续页框的数目)分组
vnode并不包含文件名,因为 vnode和文件名是 1:N 的关系
struct page_mapping mapping
每个文件都有唯一的page_mapping标识其在内存的身份
LOS_DL_LIST head
链表节点,用于挂到g_file_mapping上
unsigned long flags
@note_why 全量代码中也没查到源码中对其操作