OS-内存管理(1)

知识共享许可协议
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。

重点讨论第三点问题,关于重定位,动态绑定的问题。简要介绍内存管理和程序执行前经过的步骤

1.内存管理概要,功能,内存保护

  1. 进程管理讨论了进程通过进程调度可以共享一个cpu,为了实现性能改进就必须共享内存,但不可能将所有用户进程数据放入主存,这时就需要对内存进行划分和动态分配,这就是内存管理。
  2. 内存管理可以提高内存利用率,通过虚拟技术从逻辑上扩充存储器,具体功能而言有:
  • 内存空间分配回收
  • 地址转换
  • 内存扩充
  • 内存保护:让os内核不被用户进程访问以及用户进程之间不相互干扰(多用户系统)。这些怎么实现呢,我们可以让每个进程独有一个独立运行的内存空间,即确定每个进程只可以访问这个地址的的合法地址,这让进程之间不相互影响。

2. 程序的装入(加载)和链接

1. 概要:

程序要装入内存才能执行(因为程序执行必须映射到绝对地址并加载到内存。程序执行时,cpu(进程)通过产生绝对地址访问内存的程序指令和数据。程序终止,释放内存空间,加载下一个程序。)
通常程序以二进制可执行文件的形式存储在磁盘上。要执行的话,程序就得被调入内存并放在进程空间内。

2. 程序执行前经历的步骤

用户程序在执行前,要经过好几个步骤:(有的步骤可选)

源程序(.c)–【编译器/程序(compile)】-- 若干对象/目标模块(.obj) --【链接程序/链接器(link)】-- 完整的装入/加载模块(.exe) --【装入程序/加载器(load)】-- 二进制内存映像

  • 链接器:把编译后的一组目标模块与库函数链接,形成完整的装入模块
  • 装入模块(可执行文件.exe)通过系统库可通过加载器(装入程序)加载到内存运行
  • 二进制镜像和动态链接库一同在内存中运行

3. 问题:能够装入内存任何位置的代码程序必须是可动态绑定/重定位的?

1. 重定位和静态重定位
  • 多道程序环境下,由于目标模块的起始地址从0开始,其他地址都相对于这个起始地址,即地址都从0开始,这时叫相对/逻辑地址,但装入内存后要变成绝对地址(加上BR基地址寄存器),那就要可重定位,即对.obj目标程序中指令和数据地址进行修改/把作业地址空间中使用的逻辑地址变成内存中物理地址,这就是重定位
  • 而又因为址变换通常在装入时一次完成,之后地址不变了,所以又叫静态重定位。那又为什么地址不变了?因为静态重定位要求程序一旦进入内存,整个运行期间,不能在内存中移动。

(os书上关于地址绑定的话,感觉和别的8太一样,仅参考)编译器把源程序中的符号地址绑定到可重定位的地址,链接/装入器再把可重定位的地址绑定到绝对地址。我们要讨论的就是在编译装入和执行时如何实现这些地址绑定

2. 动态重定位(动态绑定/动态运行时装入):程序在内存中可以发生移动,即地址会变
  • 解决移动问题的方法就是在装入内存后,我们不立刻把装入模块中的相对/逻辑地址变成绝对地址,因为变了之后程序在内存中如果移动,绝对地址还是要变。所以我们把地址转换推迟到程序要真正执行时再进行。所以意思就是程序装入内存后的地址首先都是相对地址,这时候没地址转换,(用重定位寄存器完成:逻辑/有效地址+重定位寄存器地址)。

  • 特点:所以动态重定位的特点是:

    • 程序可以在内存中移动,可以把程序分配到不连续的存储区(程序可以在内存中移动,要执行时才地址转换),而静态重定位就不行,地址都固定了(也不懂这么说对不对,地址连续和不能在内存中移动有关系吗???)所以问题解决了:能够装入内存任何位置的代码程序必须是可动态绑定/重定位的。
    • 装入部分代码即可运行;
    • 程序运行期间可以动态申请分配内存

4. 练习

e.g1把作业地址空间中使用的逻辑地址变成内存中物理地址称为(B)

A.
加载

B.
重定位

C.
物理化

D.
逻辑化


e.g2动态重定位过程依赖于( ABC)。

A.
可重定位装入程序

B.
重定位寄存器

C.
地址变换机构

D.
目标程序


e.g3
静态重定位的时机是()

A.
程序编译时

B.
程序链接时

C.
程序装入时

D.
程序运行时(动态重定位)


e.g4
能够装入内存任何位置的代码程序必须是(C)

A.
可动态链接的

B.
可定位的

C.
可动态绑定的

D.
可静态链接的


5判断
程序必须装入内存才能被执行。

A.√

B.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

sunMoonStar_c

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

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

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

打赏作者

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

抵扣说明:

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

余额充值