Chinaunix首页 | 论坛 | 博客
  • 博客访问: 872724
  • 博文数量: 204
  • 博客积分: 2433
  • 博客等级: 大尉
  • 技术积分: 2205
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-05 13:32
文章分类

全部博文(204)

分类: LINUX

2011-04-20 09:53:13

VM是计算机体系结构中非常重要的一部分。其中涉及CPU、操作系统等。
除了一些嵌入式和某些Cray公司的CPU,现代CPU几乎全部使用了VM的概念。在CPU内部,与之相对应的两个部件分别为MMU和TLB。本文介绍VM,TLB及Linux系统中常会用到的hugetlbfs。

下面首先介绍何谓VM。
众所周知,计算机的存储由register, cache, memory和disk形成hiberarchy。为了更有效的进行内存管理和操作,比如代码共享、内存保护等,人们提出了VM的概念。VM是对物理内存 的一种抽象。通过硬件异常,内存地址翻译,主存,磁盘文件和内核文件的交互,VM为每个进程提供了一个大的、一致的、私有地址空间。VM提供三个重要的功 能:1.将主存看成磁盘地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存间传递数据,从而高效的使用主存;2.为每个进程提供一致的 地址空间,从而简化存储器管理;3.保护了每个进程的地址空间不被其他进程破坏。

32位操作系统中,每个进程拥有4GB虚拟空间,其中3GB用于用户空间,1GB属于内核空间。用户空间从0x08048000地址开始存放应用程 序的文本段和数据段,在0x40000000开始存放共享库,在0xc000000向下开始栈。这些虚拟地址按照默认4KB的大小进行分页,并以页为单位 与内存进行映射。注意该映射并非连续,很多情况下是非连续的。这种映射需要虚拟地址到物理地址之间的地址翻译。这些操作由MMU完成。

对于一个虚拟地址,MMU首先根据地址中的PTE对TLB进行查询,如果命中,则根据页表中的物理地址首地址加上虚拟地址偏移量形成物理地址。如果不命中,则TLB从L1中查询页表,L1从主存查询页表,直至页表被放置在TLB中,从而完成虚拟地址到物理地址的翻译。

页表可能存放在TLB,L1和主存中。每个进程的控制数据结构里面都有一个当前页表的地址,并把此地址放在PDBR页表基址寄存器中。在进程切换的时候,该寄存器同时发生改变,从而实现每个进程虚拟空间的不同。

对于小的VM页面而言,可以有效的组织物理内存,避免物理内存的浪费。但如果我们申请的地址空间比较大,如几百兆的地址空间,这时如果对该地址空间 进行持续的操作,会造成TLB的颠簸,即,页面不断的调入调出,造成VM页面调度的巨大压力。为了解决这个问题,产生了huge page的操作。即页面不再是默认的4K,而是4M甚至更多。这样虚拟地址在物理内存中的映射会变成较大的连续空间,并且每个页表对应的物理空间也更大, 可以有效的解决页面调度问题。(如果页面过小,则会造成内存碎片,严重可能造成必须重启系统来解决应用程序的稳定)。

linux操作系统中,对应的方法是使用hugetlbfs。通过mount一个大页文件系统,然后通过mmap的文件映射,使得该文件系统中的内存操作实现大页调度,从而解决TLB shrashing的问题

阅读(4152) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~