当前位置: 首页 > news >正文

南昌网站网站建设深圳龙岗是不是很落后

南昌网站网站建设,深圳龙岗是不是很落后,网页策划案的范文,如何做流量充值网站如何初始化物理内存#xff1f; 鸿蒙内核物理内存采用了段页式管理#xff0c;先看两个主要结构体。结构体的每个成员变量的含义都已经注解出来#xff0c;请结合源码理解. #define VM_LIST_ORDER_MAX 9 //伙伴算法分组数量#xff0c;从 2^0#xff0c;2^1#…如何初始化物理内存 鸿蒙内核物理内存采用了段页式管理先看两个主要结构体。结构体的每个成员变量的含义都已经注解出来请结合源码理解. #define VM_LIST_ORDER_MAX    9    //伙伴算法分组数量从 2^02^1...2^8 (256*4K)1M  #define VM_PHYS_SEG_MAX    32    //最大支持32个段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 */ //伙伴算法自旋锁用于操作freeList上锁struct VmFreeList freeList[VM_LIST_ORDER_MAX]; /* The free pages in the buddy list */ //伙伴算法的分组默认分成10组 2^02^1...2^VM_LIST_ORDER_MAXSPIN_LOCK_S lruLock; //用于置换的自旋锁用于操作lruListsize_t lruSize[VM_NR_LRU_LISTS]; //5个双循环链表大小如此方便得到sizeLOS_DL_LIST lruList[VM_NR_LRU_LISTS]; //页面置换算法5个双循环链表头它们分别描述五中不同类型的链表 } LosVmPhysSeg;//注意: vmPage 中并没有虚拟地址只有物理地址 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 */ //物理页框起始物理地址只能用于计算不会用于操作(读/写数据)Atomic refCounts; /** vm page ref count */ //被引用次数共享内存会被多次引用UINT32 flags; /** vm page flags */ //页标签同时可以有多个标签共享/引用/活动/被锁UINT8 order; /** vm page in which order list */ //被安置在伙伴算法的几号序列( 2^02^12^2...2^order)UINT8 segID; /** the segment id of vm page */ //所属段IDUINT16 nPages; /** the vm page is used for kernel heap */ //分配页数标识从本页开始连续的几页将一块被分配 } LosVmPage;//注意:关于nPages和order的关系说明当请求分配为5页时order是等于3的因为只有2^3才能满足5页的请求理解它们是理解物理内存管理的关键尤其是 LosVmPage 鸿蒙内存模块代码通篇都能看到它的影子。内核默认最大允许管理 32 个段. 段页式管理简单说就是先将物理内存切成一段段每段再切成单位为 4K 的物理页框 页是在内核层的操作单元 物理内存的分配置换缺页内存共享文件高速缓存的读写都是以页为单位的所以 LosVmPage 很重要很重要 结构体的每个变量代表了一个个的功能点 结构体中频繁了出现 LOS_DL_LIST 的身影双向链表是鸿蒙内核最重要的结构体在系列篇开篇就专门讲过它的重要性. 再比如 LosVmPage.refCounts 页被引用的次数可理解被进程拥有的次数当 refCounts 大于 1 时被多个进程所拥有说明这页就是共享页。当等于 0 时说明没有进程在使用了这时就可以被释放了. 看到这里熟悉 JAVA 的同学是不是似曾相识这像是 Java 的内存回收机制。在内核层面引用的概念不仅仅适用于内存模块也适用于其他模块比如文件 / 设备模块同样都存在共享的场景。这些模块不在这里展开说后续有专门的章节细讲. 段一开始是怎么划分的需要方案提供商手动配置存在静态的全局变量中鸿蒙默认只配置了一段. struct VmPhysSeg g_vmPhysSeg[VM_PHYS_SEG_MAX];//物理段数组最大32段 INT32 g_vmPhysSegNum 0; //总段数 LosVmPage *g_vmPageArray NULL;//物理页框数组 size_t g_vmPageArraySize;//总物理页框数/* Physical memory area array */ STATIC struct VmPhysArea g_physArea[] {//这里只有一个区域即只生成一个段{.start SYS_MEM_BASE //整个物理内存基地址#define SYS_MEM_BASE DDR_MEM_ADDR 0x80000000.size SYS_MEM_SIZE_DEFAULT//整个物理内存总大小 0x07f00000} }; 有了段和这些全局变量就可以对内存初始化了. OsVmPageStartup 是对物理内存的初始化 它被整个系统内存初始化 OsSysMemInit 所调用.  直接上代码. /******************************************************************************完成对物理内存整体初始化本函数一定运行在实模式下1.申请大块内存g_vmPageArray存放LosVmPage按4K一页划分物理内存存放在数组中. ******************************************************************************/ 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 sizenPage OsVmPhysPageNumGet();//得到 g_physArea 总页数g_vmPageArraySize nPage * sizeof(LosVmPage);//页表总大小g_vmPageArray (LosVmPage *)OsVmBootMemAlloc(g_vmPageArraySize);//实模式下申请内存此时还没有初始化MMUOsVmPhysAreaSizeAdjust(ROUNDUP(g_vmPageArraySize PAGE_SIZE));//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);//对物理页框进行初始化注意每页的物理地址都不一样}OsVmPageOrderListInit(seg-pageBase nPage);//伙伴算法初始化将所有页加入空闲链表供分配} }结合中文注释代码很好理解 此番操作之后全局变量里的值就都各就各位了可以开始工作了. 如何分配 / 回收物理内存 答案是伙伴算法 伙伴算法系列篇中有说过好几篇这里再看图理解下什么伙伴算法伙伴算法注重物理内存的连续性注意是连续性 结合图比如要分配 4 (2^2) 页16k的内存空间算法会先从 free_area2 中查看 free 链表是否为空如果有空闲块则从中分配如果没有空闲块就从它的上一级 free_area3每块 32K中分配出 16K并将多余的内存16K加入到 free_area2 中去。如果 free_area3 也没有空闲则从更上一级申请空间依次递推直到 free_area max_order如果顶级都没有空间那么就报告分配失败。 释放是申请的逆过程当释放一个内存块时先在其对于的 free_area 链表中查找是否有伙伴存在如果没有伙伴块直接将释放的块插入链表头。如果有或板块的存在则将其从链表摘下合并成一个大块然后继续查找合并后的块在更大一级链表中是否有伙伴的存在直至不能合并或者已经合并至最大块 2^max_order 为止。 看过系列篇文章的可能都发现了笔者喜欢用讲故事和打比方来说明内核运作机制 为了更好的理解同样打个比方 笔者认为伙伴算法很像是卖标准猪肉块的算法. 物理内存是一整头猪已经切成了 1 斤 1 斤的了但是还都连在一起每一斤上都贴了个标号 而且老板只按 1 斤 (2^0) 2 斤 (2^1) 4 斤 (2^2)…256 斤 (2^8) 的方式来卖。售货柜上分成了 9 组 张三来了要 7 斤猪肉怎么办 ** 给 8 斤注意是给 8 斤啊 因为它要严格按它的标准来卖.** 张三如果归还了查看现有 8 斤组里有没有序号能连在一块的有的话 2 个 8 斤合成 16 斤放到 16 斤组里去. 如果没有这 8 斤猪肉将挂到上图中第 2 组 (2^3) 再卖. 大家脑海中有画面了吗那么问题来了它为什么要这么卖猪肉好处是什么简单啊至少两个好处: 第一卖肉速度快效率高标准化的东西最好卖了. 第二可防止碎肉太多后面的人想买大块的猪肉买不到了. 请仔细想想是不是这样的如果每次客户来了要多少就割多少出去运行一段时候后你还能买到 10 斤连在一块的猪肉吗 很可能给是一包碎肉里面甚至还有一两一两的边角肉碎肉的结果必然是管理麻烦效率低啊。如果按伙伴算法的结果是运行一段时候后图中 012 各组中都有可卖的猪肉啊张三哥归还了那 8 斤 (其实他指向要 7 斤) 猪肉王五兄弟来了要 6 斤直接把张三哥归还的给王五就行了。效率极高. 那么问题又来了凡事总有两面性它的坏处是什么 也简单啊至少两个坏处: 第一浪费了白给的三斤对王五没用啊浪费的问题有其他办法解决但不是在这个层面去解决而是由 slab 分配器解决这里不重点说后续会专门讲 slab 分配器是如何解决这个问题的. 第二合并要求太严格了一定得是伙伴 (连续) 才能合并成更大的块。这样也会导致时间久了很难有大块的连续性的猪肉块. 比方打完了鸿蒙内核是如何实现卖肉算法的呢 请看代码 LosVmPage *OsVmPhysPagesAlloc(struct VmPhysSeg *seg size_t nPages) {struct VmFreeList *list NULL;LosVmPage *page NULL;UINT32 order;UINT32 newOrder;if ((seg NULL) || (nPages 0)) {return NULL;}//因为伙伴算法分配单元是 1248 页比如nPages 3时就需要从 4号空闲链表中分剩余的1页需要劈开放到1号空闲链表中order OsVmPagesToOrder(nPages);//根据页数计算出用哪个块组if (order VM_LIST_ORDER_MAX) {//order不能大于9 即:256*4K 1M 可理解为向内核堆申请内存一次不能超过1Mfor (newOrder order; newOrder VM_LIST_ORDER_MAX; newOrder) {//没有就找更大块list seg-freeList[newOrder];//从最合适的块处开始找if (LOS_ListEmpty(list-node)) {//理想情况链表为空说明没找到continue;//继续找更大块的}page LOS_DL_LIST_ENTRY(LOS_DL_LIST_FIRST(list-node) LosVmPage node);//找第一个节点就行因为链表上挂的都是同样大小物理页框goto DONE;}}return NULL; DONE:OsVmPhysFreeListDelUnsafe(page);//将物理页框从链表上摘出来OsVmPhysPagesSpiltUnsafe(page order newOrder);//将物理页框劈开把用不了的页再挂到对应的空闲链表上return page; }/******************************************************************************本函数很像卖猪肉的拿一大块肉剁先把多余的放回到小块肉堆里去.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;) {//把肉剁碎的过程把多余的肉块切成2^72^6...标准块order--;//越切越小逐一挂到对应的空闲链表上buddyPage page[VM_ORDER_TO_PAGES(order)];//note_good 先把多余的肉割出来这句代码很赞!因为LosVmPage本身是在一个大数组上page[nPages]可直接定位LOS_ASSERT(buddyPage-order VM_LIST_ORDER_MAX);//没挂到伙伴算法对应组块空闲链表上的物理页框的order必须是VM_LIST_ORDER_MAXOsVmPhysFreeListAddUnsafe(buddyPage order);//将劈开的节点挂到对应序号的链表上buddyPage-order order} } 为了方便理解代码细节 这里说一种情况: 比如三哥要买 3 斤的发现 4 斤8 斤的都没有了只有 16 斤的怎么办 注意不会给 16 斤只会给 4 斤。这时需要把肉劈开劈成 844其中 4 斤给张三哥将剩下的 8 斤4 斤挂到对应链表上. OsVmPhysPagesSpiltUnsafe 干的就是劈猪肉的活. 伙伴算法的链表是怎么初始化的再看段代码 //初始化空闲链表分配物理页框使用伙伴算法 STATIC INLINE VOID OsVmPhysFreeListInit(struct VmPhysSeg *seg) {int i;UINT32 intSave;struct VmFreeList *list NULL;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); //LosVmPage.node将挂到list-node上list-listCnt 0; //链表上的数量默认0}LOS_SpinUnlockRestore(seg-freeListLock intSave); } 为了能让大家更好的学习鸿蒙HarmonyOS NEXT开发技术这边特意整理了《鸿蒙开发学习手册》共计890页希望对大家有所帮助https://qr21.cn/FV7h05 《鸿蒙开发学习手册》 如何快速入门https://qr21.cn/FV7h05 基本概念构建第一个ArkTS应用…… 开发基础知识https://qr21.cn/FV7h05 应用基础知识配置文件应用数据管理应用安全管理应用隐私保护三方应用调用管控机制资源分类与访问学习ArkTS语言…… 基于ArkTS 开发https://qr21.cn/FV7h05 Ability开发UI开发公共事件与通知窗口管理媒体安全网络与链接电话服务数据管理后台任务(Background Task)管理设备管理设备使用信息统计DFX国际化开发折叠屏系列…… 鸿蒙开发面试真题含参考答案https://qr18.cn/F781PH 鸿蒙开发面试大盘集篇共计319页https://qr18.cn/F781PH 1.项目开发必备面试题 2.性能优化方向 3.架构方向 4.鸿蒙开发系统底层方向 5.鸿蒙音视频开发方向 6.鸿蒙车载开发方向 7.鸿蒙南向开发方向
http://www.zqtcl.cn/news/878676/

