It's our wits that make us men.

MMU

Posted on By CQR

1.局部变量可以放在进程的堆栈区,也可以直接用寄存器。

2.CPU无论是取内存中的指令,还是要读写指令中的内存数据,都是通过MMU将虚拟地址转成物理地址。具体过程如下:GDTR保存了全局段描述符表在内存中的起始物理地址,CS索引了代码段描述符在全局段描述符表的哪一项。根据CS+GDTR的内容可知道代码段在内存中的基地址,这个基地址+PC指针即形成了线性地址。系统寄存器CR3保存了第一级页表在内存中的物理地址。线性地址的最高10位是第一级页表的索引,即CR3+线性地址[31-22]的内容就是第二级页表的物理地址。线性地址的中间10位是第二级页表的索引,即CR3+线性地址[21-12]的内容就是4K页表的起始地址。这个起始地址+线性地址最低12位地址[11-0]即形成了所要读写内存的最终物理地址。每次执行新的进程,CR3都会被刷新。即不同的进程有不同的目录和页表。这种机制使得,即使不同程序的虚拟地址是一样的,也可以给程序设置不同的目录和页表,将程序映射到不同的内存空间中。下面三个图就比较形象地说明了这个过程:

3.为了避免每次都要访问目录和页表才能得到物理地址,CPU增加了一个高速缓冲存储TLB,即将当前进程的页表项缓存在TLB中。这样CPU每次读写内存时都要先查询TLB是否缓存了当前线性地址的页表项。TLB每一项由三部分组成:标记,页面物理地址和有效标志。TLB是分组的,一般是16组,每组有4项。线性地址的高20位地址分成两部分,一部分是TLB的组索引TLBI,一部分是标记TLBI。首先通过线性地址的组索引找到相应的TLB组,再通过线性地址的标记逐一比较4项中的标记是否有一样的,如果有一样的,再查看是否有效,如有效即命中,即从这项中取出页面物理地址。

4.程序的装载过程: