`

MMU与程序多任务运行

阅读更多
MMU即Memory Management Unit(内存管理单元)的缩写,百度搜索“MMU”您将看到对MMU的较为准确和全面的描述。那么我们的程序在多任务环境下加载运行时,MMU起到什么作用作用呢?如何理解每个程序都运行在独立的空间呢?这就是本文要解决的问题。

我们知道,MMU的主要工作就是将程序的虚拟地址(编译器和链接器计算的)转换成内存的物理地址(硬件电路决定的)。

另外我们还要知道,任意两个程序,虚拟地址都是重复的,更何况我们运行两次同一个程序的情况(我们知道,程序只是存储器中的数据而已,加载运行后我们称之为“进程”,同一个程序可以多次运行形成多个进程。另外,一个程序运行起来不一定只有一个进程)。

那么,如何区分这样重复的虚拟地址呢?见后文。

同样的虚拟地址,映射成不同的物理地址,我们将这个映射关系组织成一种数据结构,存放在MMU的重定位寄存器中,重定位寄存器(寄存器成本高啊)较少,无法存储那么多(我们运行的程序多啊,而且每个程序都有很多的段)映射关系的数据。没关系,我们在这些寄存器中安排一个(通常是最后一个)寄存器存放存储在内存中某个位置的一个页表中,这个页表的每个子页表存储了映射关系数据。内存比寄存器大多了吧,足够用了。

以下两段摘自:http://www.360doc.com/content/10/0209/11/829246_15515058.shtml

构建多任务的一种方法是创建一组独立的页表,每个映射到唯一的任务空间。为了激活某个人任务,对应这个任务的那组页表和其虚拟内存空间由MMU使用,没有激活的页表代表睡眠的任务。这种方法使所有任务都驻留在内存中,当发生上下文切换时可以立即使用。

在上下文切换时通过激活不同的页表,使得在重叠的虚拟地址执行多任务成为可能。MMU可以通过重定位任务地址而不需要移动在内存中的任务。任务的物理内存只是简单的通过激活与不激活页表来实现映射到虚拟内存。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics