首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

三种内存管理机制下的MMU

三种内存管理机制下的MMU

一、连续内存分配

在这里插入图片描述
MMU中有两个寄存器,基地址寄存器(base)和界限寄存器(limit),对应当前执行的进程的基地址和地址空间的大小——一个进程对应一对base和limit。

MMU先把CPU传来的逻辑地址和limit的值比较,合法的值是小于limit的,且是严格小于,因为刚好等于limit时,已经超出进程的地址空间了。地址不合法会发生寻址错误,陷入trap。
二、分段

在这里插入图片描述

MMU要做的事情就是:把逻辑地址分成s=段号、d=偏移量两部分,用段号作为索引去查段表(MMU里应该有个段表的指针),段表也在内存里,所以它也有基地址和大小,分别存在STBR(segment-table base register)和STLR(segment-table limit register中),这两个寄存器应该也是在MMU中的。

和第一种方式一样,MMU中还是有两个寄存器,base和limit,但已经不再是对应一个进程了,而是对应一个进程中的一个段。 段表大致内容如下:
在这里插入图片描述

随着进程间的切换,MMU中的段表指针会发生变化。

当MMU查段表时,先把段表中对应段号的基地址和长度赋值给base和limit寄存器。再判断逻辑地址中偏移量的是否小于limit,若是,将逻辑地址中的段号部分换成base,否则发生寻址错误。
三、分页

在这里插入图片描述

和分段差不多,页表=>段表。

这里先引入一个TLB的概念,translation look-aside buffers,转换检测缓冲区,它的特征是支持并行搜索,所以查询速度很快。其中每一行都保存着一个由单个PTE(Page Table Entry,页表项)组成的块。(TLB不在内存中,用SRAM实现)

当MMU获得一个CPU传来的逻辑地址,还是先把地址分成页号(page number)和偏移量两部分。

然后把页号作为索引,去查TLB,如果在TLB中查到了这个页号对应的帧号(frame number),我们把这个结果叫做TLB命中,即TLB hit,然后把逻辑地址中的page number替换为frame number。

如果没有命中,则为TLB失效,即TLB miss,这时候就需要去查页表了。
页面在内存中,所以和段表一样,也有PTBR(page-table base register),和PTLR(page-table limit register)。

在页表中用页号作为索引得到帧号,就把逻辑地址中的页号替换为帧号,由此得到了物理地址。

最后还要做的一步:把这次查到的页号和对应的帧号和一些信息增加到TLB中,这样下次再用就可很快查找到(局部性原理)。

如果TLB中的条目已满,那么操作系统会选择一个来替换。替换策略很多,从最近最少使用替换(LRU)。可以参照page replacement相关算法。

另外,有的TLB允许有些条目固定下来,也就是说它们不会从TLB中被替换,通常内核代码的条目是固定下来的。——所以TLB是针对所有的进程的。
返回列表