首先要进行分段还是分页?那要搞清楚怎么用
我们先通过分段机制映射一次地址,再经过分页机制映射到物理地址。
所以这两者谁先谁后没有区别,都行。
利用基址和界限寄存器,操作系统很容易将不同进程重定位到不同的物理内存区域。但是,对于这些内存区域,栈和堆之间,有一大块“空闲”空间。栈和堆之间的空间并没有被进程使用,却依然占用了实际的物理内存。因此,简单的通过基址寄存器和界限寄存器实现的虚拟内存很浪费。
分段可以使软件的内存从0开始,每个软件自动分配一个基值,然后软件本身一直用变址,就是如此
在典型的地址空间里有3个逻辑不同的段:代码、栈和堆。分段的机制使得操作系统能够将不同的段放到不同的物理内存区域,从而避免了虚拟地址空间中的未使用部分占用物理内存。
首先明确一点,MMU(Memory Management Unit),即内存管理单元,的主要工作只有一个,就是把虚拟地址映射到物理地址。
MMU负责的是虚拟地址与物理地址的转换. 提供硬件机制的内存访问授权.(现代 CPU 的应用中,基本上都选择了使用 MMU)
栈和其他的内存段有一点关键区别,就是它反向增长,因此地址转换必须有所不同。首先,我们需要一点硬件支持。除了基址和界限外,硬件还需要知道段的增长方向(用一位区分,比如1代表自小而大增长,0反之)。
为了支持共享,需要一些额外的硬件支持,这就是保护位(protection bit)。基本上就是为每个段增加了几个位,标识程序是否能够读写该段,或执行其中的代码。通过将代码段标记为只读,同样的代码可以被多个进程共享,而不用担心破坏隔离。虽然每个进程都认为自己独占这块内存,但操作系统秘密地共享了内存,进程不能修改这些内存,所以假象得以保持。
分段也带来了一些新的问题。第一个是老问题:操作系统在上下文切换时应该做什么?答案显而易见:各个段寄存器中的内容必须保存和恢复。每个进程都有自己独立的虚拟地址空间,操作系统必须在进程运行前,确保这些寄存器被正确地赋值。