From f1ae720c6a723208c1c3b7eda4cc0137baaacca5 Mon Sep 17 00:00:00 2001 From: kuangyufei Date: Thu, 24 Dec 2020 11:51:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E8=A7=A3=E7=89=A9=E7=90=86=E5=86=85?= =?UTF-8?q?=E5=AD=98=E6=98=AF=E5=A6=82=E4=BD=95=E7=AE=A1=E7=90=86=E7=9A=84?= =?UTF-8?q?=3F=E4=BC=99=E4=BC=B4=E7=AE=97=E6=B3=95/LRU=E5=A6=82=E4=BD=95?= =?UTF-8?q?=E5=88=86=E9=85=8D/=E7=BD=AE=E6=8D=A2=E7=89=A9=E7=90=86?= =?UTF-8?q?=E9=A1=B5=E6=A1=86=3F=20=E6=90=9C=E7=B4=A2=20@note=5Fpic=20?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=9F=A5=E7=9C=8B=E5=85=A8=E9=83=A8=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E5=9B=BE=20=E6=90=9C=E7=B4=A2=20@note=5Fwhy=20?= =?UTF-8?q?=E6=98=AF=E6=B3=A8=E8=80=85=E5=B0=9A=E6=9C=AA=E7=9C=8B=E6=98=8E?= =?UTF-8?q?=E7=99=BD=E7=9A=84=E5=9C=B0=E6=96=B9=EF=BC=8C=E5=A6=82=E6=9E=9C?= =?UTF-8?q?=E6=82=A8=E7=9C=8B=E6=98=8E=E7=99=BD=E4=BA=86=EF=BC=8C=E8=AF=B7?= =?UTF-8?q?=E5=91=8A=E8=AF=89=E6=B3=A8=E8=80=85=E5=AE=8C=E5=96=84=20?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=20@note=5Fthinking=20=E6=98=AF=E6=B3=A8?= =?UTF-8?q?=E8=80=85=E7=9A=84=E6=80=9D=E8=80=83=E5=92=8C=E5=90=90=E6=A7=BD?= =?UTF-8?q?=E7=9A=84=E5=9C=B0=E6=96=B9=20=E6=90=9C=E7=B4=A2=20@note=5F#if0?= =?UTF-8?q?=20=E6=98=AF=E7=94=B1=E7=AC=AC=E4=B8=89=E6=96=B9=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=8F=90=E4=BE=9B=E4=B8=8D=E7=94=B1=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E6=BA=90=E7=A0=81=E4=B8=AD=E5=AE=9A=E4=B9=89=E7=9A=84=E6=9E=81?= =?UTF-8?q?=E4=B8=BA=E9=87=8D=E8=A6=81=E7=9A=84=E7=BB=93=E6=9E=84=E4=BD=93?= =?UTF-8?q?=EF=BC=8C=E4=B8=BA=E6=96=B9=E4=BE=BF=E7=90=86=E8=A7=A3=E8=80=8C?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9A=84=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/base/include/los_vm_page.h | 16 +- kernel/base/include/los_vm_phys.h | 25 +- kernel/base/vm/los_vm_page.c | 222 +++++++++--------- kernel/base/vm/los_vm_phys.c | 104 ++++---- zzz/git/push.sh | 2 +- ...0\345\205\263\347\263\273\345\233\276.png" | Bin 0 -> 85393 bytes 6 files changed, 193 insertions(+), 176 deletions(-) create mode 100644 "zzz/pic/turing/\347\211\251\347\220\206\351\241\265\346\241\206\344\270\216\347\211\251\347\220\206\345\206\205\345\255\230\345\205\263\347\263\273\345\233\276.png" diff --git a/kernel/base/include/los_vm_page.h b/kernel/base/include/los_vm_page.h index c3009206..f7ecb00d 100644 --- a/kernel/base/include/los_vm_page.h +++ b/kernel/base/include/los_vm_page.h @@ -42,16 +42,20 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ +/****************************************************************************** + 虚拟内存体现的是程序对内存资源的需求,而物理内存是对该请求的供应。 + 伙伴算法的思想是:把内存中连续的空闲页框空间看成是空闲页框块,并按照它们的大小(连续页框的数目)分组 +******************************************************************************/ //注意: vmPage 中并没有虚拟地址,只有物理地址 -typedef struct VmPage { //虚拟内存描述符 - LOS_DL_LIST node; /**< vm object dl list */ //虚拟内存节点,通过它挂到全局虚拟页上 +typedef struct VmPage { //物理页框描述符 + LOS_DL_LIST node; /**< vm object dl list */ //虚拟内存节点,通过它挂到全局g_vmPhysSeg[segID]->freeList[order]物理页框链表上 UINT32 index; /**< vm page index to vm object */ //索引位置 - PADDR_T physAddr; /**< vm page physical addr */ //物理地址 + PADDR_T physAddr; /**< vm page physical addr */ //物理页框起始物理地址,只能用于计算,不会用于操作(读/写数据==) Atomic refCounts; /**< vm page ref count */ //被引用次数,共享内存会被多次引用 - UINT32 flags; /**< vm page flags */ //页标签,(共享/引用/活动/被锁==) + UINT32 flags; /**< vm page flags */ //页标签,同时可以有多个标签(共享/引用/活动/被锁==) UINT8 order; /**< vm page in which order list */ //被安置在伙伴算法的几号序列( 2^0,2^1,2^2,...,2^order) - UINT8 segID; /**< the segment id of vm page */ //所在段ID - UINT16 nPages; /**< the vm page is used for kernel heap */ //vm页面用于内核堆 + UINT8 segID; /**< the segment id of vm page */ //所属段ID + UINT16 nPages; /**< the vm page is used for kernel heap */ //页总数,页大小4K的倍数 } LosVmPage; extern LosVmPage *g_vmPageArray;//物理内存所有页框(page frame)记录数组 diff --git a/kernel/base/include/los_vm_phys.h b/kernel/base/include/los_vm_phys.h index 25f1d17b..fbe05d62 100644 --- a/kernel/base/include/los_vm_phys.h +++ b/kernel/base/include/los_vm_phys.h @@ -43,8 +43,13 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ -#define VM_LIST_ORDER_MAX 9 -#define VM_PHYS_SEG_MAX 32 +/****************************************************************************** +LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的, +是根据页面调入内存后的使用情况进行决策了。由于无法预测各页面将来的使用情况,只能利用 +“最近的过去”作为“最近的将来”的近似,因此,LRU算法就是将最近最久未使用的页面予以淘汰。 +******************************************************************************/ +#define VM_LIST_ORDER_MAX 9 //伙伴算法分组,即物理内存层面一次最大分配 2^8 * 4K = 1M +#define VM_PHYS_SEG_MAX 32 //最大支持32个段 #ifndef min #define min(x, y) ((x) < (y) ? (x) : (y)) @@ -69,20 +74,20 @@ enum OsLruList {//Lru全称是Least Recently Used,即最近最久未使用的 VM_NR_LRU_LISTS }; -typedef struct VmPhysSeg { - PADDR_T start; /* The start of physical memory area */ - size_t size; /* The size of physical memory area */ - LosVmPage *pageBase; /* The first page address of this area */ +typedef struct VmPhysSeg {//物理段描述符 + PADDR_T start; /* The start of physical memory area */ //物理内存的开始地址 + size_t size; /* The size of physical memory area */ //物理内存的大小 + LosVmPage *pageBase; /* The first page address of this area */ //本段首个物理页框地址 - SPIN_LOCK_S freeListLock; /* The buddy list spinlock */ - struct VmFreeList freeList[VM_LIST_ORDER_MAX]; /* The free pages in the buddy list */ + SPIN_LOCK_S freeListLock; /* The buddy list spinlock */ //伙伴算法自旋锁,用于操作freeList上锁 + struct VmFreeList freeList[VM_LIST_ORDER_MAX]; /* The free pages in the buddy list */ //伙伴算法的分组,默认分成10组 2^0,2^1,...,2^VM_LIST_ORDER_MAX SPIN_LOCK_S lruLock;//置换锁 size_t lruSize[VM_NR_LRU_LISTS]; //5个双循环链表大小,如此方便得到size - LOS_DL_LIST lruList[VM_NR_LRU_LISTS]; //5个双循环链表头,它们分别描述五中不同类型的链表 + LOS_DL_LIST lruList[VM_NR_LRU_LISTS]; //页面置换算法,5个双循环链表头,它们分别描述五中不同类型的链表 } LosVmPhysSeg; -struct VmPhysArea { +struct VmPhysArea {//物理区描述,仅用于方案商区划分 PADDR_T start; size_t size; }; diff --git a/kernel/base/vm/los_vm_page.c b/kernel/base/vm/los_vm_page.c index cb5153c5..9a0f326a 100644 --- a/kernel/base/vm/los_vm_page.c +++ b/kernel/base/vm/los_vm_page.c @@ -1,111 +1,111 @@ -/* - * Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved. - * Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * 3. Neither the name of the copyright holder nor the names of its contributors may be used - * to endorse or promote products derived from this software without specific prior written - * permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, - * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "los_vm_page.h" -#include "los_vm_common.h" -#include "los_vm_phys.h" -#include "los_vm_boot.h" -#include "los_vm_filemap.h" - -#ifdef __cplusplus -#if __cplusplus -extern "C" { -#endif /* __cplusplus */ -#endif /* __cplusplus */ - -LosVmPage *g_vmPageArray = NULL; -size_t g_vmPageArraySize; -//虚拟页初始化 -STATIC VOID OsVmPageInit(LosVmPage *page, paddr_t pa, UINT8 segID) -{ - LOS_ListInit(&page->node); //页节点初始化 - page->flags = FILE_PAGE_FREE; //映射文件初始标识 - LOS_AtomicSet(&page->refCounts, 0); //引用次数0 - page->physAddr = pa; //物理地址 - page->segID = segID; //物理地址使用段管理,段ID - page->order = VM_LIST_ORDER_MAX; //所属伙伴算法块组 -} - -STATIC INLINE VOID OsVmPageOrderListInit(LosVmPage *page, size_t nPages) -{ - OsVmPhysPagesFreeContiguous(page, nPages);//释放页面使可用于伙伴算法分配 -} -// page初始化 -VOID OsVmPageStartup(VOID) -{ - struct VmPhysSeg *seg = NULL; - LosVmPage *page = NULL; - paddr_t pa; - UINT32 nPage; - INT32 segID; - - OsVmPhysAreaSizeAdjust(ROUNDUP((g_vmBootMemBase - KERNEL_ASPACE_BASE), PAGE_SIZE));//校正 g_physArea size - - nPage = OsVmPhysPageNumGet();//得到 g_physArea 总页数 - g_vmPageArraySize = nPage * sizeof(LosVmPage);//页表总大小 - g_vmPageArray = (LosVmPage *)OsVmBootMemAlloc(g_vmPageArraySize);//申请页表存放区域 - - OsVmPhysAreaSizeAdjust(ROUNDUP(g_vmPageArraySize, PAGE_SIZE));// g_physArea 变小 - - OsVmPhysSegAdd();// 段页绑定 - OsVmPhysInit();// 加入空闲链表和设置置换算法,LRU(最近最久未使用)算法 - - for (segID = 0; segID < g_vmPhysSegNum; segID++) { - seg = &g_vmPhysSeg[segID]; - nPage = seg->size >> PAGE_SHIFT; - for (page = seg->pageBase, pa = seg->start; page <= seg->pageBase + nPage; - page++, pa += PAGE_SIZE) { - OsVmPageInit(page, pa, segID);//page初始化 - } - OsVmPageOrderListInit(seg->pageBase, nPage);// 页面分配的排序 - } -} -//通过物理地址获取页框 -LosVmPage *LOS_VmPageGet(PADDR_T paddr) -{ - INT32 segID; - LosVmPage *page = NULL; - - for (segID = 0; segID < g_vmPhysSegNum; segID++) {//物理内存采用段页管理 - page = OsVmPhysToPage(paddr, segID);//通过物理地址和段ID找出物理页框 - if (page != NULL) { - break; - } - } - - return page; -} - -#ifdef __cplusplus -#if __cplusplus -} -#endif /* __cplusplus */ -#endif /* __cplusplus */ +/* + * Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved. + * Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * 3. Neither the name of the copyright holder nor the names of its contributors may be used + * to endorse or promote products derived from this software without specific prior written + * permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "los_vm_page.h" +#include "los_vm_common.h" +#include "los_vm_phys.h" +#include "los_vm_boot.h" +#include "los_vm_filemap.h" + +#ifdef __cplusplus +#if __cplusplus +extern "C" { +#endif /* __cplusplus */ +#endif /* __cplusplus */ + +LosVmPage *g_vmPageArray = NULL; +size_t g_vmPageArraySize; +//虚拟页初始化 +STATIC VOID OsVmPageInit(LosVmPage *page, paddr_t pa, UINT8 segID) +{ + LOS_ListInit(&page->node); //页节点初始化 + page->flags = FILE_PAGE_FREE; //页标签,初始为空闲页 + LOS_AtomicSet(&page->refCounts, 0); //引用次数0 + page->physAddr = pa; //物理地址 + page->segID = segID; //物理地址使用段管理,段ID + page->order = VM_LIST_ORDER_MAX; //所属伙伴算法块组 +} + +STATIC INLINE VOID OsVmPageOrderListInit(LosVmPage *page, size_t nPages) +{ + OsVmPhysPagesFreeContiguous(page, nPages);//释放页面使可用于伙伴算法分配 +} +// page初始化 +VOID OsVmPageStartup(VOID) +{ + struct VmPhysSeg *seg = NULL; + LosVmPage *page = NULL; + paddr_t pa; + UINT32 nPage; + INT32 segID; + + OsVmPhysAreaSizeAdjust(ROUNDUP((g_vmBootMemBase - KERNEL_ASPACE_BASE), PAGE_SIZE));//校正 g_physArea size + + nPage = OsVmPhysPageNumGet();//得到 g_physArea 总页数 + g_vmPageArraySize = nPage * sizeof(LosVmPage);//页表总大小 + g_vmPageArray = (LosVmPage *)OsVmBootMemAlloc(g_vmPageArraySize);//申请页表存放区域 + + OsVmPhysAreaSizeAdjust(ROUNDUP(g_vmPageArraySize, PAGE_SIZE));// g_physArea 变小 + + OsVmPhysSegAdd();// 完成对段的初始化,将段切成一页一页 + OsVmPhysInit();// 加入空闲链表和设置置换算法,LRU(最近最久未使用)算法 + + for (segID = 0; segID < g_vmPhysSegNum; segID++) { + seg = &g_vmPhysSeg[segID]; + nPage = seg->size >> PAGE_SHIFT; + for (page = seg->pageBase, pa = seg->start; page <= seg->pageBase + nPage; + page++, pa += PAGE_SIZE) { + OsVmPageInit(page, pa, segID);//page初始化 + } + OsVmPageOrderListInit(seg->pageBase, nPage);// 页面分配的排序 + } +} +//通过物理地址获取页框 +LosVmPage *LOS_VmPageGet(PADDR_T paddr) +{ + INT32 segID; + LosVmPage *page = NULL; + + for (segID = 0; segID < g_vmPhysSegNum; segID++) {//物理内存采用段页管理 + page = OsVmPhysToPage(paddr, segID);//通过物理地址和段ID找出物理页框 + if (page != NULL) { + break; + } + } + + return page; +} + +#ifdef __cplusplus +#if __cplusplus +} +#endif /* __cplusplus */ +#endif /* __cplusplus */ diff --git a/kernel/base/vm/los_vm_phys.c b/kernel/base/vm/los_vm_phys.c index f8fca82d..717d17c0 100644 --- a/kernel/base/vm/los_vm_phys.c +++ b/kernel/base/vm/los_vm_phys.c @@ -41,14 +41,17 @@ extern "C" { #endif /* __cplusplus */ #endif /* __cplusplus */ - +/****************************************************************************** +鸿蒙物理内存采用段页式管理 + +******************************************************************************/ #define ONE_PAGE 1 /* Physical memory area array */ -STATIC struct VmPhysArea g_physArea[] = {//这里只整了一个区域,即只生成一个段,鸿蒙物理内存采用段页式管理 +STATIC struct VmPhysArea g_physArea[] = {//这里只有一个区域,即只生成一个段 { - .start = SYS_MEM_BASE, //整个物理内存基地址 - .size = SYS_MEM_SIZE_DEFAULT,//整个物理内存总大小 + .start = SYS_MEM_BASE, //整个物理内存基地址,#define SYS_MEM_BASE DDR_MEM_ADDR , 0x80000000 + .size = SYS_MEM_SIZE_DEFAULT,//整个物理内存总大小 0x07f00000 }, }; @@ -59,21 +62,21 @@ LosVmPhysSeg *OsGVmPhysSegGet() { return g_vmPhysSeg; } -//初始化Lru置换 LRU list 在 VmPhysSeg中管理 +//初始化Lru置换链表 STATIC VOID OsVmPhysLruInit(struct VmPhysSeg *seg) { INT32 i; UINT32 intSave; - LOS_SpinInit(&seg->lruLock);//自旋锁,自旋锁用户CPU多核同步 + LOS_SpinInit(&seg->lruLock);//初始化自旋锁,自旋锁用于CPU多核同步 LOS_SpinLockSave(&seg->lruLock, &intSave); for (i = 0; i < VM_NR_LRU_LISTS; i++) { //五个双循环链表 - seg->lruSize[i] = 0; //记录链表节点数 - LOS_ListInit(&seg->lruList[i]);//初始化LRU链表 + seg->lruSize[i] = 0; //记录链表节点数 + LOS_ListInit(&seg->lruList[i]); //初始化LRU链表 } LOS_SpinUnlockRestore(&seg->lruLock, intSave); } -//创建物理段 +//创建物理段,由区划分转成段管理 STATIC INT32 OsVmPhysSegCreate(paddr_t start, size_t size) { struct VmPhysSeg *seg = NULL; @@ -82,7 +85,7 @@ STATIC INT32 OsVmPhysSegCreate(paddr_t start, size_t size) return -1; } - seg = &g_vmPhysSeg[g_vmPhysSegNum++]; + seg = &g_vmPhysSeg[g_vmPhysSegNum++];//拿到一段数据 for (; (seg > g_vmPhysSeg) && ((seg - 1)->start > (start + size)); seg--) { *seg = *(seg - 1); } @@ -91,15 +94,15 @@ STATIC INT32 OsVmPhysSegCreate(paddr_t start, size_t size) return 0; } - +//添加物理段 VOID OsVmPhysSegAdd(VOID) { INT32 i, ret; LOS_ASSERT(g_vmPhysSegNum <= VM_PHYS_SEG_MAX); - for (i = 0; i < (sizeof(g_physArea) / sizeof(g_physArea[0])); i++) {//将g_physArea转化成段 - ret = OsVmPhysSegCreate(g_physArea[i].start, g_physArea[i].size);//一个区对应一个段 + for (i = 0; i < (sizeof(g_physArea) / sizeof(g_physArea[0])); i++) {//遍历g_physArea数组 + ret = OsVmPhysSegCreate(g_physArea[i].start, g_physArea[i].size);//由区划分转成段管理 if (ret != 0) { VM_ERR("create phys seg failed"); } @@ -115,36 +118,36 @@ VOID OsVmPhysAreaSizeAdjust(size_t size) g_physArea[i].size -= size; } } - +//获得物理内存的总页数 UINT32 OsVmPhysPageNumGet(VOID) { UINT32 nPages = 0; INT32 i; for (i = 0; i < (sizeof(g_physArea) / sizeof(g_physArea[0])); i++) { - nPages += g_physArea[i].size >> PAGE_SHIFT;//右移12位,相当于除以4K,得出总页数 + nPages += g_physArea[i].size >> PAGE_SHIFT;//右移12位,相当于除以4K, 计算出总页数 } - return nPages; + return nPages;//返回所有物理内存总页数 } -//初始化空闲链表,分配页框使用伙伴算法 +//初始化空闲链表,分配物理页框使用伙伴算法 STATIC INLINE VOID OsVmPhysFreeListInit(struct VmPhysSeg *seg) { int i; UINT32 intSave; struct VmFreeList *list = NULL; - LOS_SpinInit(&seg->freeListLock);//自旋锁 + LOS_SpinInit(&seg->freeListLock);//初始化用于分配的自旋锁 LOS_SpinLockSave(&seg->freeListLock, &intSave); for (i = 0; i < VM_LIST_ORDER_MAX; i++) { list = &seg->freeList[i]; - LOS_ListInit(&list->node);//初始化9个链表 2^0,2^1,2^2 分配页框 ^代表次方的意思 - list->listCnt = 0; + LOS_ListInit(&list->node); //初始化9个链表, 链表上挂分配大小为 2^0,2^1,2^2 ..的页框(LosVmPage) + list->listCnt = 0; //链表上的数量默认0 } LOS_SpinUnlockRestore(&seg->freeListLock, intSave); } -//段初始化 +//物理段初始化 VOID OsVmPhysInit(VOID) { struct VmPhysSeg *seg = NULL; @@ -153,13 +156,13 @@ VOID OsVmPhysInit(VOID) for (i = 0; i < g_vmPhysSegNum; i++) { seg = &g_vmPhysSeg[i]; - seg->pageBase = &g_vmPageArray[nPages];// - nPages += seg->size >> PAGE_SHIFT;//偏移12位,因以页管理,本段总页数 + seg->pageBase = &g_vmPageArray[nPages];//记录本段首页物理页框地址 + nPages += seg->size >> PAGE_SHIFT;//偏移12位,按4K一页,算出本段总页数 OsVmPhysFreeListInit(seg); //初始化空闲链表,分配页框使用伙伴算法 OsVmPhysLruInit(seg); //初始化LRU置换链表 } } -//将页框挂入空闲链表,供分配 +//将页框挂入空闲链表,分配物理内存从空闲链表里拿 STATIC VOID OsVmPhysFreeListAdd(LosVmPage *page, UINT8 order) { struct VmPhysSeg *seg = NULL; @@ -169,14 +172,14 @@ STATIC VOID OsVmPhysFreeListAdd(LosVmPage *page, UINT8 order) LOS_Panic("The page segment id(%d) is invalid\n", page->segID); } - page->order = order;// page记录 块组号 + page->order = order;// page记录伙伴算法的组序号 seg = &g_vmPhysSeg[page->segID];//先找到所属段 list = &seg->freeList[order];//找到对应List LOS_ListTailInsert(&list->node, &page->node);//将page节点挂入链表 - list->listCnt++;//链表内的节点总数++ + list->listCnt++;//链表节点总数++ } - +//同上 STATIC VOID OsVmPhysFreeListAddUnsafe(LosVmPage *page, UINT8 order) { struct VmPhysSeg *seg = NULL; @@ -193,23 +196,23 @@ STATIC VOID OsVmPhysFreeListAddUnsafe(LosVmPage *page, UINT8 order) LOS_ListTailInsert(&list->node, &page->node); list->listCnt++; } - +//将物理页框从空闲链表上摘除,见于物理页框被分配的情况 STATIC VOID OsVmPhysFreeListDelUnsafe(LosVmPage *page) { struct VmPhysSeg *seg = NULL; struct VmFreeList *list = NULL; - if ((page->segID >= VM_PHYS_SEG_MAX) || (page->order >= VM_LIST_ORDER_MAX)) { + if ((page->segID >= VM_PHYS_SEG_MAX) || (page->order >= VM_LIST_ORDER_MAX)) {//等于VM_LIST_ORDER_MAX也不行,说明伙伴算法最大支持 2^8的分配 LOS_Panic("The page segment id(%u) or order(%u) is invalid\n", page->segID, page->order); } - seg = &g_vmPhysSeg[page->segID]; - list = &seg->freeList[page->order]; - list->listCnt--; - LOS_ListDelete(&page->node); - page->order = VM_LIST_ORDER_MAX; + seg = &g_vmPhysSeg[page->segID]; //找到物理页框对应的段 + list = &seg->freeList[page->order]; //根据伙伴算法组序号找到空闲链表 + list->listCnt--; //链表节点总数减一 + LOS_ListDelete(&page->node); //将自己从链表上摘除 + page->order = VM_LIST_ORDER_MAX; //告诉系统物理页框已不在空闲链表上, 已妙用于OsVmPhysPagesSpiltUnsafe的断言 } - +//同上 STATIC VOID OsVmPhysFreeListDel(LosVmPage *page) { struct VmPhysSeg *seg = NULL; @@ -226,19 +229,24 @@ STATIC VOID OsVmPhysFreeListDel(LosVmPage *page) page->order = VM_LIST_ORDER_MAX; } +/****************************************************************************** + 本函数很像卖猪肉的,拿一大块肉剁,先把多余的放回到小块肉堆里去. + oldOrder:原本要买 2^2肉 + newOrder:却找到个 2^8肉块 +******************************************************************************/ STATIC VOID OsVmPhysPagesSpiltUnsafe(LosVmPage *page, UINT8 oldOrder, UINT8 newOrder) { UINT32 order; LosVmPage *buddyPage = NULL; - for (order = newOrder; order > oldOrder;) { - order--; - buddyPage = &page[VM_ORDER_TO_PAGES(order)]; - LOS_ASSERT(buddyPage->order == VM_LIST_ORDER_MAX); - OsVmPhysFreeListAddUnsafe(buddyPage, order); + for (order = newOrder; order > oldOrder;) {//把肉剁碎的过程,把多余的肉块切成2^7,2^6...标准块, + order--;//逐一放回仓库,一直切到最后的2^2块 + buddyPage = &page[VM_ORDER_TO_PAGES(order)];//@note_why 先把多余的肉割出来,但 没有理解是怎么做到的? + LOS_ASSERT(buddyPage->order == VM_LIST_ORDER_MAX);//@note_why 同样没理解为什么能下这个断言 + OsVmPhysFreeListAddUnsafe(buddyPage, order);//将劈开的节点挂到对应序号的链表上 } } -//通过物理地址获取所属页面 +//通过物理地址获取所属物理页框 LosVmPage *OsVmPhysToPage(paddr_t pa, UINT8 segID) { struct VmPhysSeg *seg = NULL; @@ -252,7 +260,7 @@ LosVmPage *OsVmPhysToPage(paddr_t pa, UINT8 segID) return NULL; } - offset = pa - seg->start;//得到偏移地址 + offset = pa - seg->start;//得到物理地址的偏移量 return (seg->pageBase + (offset >> PAGE_SHIFT));//得到第n页page } @@ -286,7 +294,7 @@ LosVmPage *OsVmVaddrToPage(VOID *ptr) return NULL; } -//从段中分配指定页框数 +//从参数段中分配参数页数 LosVmPage *OsVmPhysPagesAlloc(struct VmPhysSeg *seg, size_t nPages) { struct VmFreeList *list = NULL; @@ -297,22 +305,22 @@ LosVmPage *OsVmPhysPagesAlloc(struct VmPhysSeg *seg, size_t nPages) if ((seg == NULL) || (nPages == 0)) { return NULL; } - + //因为伙伴算法分配单元是 1,2,4,8 页,比如nPages = 3时,就需要从 4号空闲链表中分,剩余的1页需要劈开放到1号空闲链表中 order = OsVmPagesToOrder(nPages);//根据页数计算出用哪个块组 if (order < VM_LIST_ORDER_MAX) {//order不能大于9 即:256*4K = 1M 可理解为向内核堆申请内存一次不能超过1M for (newOrder = order; newOrder < VM_LIST_ORDER_MAX; newOrder++) {//没有就找更大块 list = &seg->freeList[newOrder];//从最合适的块处开始找 - if (LOS_ListEmpty(&list->node)) {//没找到 + if (LOS_ListEmpty(&list->node)) {//理想情况链表为空,说明没找到 continue;//继续找更大块的 } - page = LOS_DL_LIST_ENTRY(LOS_DL_LIST_FIRST(&list->node), LosVmPage, node);//找到 + page = LOS_DL_LIST_ENTRY(LOS_DL_LIST_FIRST(&list->node), LosVmPage, node);//找第一个节点就行,因为链表上挂的都是同样大小物理页框 goto DONE; } } return NULL; DONE: - OsVmPhysFreeListDelUnsafe(page); - OsVmPhysPagesSpiltUnsafe(page, order, newOrder); + OsVmPhysFreeListDelUnsafe(page);//将物理页框从链表上摘出来 + OsVmPhysPagesSpiltUnsafe(page, order, newOrder);//将物理页框劈开,把用不了的页再挂到对应的空闲链表上 return page; } //释放物理页,所谓释放物理页就是把页挂到空闲链表中 diff --git a/zzz/git/push.sh b/zzz/git/push.sh index 973750ba..501615a4 100644 --- a/zzz/git/push.sh +++ b/zzz/git/push.sh @@ -1,5 +1,5 @@ git add -A -git commit -m '文件如何被分页读到页高速缓存,脏页数据又如何回写? +git commit -m '注解物理内存是如何管理的?伙伴算法/LRU如何分配/置换物理页框? 搜索 @note_pic 可以查看全部字符图 搜索 @note_why 是注者尚未看明白的地方,如果您看明白了,请告诉注者完善 搜索 @note_thinking 是注者的思考和吐槽的地方 diff --git "a/zzz/pic/turing/\347\211\251\347\220\206\351\241\265\346\241\206\344\270\216\347\211\251\347\220\206\345\206\205\345\255\230\345\205\263\347\263\273\345\233\276.png" "b/zzz/pic/turing/\347\211\251\347\220\206\351\241\265\346\241\206\344\270\216\347\211\251\347\220\206\345\206\205\345\255\230\345\205\263\347\263\273\345\233\276.png" new file mode 100644 index 0000000000000000000000000000000000000000..15c6257efc7c96994a50423fdfc8aea1fb2a675f GIT binary patch literal 85393 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