虚拟内存【计算机操作系统】

1.页和页表

操作系统将虚拟内存分块,每一个小块称为一个页;真实内存也需要分块,每一个小块称为帧。页到帧的映射,需要一种结构叫做页表。
[图片]

页表维护了虚拟地址到真实地址的映射。每次程序使用时,需要把虚拟内存地址换算成物理内存地址,过程为:

  1. 通过虚拟地址计算出页编号;
  2. 查页表,根据页编号,找到帧编号;
  3. 将虚拟地址换算成物理地址。
    举例:如果页大小是 4K,假设程序要访问地址:100,000。那么计算过程如下。
  4. 页编号(Page Number) = 100,000/4096 = 24 余1619。 24 是页编号,1619 是地址偏移量(Offset)。
  5. 查询页表,得到 24 关联的 Frame 编号(假设查到 Frame 编号 = 10)。
  6. 换算:通常 Frame 和 Page 大小相等,替换 Page Number 为 Frame Number 物理地址 = 4096 * 10 + 1619 = 42579。

2.为什么要有虚拟内存

没有虚拟地址空间的时候,程序就只能直接访问和操作物理内存了。
[图片]

但是这样会出现一些问题:

  • 用户程序可以访问任意内存,寻址内存的每个字节,这样就很容易破坏操作系统,造成操作系统崩溃。
  • 想要同时运行多个程序特别困难,可能会造成内存地址覆盖的问题。
    总结:如果直接把物理地址暴露出来的话会带来严重问题,比如可能对操作系统造成伤害以及给同时运行多个程序造成困难。
    所以,就需要有虚拟内存了。
    操作系统会提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来。
    程序在访问相同虚拟地址的时候,由操作系统转换成不同的物理地址,这样不同的进程运行的时候,写入的是不同的物理地址,这样就不会冲突了。
  • 程序所使用的内存地址叫做虚拟内存地址。
  • 实际存在硬盘里面的空间地址叫做物理内存地址。

操作系统引入了虚拟内存,进程持有的虚拟地址会通过CPU芯片中的内存管理单元MMU的映射关系,来转换变成物理地址,然后再通过物理地址访问内存。
[图片]

3.内存分段和内存分页

1、内存分段

分段是为了满足程序员在编写代码的时候的一些逻辑需求(比如数据共享,数据保护,动态链接等)。

根据程序的逻辑需求,将内存划分为若干段,每段对应一个功能单元(代码段、数据段、堆栈段等)。

逻辑地址由段号和段内偏移两部分组成。

由于分段管理中,每个段内是连续内存分配,但是段和段之间是离散分配的,因此也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。通过段表讲逻辑地址映射到物理地址,段表记录了每段的起始地址和长度。访问内存时,利用段号查找段表,获取基地址,再加上段内偏移计算出物理地址。

2、内存分页

把内存空间划分为大小相等且固定的块,作为主存的基本单位。因为程序数据存储在不同的页面中,而页面又离散的分布在内存中,因此需要一个页表来记录映射关系,已实现从页号到物理块号的映射。

访问分页系统中内存数据需要两次的内存访问,首先,虚拟地址中的页号查页表,页表存储在主存中,因此需要一次内存访问;然后,得到的物理页框号和页内偏移组合成物理地址,在通过该地址访问主存中的数据。
[图片]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大华Coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值