内存使用与分段


前言

提示:


提示:以下是本篇文章正文内容

一、内存使用

1.逻辑地址

内存作为计算机的基本组成部分,用来存储程序(指令和数据),内存单元按字节编址、寻址,程序装入到内存后,PC 指向程序开始地址,依次取指执行

即内存使用:将程序放到内存中,PC指向开始地址

这是main()编译后,entry是入口地址,如果_main相对于_entry的偏移地址是40

在这里插入图片描述
现在如果这段程序要运行,那么只要将PC指向 call 40 这条指令所在的地址就好了,执行完call 40之后,会自动跳到地址为40处执行。

但是现在有个问题,_main所在的位置一定是物理地址为40的位置吗?换言之,40表示的是物理地址吗?

学过前面的知识,我们知道肯定不是的,前面放的system模块

call 40这个40指的是相对于_entry的偏移量,程序里面的地址是相对地址(逻辑地址),而程序真正运行时的地址是绝对地址(物理地址),即程序运行时,根据逻辑地址得到物理地址就是地址的重定位

比如_entry这条指令的地址如果存放在物理地址为1000处,那么_main的
地址就应该是1040,所以call 40就要变成call 1040.

2.重定位

重定位:
重定位是指将指令中的逻辑地址转换为内存中实际的物理地址的过程

重定位方式:

1.编译时重定位
编译时重定位的程序只能放在内存中的固定位置,而编译结束后的内存使用情况不一定,与编译时的相同,因此这种重定位方式有很大的局限性。必须保证装入该程序时,这段程序要使用的地址是可用的。

编译时进行重定位后,装入过程不需要有额外开销,因此效率较高

编译时重定位一般用在可以保证一段程序固定地装入某段内存中的嵌入式系统中

2.载入时重定位(静态重定位)
程序在装入内存时,将指令中的相对地址加上装入的内存段的基址作为绝对地址,载入时重定位的程序一旦载入内存后就不可以再移动位置。不利于程序在内存中的移动(交换,swap)。

3.运行时重定位(动态重定位)(最佳时机)
运行时重定位的程序,装入内存的仍是逻辑地址,在实际访问时进行重定位,即在进程 PCB 中保存程序段的基址,实际访问时进行地址翻译(由基地址与逻辑偏移计算出物理地址),无妨交换

3.交换

为了更好地支持多进程,当内存空闲空间不足时,有选择地将某些进程保存到硬盘上(换出),将腾出的空间交给当前需要运行的进程使用,即将要运行的进程换入到内存
在这里插入图片描述
进程1睡眠将进程1换出放入磁盘中,并将要运行的程序换入,当程序1要再次运行的时候,就再次换入,但是每次的基地址可能不一样。所以,一般在运行时重定位。

二、内存分段

在内存的使用方式,以及每个进程中的指令的地址如何对应到实际的内存
实际上,更多时候进程不是作为一个连续的整体装入内存的

而按照程序本身特点,将进程分段管理,满足每个段的需要,建立段表,描述段的信息,包括段号、段基址、段限长,段类别等等
可以单独移动、扩大某个段,只需要维护好段表

进程由多个部分(段)组成,每个段有各自的特点和用途,因为各个段性质的不同,当所有段作为一个整体看待时就会有所不便,比如,代码段是只读的,代码段、数据段不会动态增长,而堆栈段可能要动态增长
在这里插入图片描述

假如不分段,在一个程序中执行指令和数据会杂糅在一起并保存在内存中,由于执行指令写到内存后不能被用户修改的,属于只读属性的。而程序中的数据是可读可写的,所以当计算机取址执行时还要判断该对应内存地址下的是指令还是数据,这样就不好判断了。所以我们将指令与数据用地址区间来分开,这样计算机在取址时通过判断地址就可以知道取的是指令还是数据,便于执行程序。所以人们为了计算机方便,就将程序中的具有相同属性的内容放到同一块内存片段。

定位指令(数据):<段号,段内偏移>

重定位的段号有特定的表来记录(LDT,和GDT表一样)
在这里插入图片描述
CPU每执行一条牵涉到地址的指令都会查一下PCB里面这个进程段表,从而确定物理地址,有一个专门存放该表地址的寄存器LDTR寄存器。

每个进程可以维护一个LDT表作为进程段表
操作系统维护 GDT,每个 LDT 的入口可以作为GDT的一个表项,LDTR寄存器保存当前LDT的地址
在这里插入图片描述
进程切换时,切换PCB,包括切换指令序列(CS:IP)与映射表(LDT)

当内存在分段管理时,建立一个进程需要按程序所分的段(编译时确定)建立其段表,即初始化LDT,并将LDT与PCB关联起来,然后在内存中找到一块合适空闲区域装入程序

总结

提示:这里对文章进行总结:

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Super.Bear

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

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

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

打赏作者

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

抵扣说明:

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

余额充值