操作系统实战 45 讲
彭东
网名 LMOS,Intel 傲腾项目关键开发者
65203 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 60 讲
尝尝鲜:从一个Hello到另一个Hello (2讲)
特别放送 (1讲)
操作系统实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

16 | 划分土地(上):如何划分与组织内存?

虚拟内存地址空间实施难度
内存和硬盘的数据交换效率考虑
内存碎片的利用
表示方式和状态确定角度考虑
以2的(0~52)次方为页面数来组织页面的原因
内存区的设计
如何表示一个物理内存页
分段与分页的区别
数据结构 memdivmer_t
数据结构 bafhlst_t
数据结构 memarea_t
应用区
内核区
硬件区
内存区的逻辑概念
msadsc_t 结构体
内存页的物理内存空间
4KB大小页的表示
选择分页模式管理内存
分段与分页的优缺点比较
思考题
总结
组织内存页
内存区
如何表示一个页
内存划分方式
内存管理的复杂性
内存管理的重要性
内存管理与土地规划的类比
划分土地(上):如何划分与组织内存?

该思维导图由 AI 生成,仅供参考

你好,我是 LMOS。
内存跟操作系统的关系,就像土地和政府的关系一样。政府必须合理规划这个国家的土地,才能让人民安居乐业。为了发展,政府还要进而建立工厂、学校,发展工业和教育,规划城镇,国家才能繁荣富强。
而作为计算机的实际掌权者,操作系统必须科学合理地管理好内存,应用程序才能高效稳定地运行。
内存管理是一项复杂的工作,我会用三节课带你搞定它。
具体我是这么安排的:这节课,我们先解决内存的划分方式和内存页的表示、组织问题,设计好数据结构。下一节课,我会带你在内存中建立数据结构对应的实例变量,搞定内存页的初始化问题。最后一节课,我们会依赖前面建好的数据结构,实现内存页面管理算法。
好,今天我们先从内存的划分单位讲起,一步步为内存管理工作做好准备。
今天课程的配套代码,你可以点击这里,自行下载。

分段还是分页

