虚地址转换为内存地址(操作系统)——简单粗暴

虚地址转换为内存地址

虚地址的由来

为什么内存需要虚地址,如果没有虚地址,那我们是怎么给作业划分内存空间的呢

刚开始是直接用物理地址,人们把内存分成2块,操作系统区和用户区,用户程序(作业/进程)放在用户区,但是这时候的内存只能有一道用户程序,每条指令直接用物理地址计算,但是这样的带来的问题是并发低,不能同时作业

后来,为了能在内存中装入多道程序,且这些程序之间又不会相互干扰, 于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式,但是这时候的内存当用户程序太大时,可能所有的分区都不能满足需求。——固定分区,还是用物理地址计算

再后来,为了解决这个问题,提出可变分区分配,这种分配方式不会预先划分内存分区,而是在进程装入内存时, 根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。因为划分的内存空间是动态的,我们不知道进程在内存中的起始地址,所以操作系统要记录内存的使用情况——空闲分区表/空闲分区链

在这里插入图片描述

此时划分给用户程序(作业/进程)是用一块连续地址的内存块,而且还没有引进虚地址(逻辑地址)概念

但是,动态分区分配算法会产生大量外部碎片,有兴趣的可以去看下动态分区分配的四种算法,所以引入了非连续地址分配概念

我们将内存空间分为一个个大小相等的物理块,同时将进程的逻辑地址空间也分为与内存物理块大小相等的一个个部分,称之页面,然后将页面塞进空闲的内存物理块中,可以不连续。那么问题来了,进程怎么知道它的页面塞到哪个物理块了呢,所以引入页表概念,页表用来记录每个页面在内存中的起始物理地址,一个页面对应页面中的一个页表项。

此时,因为指令的物理地址是随进程页面(我们不知道它塞到哪了)动态改变的,但是有个地址是可以确定的——虚地址

注意!!!
注意!!!
注意!!!

虚地址就是逻辑地址

逻辑地址定义:程序经过编译、链接 后生成的指令中指明 的是逻辑地址(相对地址),即:相对于进程的起始地址而言的地址

虚地址转换

现在我们知道进程每个页面对应的物理地址,但是页面中的某条指令的地址(页内偏移量)我们不知道,怎么算出来呢

在这里插入图片描述
举个例子

Eg:在某计算机系统中,页面大小是50B。某进程逻辑地址空间大小为200B,则逻辑地址110 对应 的页号、页内偏移量是多少,实际的物理地址是多少?

如何计算:
页号 = 逻辑地址 / 页面长度 (取除法的整数部分)
页内偏移量 = 逻辑地址 % 页面长度(取除法的余数部分)

页号 = 110 / 50 = 2
页内偏移量 = 110 % 50 = 10

逻辑地址 可以拆分为(页号,页内偏移量)
通过页号查询页表,可知页面在内存中的起始地址

实际的物理地址 = 页面在内存中的起始地址+页内偏移量

后面这种计算方式改成了二进制的左移右移,有兴趣的可以了解下

  • 逻辑地址的拆分更加迅速——如果每个页面大小为 2^k字节,用二进制数表示逻辑地址,则末尾 k位 即为页内偏移量,其余部分就是页号。
  • 物理地址的计算更加迅速——根据逻辑地址得到页号,根据页号查询页表从而找到页面存放的内 存块号,将二进制表示的内存块号和页内偏移量拼接起来,就可以得到最终的物理地址。
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值