相关文章:

  • 小型网站建设费用云南网站建设企业推荐
  • 设备租赁业务网站如何做看板娘 wordpress
  • 上海网站设计工作室二手交易网站建设目标
  • 深圳智能响应网站建设平面设计基础教程
  • 网站建设 推广全流程案例分析网站
  • 企业建网站多少钱怎样做网站挣钱
  • 经营性质的网站asp.ne做网站
  • 天津都有哪些制作网站开网站挣不挣钱
  • 网站建设云技术公司推荐重庆网页设计培训
  • 做房产网站不备案可以吗北京爱空间装修公司
  • 手机网站是用什么开发的厦门公司网站制作流程
  • 网站是广西住房和城乡建设厅wordpress插件数据库存在哪
  • 网站图片如何做链接网站制作及管理教程
  • 企业建立企业网站有哪些优势?app下载排行榜
  • 广州天河网站建设gif在线制作
  • 建个大型网站要多少钱小程序开发公司简介
  • 定制建设网站商洛做网站的公司
  • 网站建设目标活动策划书模板
  • 手机网站空间申请做网站需要空间跟域名吗
  • 洛阳专业网站设计开发制作建站公司长沙网站制作app开发公司
  • 王也个人资料网页网络优化
  • 公司网站制作工作室如何重装一下wordpress
  • 域名服务商网站建一个网站多少钱
  • 北京哪家制作网站好淄博优化推广
  • 许昌网站建设科技公司公司查询网站查询系统
  • 老网站权重低的原因网站建设公司使用图片侵权使用者有无责任
  • 邹城网站建设网站建设要注意什么
  • 图片在线制作表情合肥网站推广优化
  • 哈尔滨网站建设网站分成几种类型
  • 网站怎么添加二级域名全栈网站开发