轻松理解操作系统 - 图文详解 内存管理模块的分段分页管理
轻松理解操作系统 - 图文详解 内存管理模块的分段分页管理
在操作系统中,内存管理是核心功能之一,其中分页和分段机制是实现内存隔离和保护的基础。本文将详细介绍这两种机制的工作原理、特点以及它们之间的区别。
在前面几期中,我们了解了 Linux内存管理模块中的主要的五个功能模块,这些功能模块实现了内存隔离和保护等:
- 用户空间虚拟内存是怎么管理的?
- 内核空间虚拟内存是怎么管理的?
- Linux 虚拟内存的基石是什么?
- Linux操作系统的虚拟内存管理核心是什么?
- 物理内存是如何管理的?
那还有一些更细化的机制在咱们了解大框架的时候没有了解到,比如内存分页分段机制、内存大页、内存池等等。
今天我们就来了解一下这些机制之一的是内存隔离和保护的基础的内存分页分段机制。
首先,我们来看看想提高物理内存的利用率该用什么办法?
在虚拟内存机制下,一个或多个虚拟内存页对应一个物理内存页。
想要提高物理内存的利用率,由本系列中的 文件系统模块的数据块的设计思想我们可以想到一个简单的方法:
像文件系统将硬盘分为相同大小的数据块一样,我们也将物理内存分为一堆相同大小的内存页面不就行了吗!
这就是内存分页。
然后我们来了解一下它和物理内存的关系
首先,当然是它的地址结构:在分页机制下,虚拟地址分为两部分,页号和页内偏移。
页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址。
然后,光有地址结构肯定不行啊,我们还需要能找到对应的物理内存页面。
所以,分页机制肯定有寻址的步骤:
- 把虚拟内存地址,切分成页号和偏移量
- 根据页号,从页表里面查询对应的物理页号
- 物理内存页号 加 偏移量,就得到了物理内存地址
接下来,我们了解一下分页机制的其他特点
页是内存管理的最基本单位:页是内存管理的基本单位,其大小通常由系统确定,如 4KB 、8KB 等(大多为 4KB )。
页面大小固定:所有页面的大小都是相同的,这有利于内存的分配和回收。
一维地址空间:分页管理的作业地址空间是一维的:程序员只需给出一个记忆符(线性地址的十六进制表示)即可表示一地址。
存储保护机制:每个页面都有存储保护机制,但通常只设置读和写两种权限。
那我不想物理内存被分的这么碎的话有没有其他机制?
当然是有的,不把物理内存分的很碎也是有一定好处的,比如:连续的内存块的访问效率要优于不连续
实现这种连续的物理内存分配的机制就是内存分段机制。
那虚拟内存段和物理内存段是什么关系呢
在分段机制中,每个虚拟内存段包含一组意义相对完整的信息(如代码段、数据段、栈段等),它们被映射到的物理内存段也相对来说比较连续
其主要目的是为了更好地满足用户的编程需求,方便信息的共享和保护,以及支持动态增长和动态链接。
就类似于分页机制有页表一样,每个段也有段表。而且它的寻址方式也与分页机制有许多相似之处:
访问物理内存的步骤:
当进程访问某个虚拟内存地址时:
- 操作系统首先根据段号查找段表,找到对应的段基地址和长度。
- 然后检查访问权限。如果访问合法,则将段基地址与段内偏移量相加,形成物理地址进行访问。
除了每个段都包含一段完整的逻辑意义之外,分段机制也应该还有其他特点吧?
这个确实,这个只是分段机制最显著的特点,它还有一些特点:
首先正如标题:段是信息的逻辑单位:每个段包含一组相关的数据或代码,具有完整的逻辑意义。
其他特点:
- 段长不固定:段的长度由用户编写的程序决定,通常在编译时由编译器根据信息的性质来划分。
- 二维地址空间:分段管理的作业地址空间是二维的,程序员在标识一个地址时,需要同时给出段名和段内地址。
- 存储保护机制:每个段都有独立的存储保护机制,可以设置读、写和执行三种权限。
最后当然就是它们之间的比较了:
那既然有分页机制,也有分段机制,有没有一种内存管理机制同时有两者的特点呢?
当然是有的,这就是段页式内存管理,我们下期就来讲讲段页式内存管理。