赞
踩
在 Linux 系统中系统和磁盘文件进行 IO 的基本单位是 4KB(8个扇区),操作系统对内存的管理不是以字节为单位,同样是以内存块为单位的,默认大小也为 4 KB。就算一个在磁盘中的文件,都是以 4KB 分块为单位进行存储数据,当我们需要加载该文件的时候同样是以 4KB 进行传入到物理内存中的。
以上的 4KB 的数据存储以及数据传输,都是操作系统精心设计好的,因为操作系统对于内存的管理工作,基本单位是 4KB。即使是一个子进程对某个整型数据进行写时拷贝的时候,进行写时拷贝也是直接拷贝 4KB,而不是 4Byte。对于在物理内存中的这种 4KB 的数据块,被我们称为页框或者页帧。(对于写时拷贝就是将数据所在的整个页框进行拷贝,因为当子进程对某个数据进行修改的情况下,有很大的概率对这数据附件的数据进行修改,也就是我们的局部性原理,所以这是一种空间换时间的做法)
在我们的进程地址空间中有着 4GB 的内存空间,物理内存的页框的大小为 4KB,也就是意外着我们的物理内存中有着 4GB / 4KB = 1,048,576 个页框。则我们的操作系统将我们的物理内存管理起来的动作为使用一个数组来标记每个页框(struct page memory[1048576]),页框也拥有着自己的数据结构(struct page),在该数据结构中拥有这该页框的模式是读还是写,是否被占用等信息等等。操作系统访问对应的页框时,就是使用数组的下标乘上 4KB,就找到该页框的起始地址,所以对于物理内存的管理,就是对数组的增删查改。
对于页框 struct page 也是存在对应的类型的,比如有些可以用来做文件缓冲区所需的内存,在文件系统中就会有特定的属性结构按照某种特定顺序指向对应的物理内存,然后就可以充当文件的缓冲区了。(当然页框还存在许多其他的类型,这里仅仅只是用文件缓冲区做例子)
我们的页表是用来从进程的虚拟地址映射到对应的物理地址中的一个工具,我们的页表可以映射虚拟地址 4GB 的地址,也就意味着在页表的映射中,不可能是一个虚拟地址映射一个物理地址,因为这样的话光是页表就会占 4GB 以上的空间。
页表还可以检测我们需要访问的物理空间是否合法以及判断要访问的空间是可读的还是可写的,这些功能和操作系统管理物理内存的数组 struct page memory 有关,在数组元素中有着该页框的属性标记。
虚拟地址为 4GB,刚好使用 32 位就可以 4GB 的数据,所以对于任意的一个地址一定是 32 位的,因为刚好可以映射到对应的 4GB 内存上,且每个地址都不一样。页表映射地址示意图如下:
如上所示,以 32 的虚拟地址的前十位可以用来在第一个页目录中查找对应的位置(10位可以表示1024个元素,则第二组有着1024个页表),然后根据第二个 10 位来查找第二组目录,就可以定位到是在物理内存中的哪个页框,最后根据最后的12位可以计算出在页框中的偏移量,达到内存元素的精准定位。(但是我们的查找到一个元素也仅仅只是找到该元素的起始地址,并不知道该元素占几个字节,那么是如何识别该元素的呢?依靠元素的类型,依靠元素的类型计算该元素有几个字节,取数据的时候就可以起始地址加偏移量的方式取出整个元素)
其实以上的这些操作直接就是在我们的 CPU 内直接计算得出的,经过 CPU 直接就得出了对应的物理地址,在 CPU 内有着对应的页表起始地址寄存器,记录虚拟地址的寄存器以及计算物理地址的单元 MMU。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。