0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙内核源码分析:内存管理在管什么?

鸿蒙系统HarmonyOS 来源:my.oschina 作者:my.oschina 2021-04-24 09:38 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

请想一个问题,内核本身也是程序要在内存运行,用户程序一样也要在内存运行,大家都在一个窝里吃饭,你凭什么就管我了.好像内核程序是主子,用户程序是奴才似的.

哎!其实用户进程就是内核的一个个奴才,被捏的死死的.按不住奴才那这主子就不合格,就不是一个稳定系统.请想想实际内存就这么点大,如何满足众多用户进程的需求?内核空间和用户空间如何隔离? 如何防止访问乱串? 如何分配/释放,防止碎片化?空间不够了又如何置换到硬盘?想想头都大了。内核这当家的主子真是不容易,这些都是他要解决的问题, 但欲戴其冠,必承其重.

先说如果没有内存管理会怎样?

那就是个奴才们能把主子给活活踩死,想想主奴不分,吃喝拉撒睡都在一起,称兄道弟的想干啥?没规矩不成方圆嘛,这事业肯定搞不大,单片机时代就是这种情况.裸机编程,指针可以随便乱飞,数据可以随意覆盖,没有划定边界,没有明确职责,没有特权指令,没有地址保护,你还想像java开发一样,只管new内存,不去释放,应用可以随便崩但系统跑的妥妥的?想的美!直接系统死机,甚至开机都开不了,主板直接报废了. 所以不能运行很复杂的程序,尽量可控,而且更是不可能支持应用的动态加载运行.队伍大了就不好带了,方法得换,游击队的做法不适合规模作战,内存就需要管理了,而且是 5A级的严格管理。

内存管理在管什么?

简单说就是给主子赋能,拥有超级权利,为什么就他有? 因为他先来,掌握了先机.它定好了游戏规则,你们来玩.有哪些游戏规则?

第一: 主奴有别,主子即是裁判又是运动员,主子有主子地方,奴才们有奴才们待的地方,主子可以在你的空间走来走去,但你只能在主人划定的区域活动.奴才把自己玩崩了也只是奴才狗屁了,但主人和其他人还会是好好的.主子有所有特权,比如某个奴才太嚣张了,就直接拖到午门问斩。

第二:奴奴有分,奴才们基本都是平等的,虽有高级和低级奴才区分,但本质都是奴才。奴才之间是不能随意勾连,登门问客的,防止一块搞政变. 他们都有属于自己的活动空间,而且活动空间还巨大巨大,大到奴才们觉得整个紫荆城都是他们家的,给你这么大空间你干活才有动力,奴才们是铆足了劲一个个尽情的表演各种剧本,有玩电子商务的,有玩游戏的,有搞直播的等等。。。不愧是紫荆城的主人很有一套,明明只有一个紫禁城,硬被他整出了N个紫荆城的感觉。而且这套驾奴本领还取了个很好听的名字叫:虚拟内存。

看图:

pIYBAGCDd-2APVJ1AALOmCSjDy4104.png

这是整个紫荆城的全貌图,里面的内核虚拟空间是主人专用的,里面放的是主人的资料,数据,奴才永远进不去,kernel heap也是给主人专用的动态内存空间,管理奴才和日常运作开销很多时候需要动态申请内存,这个是专门用来提供给主人使用的。而所有奴才的空间都在叫用户空间的那一块。你没看错,是所有奴才的都在那。当然实际情况是用户空间比图中的大的多,因为主人其实用不了多少空间,大部分是留给奴才们干活用了,因为篇幅的限制笔者把用户空间压缩了下。再来看看奴才空间是啥样的。看图

o4YBAGCDd_2ARGmUAAKMc9UqTGQ639.png

这张图是第一张图的局部用户空间放大图。里面放的是奴才的私人用品,数据,task运行栈区,动态分配内存的堆区,堆区自下而上,栈区自上而下中间由映射区(L1,L2表)隔开。这么多奴才在里面不挤吗?答案是:真不挤 。主人手眼通天,因为用了一个好帮手解决了这个问题,这个帮手名叫MMU(李大总管)

MMU是干什么事的?

看下某度对MMU定义:它是一种负责处理中央处理器CPU)的内存访问请求的计算机硬件。它的功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制。通过它的一番操作,把物理空间成倍成倍的放大,他们之间的映射关系存放在页面中。

好像看懂又好像没看懂是吧,到底是干啥的?其实就是个地址映射登记中心。记住这两个字:映射 看下图

o4YBAGCDeA-ASRt1AAGgDwa5dNs544.png

物理内存可以理解为真实世界的紫禁城,虚拟内存就是被MMU虚拟出来的比物理页面大的多的空间。举例说明大概说明下过程:

有A(厨师),B(文艺青年)两个奴才来到紫禁城,每个人都很有抱负,主子规定要先跑去登记处登记活动范围,领回来一张表叫L1页表,上面说了大半个紫禁城你可以跑动,都是你的,L1页表记录你每个房间的编号。其实奴才们的表都一样,能跑的范围也都一样。 李大总管也有一张私人表叫TLB表,具体玩的呢,看个例子就明白了.

举例说明

TLB表(李总管的私人表)

真实房间 当前谁在用
7 A
8 C
9 B

李大总管的私人表叫TLB(translation lookaside buffer)可翻译为“地址转换后援缓冲器”,也可简称为“快表”。从TLB表可以看出,有三个真实的房间, 7,8,9,目前是分配给了A,B,C使用.

奴才们的L1页表(当然可以有无数的奴才表,每个奴才人手一张)

虚拟房间 真实房间 作用
A奴才 1 7 厨房拿菜
A奴才 2 8 洗手间
A奴才 3 9 卧室
虚拟房间 真实房间 作用
B奴才 3 8 音乐室
B奴才 1 9 美术室
B奴才 2 7 武术室
模拟一个他们的活动场景:
奴才 动作1 动作2 动作3 动作4
A 厨房拿菜 卧室睡觉 上洗手间
B 武术室 美术室 音乐室

第一: A要去1号间厨房拿菜,提交表给李总管,李总管拿表和自己的表对照,发现1号虚拟房间对应的是7号真实房间,7号刚好分配给了A用,盖章同意.A拿到了自己菜.

真实房间 当前谁在用
7 A
8 C
9 B

此时李总管的表没变化. 第二: B要去2号间练武术,提交表给李总管,李总管拿表和自己的表对照,发现1号虚拟房间对应的是7号真实房间,7号是A在用,不属于B,里面放的都还是菜呢,咋办?简单,把菜挪出去,把B奴才的武术设备装进来,更改自己的表变成了

真实房间 当前谁在用
7 B
8 C
9 B

此时李总管的表变了,三个真实房间B用了两个了. 第三: A要去3号间睡觉了,又提交表给李总管,李总管拿表和自己的表对照,发现3号虚拟房间对应的是9号真实房间,9号刚好分配给了B用了,此时里面放的还是美术用品呢.咋办?简单,挪出去,把A奴才的睡觉设备装进来,再更改自己的表变成了

真实房间 当前谁在用
7 B
8 C
9 A

此时李总管的表变了,9号给了A了,而8号一直在C手里,因为过程中没人用到了8号房.但继续跑下去肯定会易主.

明白了吗? 这就是映射的核心思想!对A,B来说,它们只认 1,2,3房间,记得自己的房间是干什么用的就行,完全不必知道背后的7,8,9是谁在用, 用房间之前提交表单就行了,后面的不用管. 而且各自1,2,3可以重新映射到不一样的房间, A,B映射是完全独立的,看清没有它们的123对应的可不都是789的顺序.

上面的1,2,3就叫虚拟地址,也叫线性地址. 而789就是物理地址. 如此只有三个房间都可以给很多很多的奴才使用,让他们觉得这三个房间都是自己的. 完美!!! 当然AB也可以有自己虚拟地址789,例如