要划分内存,我们就要先确定划分的单位是按段还是按页,就像你划分土地要选择按亩还是按平方分割一样。
其实分段与分页的优缺点,前面 MMU 相关的课程已经介绍过了。这里我们从内存管理角度,理一理分段与分页的问题。
第一点,从表示方式和状态确定角度考虑。段的长度大小不一,用什么数据结构表示一个段,如何确定一个段已经分配还是空闲呢?而页的大小固定,我们只需用位图就能表示页的分配与释放。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了计算机内存管理的重要性,并将其比喻为政府规划土地的过程。作者首先介绍了内存划分的两种方式:分段和分页,并从表示方式、内存碎片利用、数据交换效率等角度比较了两种方式的优缺点,最终选择了分页模式管理内存。接着,文章详细介绍了如何表示一个页,提出了使用C语言结构体封装页的状态、地址、分配计数等信息的方法。通过实现msadsc_t结构体,作者展示了如何科学合理地管理内存页,以提高内存管理效率。此外,文章还介绍了内存区的概念和如何表示一个内存区的数据结构,以及如何组织内存页的方法。整体而言,本文深入浅出地介绍了内存管理的重要性和实现方法,对读者了解内存管理具有一定的指导意义。文章通过比对分段与分页的区别,确定了使用分页方式,设计了内存页、内存区等一系列数据结构,并解决了如何表示一个物理内存页的问题。同时,文章还探讨了为何要以2的(0~52)次方为页面数来组织页面的原因。整体而言,本文对内存管理的技术特点进行了深入剖析,为读者提供了全面的内存管理知识。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《操作系统实战 45 讲》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(25)

  • 最新
  • 精选
  • neohope
    置顶
    memarea_t ,进行内存区,解决功能分区的问题 -> memdivmer_t ,进行内存分割合并管理 -> bafhlst_t,以2的n次方对内存页面进行分组 ->msadsc_t,解决单一页面管理问题 用2的N次方寻址主要有几方面原有: 1、内存对齐,提升CPU寻址速度 2、内存分配时,根据需求大小快速定位至少从哪一部分开始 3、内存分配时,并发加锁,分组可以提升效率 4、内存分配回收时,很多计算也更简单

    作者回复: 你好,总结的相当到位

    2021-06-14
    3
    49
  • 嗣树
    neohope 老哥学习榜样,我做点补充吧。 之所以是 0-52 是因为 64 - 12 = 52,64位地址,12是页大小 而选用 2 的幂次可以把算术运算都转化为位操作,位操作是要比算术运算快的。应用层可能为了可读性而不去使用位操作,但是在内核中只要是需要性能都会往这方面靠,所以往往会浪费点空间凑个整。1024凑整没毛病嗷😂 内存管理也是绝对的高频操作,这样差别还是很可观的。

    作者回复: 是的

    2021-06-25
    2
    21
  • pedro
    对于思考题,原文中: 依次类推,dm_mdmlielst 数组挂载连续 msadsc_t 结构的数量等于用 1 左移其数组下标,如数组下标为 3,那结果就是 8(1<<3)个连续的 msadsc_t 结构。 因此页面数统统都是 2 的倍数,8 是 2^3,这个地方我百思不得其解,页面数为什么是 2 的倍数,在 tmalloc 中,分配的对象大小都是 2 的倍数,原因是为了减少内存碎片和对齐,虽然这与本文的问题不搭边,但是可以拿来套。 因此我猜测,由于页的大小是 2 的倍数,因此页的个数也要是 2 的倍数,这样就能实现页内存对齐,减少内存分配时的碎片。

    作者回复: 是的,这么操作 同时也是为了降低内存碎片

    2021-06-14
    10
  • 太阳
    文中说 “很多时候,内核使用内存需要大的、且连续的物理内存空间” 还有 “但是第一个 msadsc_t 结构与最后一个 msadsc_t 结构,它们之间的内存物理地址是连续的。”,为什么需要物理内存连续,既然可以通过MMU进行地址转换,是否可以只是虚拟内存连续,物理内存随意?内存管理的时候虚拟内存和物理内存分别怎么操作?

    作者回复: 你说的对,原则上我们确实只需保证虚拟地址连续,然后通过MMU映射就好了,但是很多物设备也要访问物理内存,但是它们地址并不经过MMU,这类设备有DMA,网卡,AHCI等等,所以有些情况就需要连续的物理内存空间

    2021-08-23
    4
  • thomas
    typedef struct s_BAFHLST 这个命名是什么的缩写? 比如msadsc_t 这个命名就有做说明 内存空间地址描述符(memory space address descriptor)

    作者回复: block alloc free head list

    2021-06-21
    3
    2
  • Zhendicai
    思考题应该是因为 dm_mdmlielst最后一个元素的下标是51也就是2^51, 2^51 x 2^12=2^63, 就是说这时只需要两个bafhlst_t就能够表示完整的地址空间, 再多的话就超过了64位地址空间了。如果dm_mdmlielst再加一个元素的话 那就只需要一个bafhlst_t就能表示完整地址空间 但是没啥意义了 应该是这样的吧

    作者回复: 对的,是这样的

    2021-06-19
    2
    2
  • PAWCOOK
    请问在二级引导器中建立内核MMU的页表数据时使用的是长模式下的 2MB 分页方式,而本节内存管理使用的却是4KB,这样是不是冲突了呢

    作者回复: 后面会改掉的

    2022-02-11
    1
  • PAWCOOK
    请问结构memdivmer_t有什么作用呢?我们可不可以直接将这个结构里面的内容放到memarea_t 中去

    作者回复: 可以啊

    2021-11-27
    1
  • Mike_Han
    这是原文中的内容,我想请教个问题, "需要注意的是,我们并不在意其中第一个 msadsc_t 结构对应的内存物理地址从哪里开始,但是第一个 msadsc_t 结构与最后一个 msadsc_t 结构,它们之间的内存物理地址是连续的。" 怎么做到"第一个 msadsc_t 结构与最后一个 msadsc_t 结构,它们之间的内存物理地址是连续的" ,怎么做到连续的?

    作者回复: 由代码控制的

    2021-07-08
    1
  • Fan
    思考题: 我们为什么要以 2 的(0~52)次方为页面数来组织页面呢? 应该是 内存分配时,根据需求大小快速定位至少从哪一部分开始

    作者回复: 嗯嗯 猜对了

    2021-06-27
    1
收起评论
显示
设置
留言
25
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部