计算机基础实战课
彭东
网名 LMOS,Intel 傲腾项目关键开发者
19719 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
计算机基础实战课
15
15
1.0x
00:00/00:00
登录|注册

24|虚实结合:虚拟内存和物理内存

你好,我是 LMOS。
上一课中学习了内存地址空间,我们搞清楚了内存地址与地址空间的本质。
今天我们开始学习虚拟内存与物理内存。其实虚拟内存也好,物理内存也罢,我们从储存并索引数据的角度来看,内存的重要组成部分就两个:一个是地址,另一个就是储存字节单元,即能存放 8 个二进制位的容器。把两者合起来,我们可以将内存理解为能索引到具体储存字节单元的地址集合。
这节课我会带你解决以下三个问题:
1. 虚拟内存的本质是什么?
2. 物理内存是什么,它的结构长什么样?
3. 虚拟内存如何与物理内存结合在一起,真正实现储存数据的功能?
课程配套代码你可以从这里下载。让我们带着上面的问题,正式开始今天的探索之旅吧!

虚拟内存

上节课我们了解了内存地址的产生方式,以及应用程序的链接过程,也知道了内存就是能索引到具体储存单元的地址集合。但是程序中的地址能否索引到具体储存单元呢?具体的储存单元,又是如何分配的呢?下面我们用两个问题来说明其中的原理。

第一个问题

我的第一个问题来了,应用程序中使用的地址是什么内存地址?是不是感觉情况有很多种,一时很难回答清楚?遇到这种状况不要慌,我们只要动手写一个简单的程序就可以验证。
好,我们立刻动手写一写,代码如下:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

虚拟内存和物理内存是计算机内存管理中的关键概念。虚拟内存通过地址转换机制,为每个应用程序提供独立的虚拟内存空间,而物理内存则是实际的硬件内存。本文通过简单的代码示例和图示,生动解释了虚拟内存和物理内存的本质及其重要性。文章首先验证了应用程序中的地址是否能够索引到具体的储存单元,引出了虚拟内存的概念。接着,通过malloc函数的使用和内核的处理过程,说明了虚拟地址到物理地址的映射关系。其次,通过一个简单的memset函数示例,强调了直接使用物理内存地址可能导致内存隔离不足的问题,从而引出了虚拟内存的重要性。最后,通过图示总结了虚拟内存的本质,强调了虚拟地址只是一个整数,需要依赖物理内存作为支撑才能实现访问和储存数据。整体而言,本文通过简单的例子和图示生动地解释了虚拟内存和物理内存的概念及其重要性,对读者快速了解这一技术特点提供了清晰的概览。 虚拟内存的应用旨在保护和限制内存访问,而物理内存则是基于DRAM的内存设备。文章还讨论了虚实结合是如何实现的,介绍了MMU的作用以及异常处理过程。总的来说,本文深入浅出地解释了虚拟内存和物理内存的关键概念,为读者提供了清晰的技术概览。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《计算机基础实战课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 苏流郁宓
    页表索引数据放在内存条的高位处,靠近内核区(不知是不是一定要紧邻) MMU可理解为用多少物理资源给多少物理资源,但这也导致内存条上分布容易碎片化,为了减少碎片化。估计操作系统得做更多的工作! 由于在保护模式下,cpu指令分级,那么内核区的页表数据用得更频繁(其它应用软件需要调用),所以内核区的页表结构应趋向于稳定(开机一直在),而应用区的页表则用多少给多少(容易碎片化),也可以理解为内存条页表真实关系等于y=f(x)(注:应用区加页表索引区)+c(内核区,接近常数 开机一直在内存条上)

    作者回复: 你学到了

    2022-09-19归属地:湖北
    2
    3
  • 温雅小公子
    页表需要给多个进程共享,应该在内核临界区的PCB中,程序去仿存的时候除了最后访问内存中的目标数据,还会访问几次(如果没有应用快表,看是几级页表)内存中内核区的临界资源。 此外为了防止地址越界,一定存在一个页表寄存器存储页表的起始地址和页表长度。

    作者回复: 嗯嗯

    2022-10-30归属地:湖北
    2
  • 功夫熊猫
    首先这个地方要能够共享给所有进程(因为这个页表索引肯定是全局唯一的),还要拥有一定的权限才行(涉及到了更底层的系统调用和数据结构),按照内存分区就只能是内核区了

    作者回复: 是的

    2022-10-10归属地:湖北
    2
  • 温雅小公子
    同学的思考能力好强啊,自觉弗如远甚,成功的聪明人课可太多了,我得为笨蛋争口气。

    编辑回复: 日拱一卒,不期速成,按你自己的节奏来就好,坚持长期学习,相信你会更快成长的~

    2022-10-30归属地:北京
    1
  • 温雅小公子
    除了基本分页存储管理,我还听说过几本分段存储管理,段页式存储管理,以及带快表的分页、分段、段页式存储管理。

    作者回复: 是的

    2022-10-30归属地:湖北
    1
  • 老师,进程的页表结构是不是只要为顶级目录基址分配一个虚拟地址就行(其他部分不需要虚拟地址)。我理解只要对这个基址做好物理地址映射(cr3寄存器需要),虚拟地址转换过程就可以通过物理内存的页表结构找到对应的物理地址。进程对其他部分的页表结构并不关心,因此不需要为它们分配虚拟地址,不知道这个理解对不对,望老师解惑,谢谢。

    作者回复: 对

    2022-10-16归属地:湖北
    2
    1
  • TableBear
    思考题: 由上文可知,虚拟内存地址可以看成是一个进程的可访问内存空间。故页表的数据应该是放置于进程控制块(PCB)中。当进程不处于运行时,PCB会记录页表的存储位置。当进程处于运行状态,页表地址会被加载进页表寄存器PTR中。

    作者回复: 你的这种方式 也是可行的 但是一般不这样做而是 PCB中放的指针 指向页表

    2022-09-19归属地:湖北
    3
    1
  • peter
    请教老师几个问题: Q1:对于虚拟地址是逐条转换吗? 一个程序通常指令、数据都很多,会对应很多虚拟地址,如果CPU拿到每个虚拟地址都交给MMU来转换,即逐条转换,岂不是很慢?这会降低运行速度吧。 Q2:MMU属于CPU吗? 我一直认为MMU是独立于CPU的,但文中有一句“这个函数用硬件实现出来,就是 CPU 中的 MMU”,这句话意味着MMU是CPU中的一部分。 Q3:应用程序运行之前会加载到物理内存,加载到物理内存的代码段中,存放的还是虚拟地址吗?会不会根据所在物理内存的首地址把程序的虚拟地址都变成物理地址?

    作者回复: Q1 安页转换 Q2 MMU属于CPU 也可以独立于CPU Q3 对 是虚拟地址

    2022-09-20归属地:湖北
  • Present
    fork创建进程时,会通过pgd_alloc创建一级页表,这里调用了__get_free_page(GFP_PGTABLE_USER)从伙伴系统中分配内存。然后复制父进程页表时也会根据需要依次创建二级、三级等页表。所以页表的数据最终是在物理内存中的。从GFP_PGTABLE_USER标志可以看出分配的内存是在ZONE_NORMAL及其下面的内存区域。 内核一级页表是在swapper_pg_dir里,是在系统启动时建立起来的一级页表,在物理内存1M以上的一块内存区域。 所以页表数据是在物理内存中的。

    作者回复: 是的 你分析正确

    2022-09-20归属地:湖北
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部