虚拟房间 真实房间 作用
A奴才 1 7 厨房拿菜
A奴才 2 8 洗手间
A奴才 3 9 卧室
A奴才 7 19 洗澡
A奴才 8 88 去皇上寝宫偷看
A奴才 9 45 御膳房

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存管理
    +关注

    关注

    0

    文章

    169

    浏览量

    14810
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2642

    浏览量

    69337
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    开源鸿蒙技术大会2025丨OS内核与视窗分论坛:筑基开源鸿蒙核心内核,共拓视窗技术边界

    开源鸿蒙技术大会2025 OS内核与视窗分论坛湖南长沙国际会议中心圆满举行。来自西北工业大学、浙江大学、厦门大学、华为等高校和企业的学者专家齐聚一堂,围绕鸿蒙
    的头像 发表于 11-20 17:29 461次阅读
    开源<b class='flag-5'>鸿蒙</b>技术大会2025丨OS<b class='flag-5'>内核</b>与视窗分论坛:筑基开源<b class='flag-5'>鸿蒙</b>核心<b class='flag-5'>内核</b>,共拓视窗技术边界

    qemu上体验芯来RISC-V处理器运行鸿蒙LiteOS-M内核

    qemu上体验芯来RISC-V处理器运行鸿蒙LiteOS-M内核 1.本文概述 2.下载qemu 3.下载鸿蒙LiteOS-M 4.运行与测试 5.gdb调试 1.本文概述
    发表于 10-31 09:04

    WebGL/Canvas 内存泄露分析

    构建高性能、长周期运行的 WebGL/Canvas 应用(如 3D 编辑器、数据可视化平台)时,内存管理是一个至关重要且极具挑战性的课题。 开发者通常面临的内存泄漏问题,其根源远比简
    的头像 发表于 10-21 11:40 167次阅读
    WebGL/Canvas <b class='flag-5'>内存</b>泄露<b class='flag-5'>分析</b>

    功率MOS电源管理场景下的发热原因分析

    功率MOS电源管理场景下的发热原因分析 功率MOS工作过程中不可避免地会产生热量,导致温
    的头像 发表于 06-25 17:38 404次阅读
    功率MOS<b class='flag-5'>管</b><b class='flag-5'>在</b>电源<b class='flag-5'>管理</b>场景下的发热原因<b class='flag-5'>分析</b>

    鸿蒙5开发宝藏案例分享---内存优化实战指南

    卡、或者怀疑内存占用高时,第一时间用这个命令看看整体情况和各部分占比,快速定位是 JS 层问题还是 Native 层问题。 对比分析不同场景(刚启动、功能操作后、后台运行一段时间后)多次运行命令,对比
    发表于 06-12 17:15

    鸿蒙5开发宝藏案例分享---分析帧率问题

    ;opacity</span>滥用)。 图片尺寸匹配显示区域,避免内存浪费。 结语 这次深扒鸿蒙文档,发现官方其实埋了不少性能优化的“宝藏案例”。实际开发中,帧率问题无非集中
    发表于 06-12 17:07

    鸿蒙5开发宝藏案例分享---点击完成时延分析

    100ms延迟,用户留存率提升7%!持续优化才能打造极致体验。 立即行动 : 打开DevEco Profiler分析你的应用 定位耗时最长的3个操作 应用本文任一技巧进行优化 你有哪些性能优化妙招?欢迎评论区分享交流!? 性能优化不是一次性的任务,而是持续精进的艺术。愿
    发表于 06-12 17:03

    DevEco Studio构建分析工具Build Analyzer 为原生鸿蒙应用开发提速

    原生鸿蒙应用开发过程中,随着项目复杂度的增加,开发者花费构建上的时间越来越长,导致开发效率降低。为了帮助开发者解决构建效率的问题,华为DevEco Studio上提供了Build
    发表于 02-17 18:06

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-移植前准备之git管理内核源码

    我们前边已经介绍过Git工具,是一个非常实用的代码管理工具。如果验证编译出的内核能够正常启动,就可以将源码用git工具管理起来。可以清楚的了解源码
    发表于 01-23 10:51

    飞凌嵌入式ElfBoard ELF 1板卡-移植前准备之git管理内核源码

    我们前边已经介绍过Git工具,是一个非常实用的代码管理工具。如果验证编译出的内核能够正常启动,就可以将源码用git工具管理起来。可以清楚的了解源码
    发表于 01-22 10:39

    使用DevEco Studio高效解决鸿蒙原生应用内存问题

    鸿蒙原生应用开发过程中,可能由于种种原因导致应用内存未被正常地使用或者归还至操作系统,从而引发内存异常占用、内存泄漏等问题,最终导致应用卡
    的头像 发表于 01-16 14:44 1157次阅读

    OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

    本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程,触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器,树莓派卡片电脑设计,支持开源鸿蒙OpenHarmony3.2-5.0系
    的头像 发表于 12-30 10:08 1512次阅读
    OpenHarmony<b class='flag-5'>源码</b>编译后烧录镜像教程,RK3566<b class='flag-5'>鸿蒙</b>开发板演示

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-Linux内核移植之内核简介

    的比较及时,遇到一些内核问题时就可以到linux官网的源码中查一下是不是有相关的提交记录。 获取芯片原厂的linux源码 每个芯片原厂都有自己的git仓库,他们会把已经开发完成的
    发表于 12-16 13:08

    飞凌嵌入式ElfBoard ELF 1板卡-Linux内核移植之内核简介

    及时,遇到一些内核问题时就可以到linux官网的源码中查一下是不是有相关的提交记录。获取芯片原厂的linux源码每个芯片原厂都有自己的git仓库,他们会把已经开发完成的
    发表于 12-13 09:03

    源码开放 智能监测电源管理教程宝典!

    源码开放,今天我们学习的是电源管理系统的核心功能模块,手把手教你如何通过不同的技术手段实现有效的电源管理
    的头像 发表于 12-11 09:26 990次阅读
    <b class='flag-5'>源码</b>开放  智能监测电源<b class='flag-5'>管理</b>教程宝典!