硬盘和内存、物理地址、虚拟地址、段、页、页表、页表项,多级页表的顺序梳理

硬盘和内存、物理地址、虚拟地址、段、页、页表、页表项,多级页表的梳理

本篇blog的起因是因为在ICS2的学习过程中觉得自己对页表的理解还不够深刻,于是就想简单地梳理一下是计算机是怎么从物理地址发展到多级页表的,以大二学生的角度梳理一下知识网络。在梳理过程中也获益匪浅,这里总结成blog分享~


我们先从硬件上讲起:

1.硬盘和内存的区别

在这里插入图片描述

这张图中显示寄存器是属于CPU的一部分,对程序员来说是相对透明的,CPU读取数据的顺序是cpu-寄存器-缓存(cache,可以包括多级缓存,缓存不命中才会去内存里读取数据一般缓存是RAM)-内存-外存(硬盘),下面介绍一下内存和硬盘。

内存(RAM):承担着暂时存储CPU运算数据以及与外部存储器交换数据的任务。它是连接外部存储器和CPU的桥梁,所有程序的运行都在内存中进行。 断电后数据丢失。通常是DRAM(动态随机存储器)。

在这里插入图片描述

硬盘(又称外存):作为计算机的主要存储设备,承担着存储大部分软件和数据的任务。有容量大,断电数据不丢失的特点。也被人们称之为“数据仓库”。具体的扇面等等见ICS1。

在这里插入图片描述

这里只要搞清楚,程序无法在硬盘上直接运行,而是在内存中运行的。这里就存在一个我们在手机时代容易混淆的东西,比如一个手机是8G+256G,事实上专业上来说是他的运存(RAM)为8G,对应电脑的内存,256G为内部存储空间,对应电脑上的硬盘空间,像我们常说的一个电脑1TB,指的是硬盘空间,也就是外存,而不是内存。而内存相对较小,比如我的电脑内存就是16G。

2.物理地址

关于CPU如何通过地址总线以段地址和偏移地址去计算物理地址我这里就不详细描述了,这里放一个动态图:

在这里插入图片描述

来源:物理地址是怎么确定的?以8086为例_8086物理地址动图-CSDN博客

物理地址,相当于门牌号,内存上的每个内存单位都有自己的物理地址,这个地址会对应相应的内存空间。

像cache,寄存器这些RAM也是有物理地址的,但是后面说的虚拟地址主要和内存上的物理地址有关。

磁盘里的物理地址就指的是柱面扇面之类的了,下面描述的过程是当内存中没有需要的数据时如何从磁盘中读取:

当程序要读取的数据时传入内存地址(行地址+列地址),如果数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,通过柱面号,磁头号,扇区号定位磁盘位置,找到数据的起始位置并向后连续读取一页或几页载入内存中。

那这里我们讨论的物理地址就是内存的物理地址,类比就是数组的序号,本身不占储存空间,是一个硬件特征。

3.虚拟地址

我们有了物理地址那为什么又要有虚拟地址呢?,我们不得不考虑一个事情,就是:物理地址存在一个问题:

多个进程如果同时操作真实的地址内存的话,会产生冲突。 于是操作系统就提供了一种机制,让每个进程都仿佛拥有全部的内存地址,这些内存地址是虚拟的,由操作系统提供统一的方式映射到真实的物理地址。

因此就有了虚拟地址,那我们又会想一个问题,我们给一个进程分配了一段虚拟地址,那我这个进程在这段虚拟地址里怎么存储呢?虚拟地址和物理地址之间的映射关系是按什么存储的呢?(这里先讲base+size的方法)涉及内存的分段,我们接下来看一下虚拟内存的分段(segment)。

4.内存分段(segment)

众所周知(bushi),虚拟地址一般从0开始,一个进程的虚拟地址分为四段,且是四等分,按照虚拟地址的最高两位进行区分,分为四个segment,分别有不同的功能,分别为 data,code,heap,stack,各自具体存储的什么数据这里不做详细讲述,每段VA到PA就是VA+base即可,size指的是段的范围,positive为1是数据从低地址到高地址存,为0是数据从高地址倒着存到低地址。可以看更详细的博客,分段大致如图所示:

这部分会考一些base+size一些,VA到PA的映射问题。原始的映射方式。其中base和size等的映射数据储存在CPU的特定寄存器中。

在这里插入图片描述

分段后就使得程序员不需要关心具体的物理地址内存的问题(因为只要知道偏移量即可),产生了连续的内存空间,但是,很明显可以看到会存在内存碎片(灰色部分)

接下来就是要解决一下内存碎片的问题了,就需要抛弃掉base+size的方法,程序员用内存分页来解决这个问题。

4.内存分页

内存分页是为了减少内存碎片、加快内存交换的方式。

分页,顾名思义就是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。每个页的大小一般是4k。 虚拟地址与物理地址之间通过页表来映射。同上理,页表的首地址仍是储存在CPU的寄存器中,不占内存。但页表本身是存储在内存中的,映射通过MMU这个硬件来根据页表操作。如图所示:

在这里插入图片描述

分页的话,页与页之间是紧密排列的,所以不会存在外部碎片。内存分页机制分配内存的最小单位是一页,即使程序不足一页大小,最少只能分配一个页,所以页内会出现内存浪费,所以针对内存分页机制会存在内部内存碎片的现象。

如果内存分页不够,操作系统会把其他正在运行的进程中的最近没有被使用的内存页给换出到硬盘上面。 一旦需要的话,再从磁盘上面换入到内存里面。由于一次性换入或者换出的只有少数几个页,所以不用花费太多的时间。

接下来我们需要深究一下页表是如何实现虚拟地址到物理地址的映射的。

5.页表

在介绍页表之前我想想介绍一下两个概念,页和页框。

  • :将进程划分的块,对应的大小就叫页面大小。
  • 页框:将内存划分的块。
  • 页和页框二者一一对应,一个页放入一个页框,(理论上)页的大小和页框的大小相等。
  • 页表:就是一个页和页框一一对应的关系表。【存放在内存中】
  • 逻辑地址:是程序编译后,生成的目标模块进行编址时都是从0号单元开始编址,称之为目标模块的相对地址,即为逻辑地址。

我们知道,现在的程序使用的都是虚拟内存,CPU在取指令或者取数据的时候使用的是虚拟地址,为了能够从内存中取得数据,需要将虚拟地址转换为物理地址,虚拟地址和物理地址之间的映射关系就保存在页表中。每个进程都有自己的页表。

分页管理时,将若干字节视为一页,比如4K byte。此时,内存变成了连续的页,即内存为页数组,每一页物理内存叫页帧,以页为单位对内存进行编号,该编号可作为页数组的索引,又称为页帧号。页帧号也叫页帧数。

这部分是操作系统书中的内容,上课讲得不够详细这里做个补充。

页表由多个页表项组成,即页表中每一行的就是一个页表项。也就是上图中一个黄色的部分就是一个页表项,一个页表项一般是4B,页表项里存的内容为:

  • 页框号:记录虚页面对应的具体哪个物理页面
  • 有效位:标识该页表项对应的虚页面有没有读进内存,否则在磁盘
  • 访问位:引用位,标识该页面有没有被访问过
  • 修改位:此页面在内存中有没有被修改过,如果被修改过,将来是要被持久化到磁盘上的,该标志位就是这个目的
  • 保护位:标识该页面的读写等权限

当然这些是由硬件实现的,我们ICS2也不会考这些,但了解一下总算知道页表项4B里存的是什么了。

页表中,一个进程对应一个页表,页表项从0开始编号,对应虚存的顺序,同时可以通过页表项里存放的信息找到对应的页框(物理内存)。如图所示:

在这里插入图片描述

页表的首地址存在CPU特定寄存器里,页表本身存在内存里。这样就很清晰了。

但是又存在了一个问题:

这里假定页大小是4K,32位地址总线进程地址空间大小为(232)4G,这时候页表项有 4G / 4K = 1048576个,每个页表项为一个地址,占用4字节,1048576 * 4(B) /1024(M) = 4M,也就是说一个程序啥都不干,页表大小就得占用4M。如果每个页表项都存在对应的映射地址那也就算了,但是,绝大部分程序仅仅使用了几个页,也就是说,只需要几个页的映射就可以了,如上图,进程1的页表,只用到了0,1,1024三个页,剩下的1048573页表项是空的,这就造成了巨大的浪费,为了避免内存浪费,计算机系统开发人员想出了一个方案,多级页表。

6.多级页表

在这里插入图片描述

这是改进后的二级页表,我们发现:

一级页表占用= 1024 * 4 B= 4K

2级页表占用 = (1024 * 4 B) * 2 = 8K

总共的占用情况是 12K,相比一级页表 4M,节省了99.7%的内存占用。

原因就是很多并没有使用到的程序的部分不需要编入页表,多级页表解决了页表亢余的问题,页表所占的空间大大减少。类似于多级文件夹的感觉。多级页表所占的空间仍是内存里的空间,只不过首地址还是存在CPU特定寄存器中。

我们可以来看一道简单的题目:
例:某系统按字节编址,采用 40 位逻辑地址,页面大小为 4 K B ,页表项大小为 4 B ,假设采用纯页式存储, 则要采用()级页表,页内偏移量为()位? 例:某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,\\则要采用()级页表,页内偏移量为()位? 例:某系统按字节编址,采用40位逻辑地址,页面大小为4KB,页表项大小为4B,假设采用纯页式存储,则要采用()级页表,页内偏移量为()位?
解题:

页面大小=4KB=212B,按字节编址,因此页内偏移量为12位。

页号 = 40-12 = 28位(相乘的关系嘛,就有228个页面)

每个页面可存放212/22 = 210个页表项

因此每一级的页表对应页号应为10位,总共28位的页号至少要分为三级,偏移量为12位。

页号是虚拟地址的划分,指向程序中的某一页,每个页号对应一个页面号。一个页号是一个页。


ok,终结一下,这篇blog更侧重于随着计算机发展的思路去考虑新技术的来源,有了需求,就会有技术的革新,就会有新的需求,如此循环,技术得到了充足的发展,写这篇blog的最初原因是对页表到底是存在于内存外存还是寄存器的问题感觉不清晰,以及不明白页表项那4B里面到底存了什么不清楚,通过查询其他blog和知乎总结出这篇blog。还有很多知识点没有涉及或一掠而过,比如页的命中等问题,建议还是好好了解一下那三种映射方法。
此循环,技术得到了充足的发展,写这篇blog的最初原因是对页表到底是存在于内存外存还是寄存器的问题感觉不清晰,以及不明白页表项那4B里面到底存了什么不清楚,通过查询其他blog和知乎总结出这篇blog。还有很多知识点没有涉及或一掠而过,比如页的命中等问题,建议还是好好了解一下那三种映射方法。

  • 36
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值