首页 百科知识 分页机制及地址映射

分页机制及地址映射

时间:2024-10-09 百科知识 版权反馈
【摘要】:为此,Linux采用了三级页表结构,以利于节省物理内存。三级分页管理把虚拟地址分成四个位段:三级分页结构是Linux提供的与硬件无关的分页管理方式。当Linux运行在某种机器上时,需要利用该种机器硬件的存储管理机制来实现分页存储。Linux内核中对不同的机器配备了不同的分页结构的转换方法。Linux使用do_mmap()函数完成可执行映像向虚存区域的映射,由它建立有关的虚存区域。若file为NULL,称为匿名映射。

4.3 Linux分页机制及地址映射

Linux系统本身支持三级分页结构,在I386体系结构中实现的是两级分页机构。

页表是从线性地址向物理地址转换中不可缺少的数据结构,而且它使用的频率较高。页表必须存放在物理存储器中。如果虚存空间有4GB,按4KB页面划分页表,则可以有1M页。若采用一级页表机制,页表有1M个表项,每个表项4字节,这个页面就要占用4MB的内存空间。由于系统中每个进程都有自己的页表,如果每个页表占用4MB,对于多个进程而言就要占去大量的物理内存,这是不现实的。

在目前用户的进程不可能需要使用4GB这么庞大的虚存空间,若使用1M个表项的一级页表,势必造成物理内存极大的浪费。为此,Linux采用了三级页表结构,以利于节省物理内存。三级分页管理把虚拟地址分成四个位段:

页目录、页中间目录、页表、页内偏址。

系统设置三级页表系列:

页目录PGD(PaGe Directory)

页中间目录PMD(Page Middle Directory)

页表PTE(Page TablE)。

三级分页结构是Linux提供的与硬件无关的分页管理方式。当Linux运行在某种机器上时,需要利用该种机器硬件的存储管理机制来实现分页存储。Linux内核中对不同的机器配备了不同的分页结构的转换方法。对I386,提供了把三级分页管理转换成两级分页机制的方法。其中一个重要的方面就是把PGD与MGD合二为一,使所有关于PMD的操作变为对PGD的操作。

在/include/asm-i386/pgtable.h中有如下定义:

#define PTRS_PER_PTE 1024

#define PTRS_PER_PMD 1

#define PTRS_PER_PGD 1024

地址的映射机制,主要完成主存,辅存和虚存之间的关联。包括磁盘文件到虚存的映射和虚存与内存的映射关系。地址映射就是在几个存储空间(逻辑地址空间、线形地址空间、物理地址空间)或存储设备之间进行的地址转换。

在多进程操作系统中,同时运行多个用户的程序,系统分配给用户的物理地址空间放不下代码和数据等。为了解决这个矛盾而出现了虚拟存储技术。在虚拟存储技术中,用户的代码和数据(可执行映像)等并不是完整地装入物理内存,而是全部映射到虚拟内存空间。在进程需要访问内存时,在虚拟内存中“找到”要访问的程序代码和数据等。系统再把虚拟空间的地址转换成物理内存的物理地址。

Linux使用do_mmap()函数完成可执行映像向虚存区域的映射,由它建立有关的虚存区域。do_mmap()函数定义在/mm/mmap.c文件中:

unsigned long do_mmap(struct file * file, unsigned long addr,unsigned long len,

           unsigned long prot,unsigned long flags, unsigned long off)

addr虚存区域表示在虚拟内存空间的开始地址,len是这个虚存区域的长度。file是指向该文件结构体的指针,off是相对于文件起始位置的偏移量。若file为NULL,称为匿名映射(anonymous mapping)。

prot指定了虚存区域的访问特性:

PROT_READ  0x1 对虚存区域允许读取。

PROT_WEITE 0x2 对虚存区域允许写入。

PROT_EXEC  0x4 虚存区域(代码)允许执行。

PROT_NONE  0x0 不允许访问该虚存区域。

flags指定了虚存区域的属性:

MAP_FIXED  指定虚存区域固定在addr的位置上。

MAP_SHARED 指定对虚存区域的操作是作用在共享页面上。

MAP_PRIVATE指定了对虚存区域的写入操作将引起页面拷贝。

Linux的地址映射如图4-5所示。

img18

图4-5 Linux地址映射

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