操作系统-虚拟内存、虚拟地址空间机制

操作系统-虚拟内存

有关操作系统的设计,都是在解决一个问题,即:如何让计算机高效安全的运行多道程序

先引入问题

问题1

我们先回到单任务操作系统时代,假设我们的计算机只有16M内存,其中0-1M给内核使用,我们从1M开始装载自己的程序:

  • 我们先考虑单任务操作系统:当我像运行程序A的时候:将A加载到1M开始的内存空间
  • 我现在又像运行程序B,由于我们考虑单任务操作系统,没办法将AB同时运行,所以只能将A的程序覆盖掉,将B加载到1M开始的地址空间,实现了覆盖。

单任务太low了,我现在要多任务,那应该怎么实现?

  • 首先既然程序A装载到1M开始的地址空间,那么B装载的时候肯定不能覆盖它
  • 那B装载到哪里?应该装到A的后面,听起来很可靠,但是新问题来了:
  • 我们在编译链接的时候,怎么能保证程序将来运行的时候它所用到的内存位置是空闲的呢?难道每次想运行程序B,都需要看下哪块内存是空的,然后重新编译链接?
  • 而且每个程序我还想运行多个进程实例,例如在浏览器同时打开多个标签,这是多么合理的需求啊!可是这种方式没法实现。

如果想要实现多任务,那么我们的方法就需要满足一个条件:在程序加载之前,我们不能对程序被加载到的内存位置有任何提前的假设,既然不能有任何假设我们还是把所有程序都加载到一个“固定位置”叭。

那试想:这里的“固定位置”如果和“内存中的具体位置”不同,那问题不就解决了嘛,也就是说“固定位置”和“内存中的具体位置”是不同的概念。

为了让上述的方案成为可能,虚拟内存的概念就诞生了,所谓虚拟内存就是在真正的内存之上的一层专门给程序使用的抽象。前者的“固定位置”值的是虚拟内存,后者的“内存中的具体位置”是物理内存地址。

可以举个例子,程序A链接的时候,链接到了0x3000位置。程序B也链接到0x3000,但是装入的时候A装入到0x1000, 程序B装入到了0x3000。前述的0x3000是虚拟地址,后面的是物理地址,至于两个地址如何转换的,交给MMU去做。

有了虚拟内存之后, 程序只需要认为自己运行在虚拟地址上就可以了, 真正运行的时候, 才把虚拟地址映射到物理地址(这件事交给MMU来做)。这样, 我们只要把程序链接到一

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值