Memory的分页机制,MMU,TLB,Cache,VA及PA,Virtual memory及Physical memory

最近读了一些关于内存管理系统的文章,感觉好多博主讲的很好,大概了解了一些知识,为了避免自己遗忘,根据自己对其他博主文章的理解,在此记录一下自己的想法

首先计算机的memory并不是连续的,是分页的,对于32位系统来说,最多对应4GB的memory,并且每个页的大小是4KB。也就是每4KB,可以看做是一个小的内存块,这4KB空间范围内地址的低12位以上的地址是相同的。

因为使用memory的过程中,程序希望内存是连续的,但是如果只有physical memory的话,很难保证是连续的,因为进程存在着进行和退出,难免会出现内存碎片化,所以这就促使了virtual memory的出现,程序地址在virtual memory中是连续的,达到了内存连续的目的,同时virtual memory和physical memory存在着映射关系,这个映射关系就是通过MMU来实现

假设这个映射关系是由两级的页表实现的,也就是页目录表和页表。如果memory从Disk中读取一个8MB大小的程序,可以先在memory中找出一块空闲的4KB大小的physical memory,用作页目录表(这个页目录表的每个表项分别存储着页表在内存中的物理地址的首地址,大小为1024个表项,也就是对应着1024个页表,每个表项为4字节),此时再从physical memory中找一个空闲的4KB内存页,作为页表(这个页表存储着每个程序数据所在内存页的基地址,共1024个表项,对应着1024个内存页,每个表项为4字节),并将这个页表在physical memory中的基地址存放在页目录表的第一个表项,接着再从physical memory中找一块空闲的内存页存储程序的数据,并将这个存放数据的内存页的基地址存放在页表的第一个表项,同时可以将disk的4KB的程序数据读取到physical memory中。此时页目录表和页表均存储了一个表项,并且已经往内存中读取了4KB的数据。接着同样在physical memory中找空闲的4KB内存页,找到后将基地址放入页表中,并读取数据,重复同样的操作,指导程度数据都读取到了physical memory中,一个页表的1024个表项共可以对应4MB大小的physical memory空间。所以8MB读取完成后,页目录表中占用了两表项,也就是占用了两个页表,这两个页表每个的1024个表项都是存储满的,并另外使用了2048个4KB大小的内存页。

既然存在了virtual memory和physical memory,那么当CPU想通过virtual address(VA)访问physical addrss(PA)的时候,该如何操作呢?每个程度或任务都会将程序存储的页目录表的基地址存储在CPU中的页表基地址寄存器中,在访问数据时,就可以通过线性的VA一级一级查页目录表和页表的方式,找到数据所存储的PA,并将数据读回。

在上述查找地址的过程中,由于要查找多级页表,所以这个过程是非常慢的。这就促使了TLB的产生,TLB存储着部分虚拟地址和物理地址一一映射关系,硬件上是一块cache。相当于就是已经查找好的VA和PA存储在一起,这时如果访问physical memory,如果恰好这个映射关系存在于TLB中,也就是TLB hit,将会以很快的速度读取到想要的数据。如果不存在于TLB中,也就是TLB miss那么将会进行查找表的过程,降低速度。

另外还有一个对于程序透明的部分是cache,这部分的存在是为了加速内存的访问,位于CPU和memory之间,因为CPU和memory之间存在着巨大的速度差距,所以设计了一级到多级cache,加速内存的访问。cache有多种组织形式,不过常用的一般是PIPT及VIPT。PIPT不存在别名和歧义问题。

当然上述的这些都有很多的实现细节问题要注意,此处只是根据自己的理解,宏观的描述了一些概念。
仅仅是初步学习,内容肯定有许多错误,希望多多指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值