Linux页表

        虽然应用程序操作的对象是映射到物理内存之上的虚拟内存,但是处理器直接操作的却是物理内存。所以当应用程序访问一个虚拟地址时,首先必须将虚拟地址转化成物理地址,然后处理器才能解析地址访问请求。地址的转换工作需要通过查询页表才能完成,地址转换需要将虚拟地址分段,使每段虚拟地址都作为一个索引指向页表,而页表项则指向下一级别的页表或指向最终的物理页面。

       Linux中使用三级页表完成地址转换。利用多级页表能够节约地址转换需要占用的存放空间。如果利用三级页表转换地址,即使是64位机器,占用的空间也很有限。但是如果使用静态数组实现页表,那么即便在32位机器上,改数组也将占用巨大的存放空间。Linux对所有的体系结构都使用三级页表管理内存。

       顶级页表是页全局目录(PGD),它包含了一个pgd_t类型数组,多数体系结构中pgd_t类型等同于无符号长整形类型。PGD中的表项指向二级页目录中的表项:PMD。

        二级页表是中间页目录(PMD),它是个pmd_t类型数组,其中表项指向PTE中的表项。

        最后一级的页表简称页表,其中包含了pte_t类型页表项,该页表项指向物理页面。

        每个进程都有自己的页表,内存描述符的pdg域指向的就是进程的全局目录。操作和检索页表时必须使用page_table_lock锁,该锁在相应的进程的内存描述符中,以防止竞争条件。


        由于几乎每次对虚拟内存中的页面访问都必须先解析,从而得到物理内存中的对应地址,所以页表操作的性能非常关键。但是不幸的是,搜索内存中的物理地址速度很有限,因此为了加快搜索,多数体系结构都实现了一个翻译后缓冲器(translate lookaside buffer ,TLB)。TLB作为一个将虚拟地址映射到物理地址的硬件缓存,当请求访问一个虚拟地址时,处理器将首先检查TLB中是否缓存了该虚拟地址到物理地址的映射,如果在缓存中直接命中,物理地址立刻返回,否则就需要再通过页表搜索需要的物理地址。

猜你喜欢

转载自woodding2008.iteye.com/blog/2344967