VirtualMemory重温

呃,以前考过好几遍了,但是发现和具体问题结合起来仍旧会有认识不好的地方。在总结下吧。

 

总结时候就用ps3(其实就是linux,涉及到权限说一声,我赶紧删除,囧)来做实际结合(唔,不敢保证都正确,对照书,文档和自己理解来吧)

 

virtual memory本质上属于一种抽象表示,让system可以脱离开硬件的限制(比如memory大小)来工作。

所以cpu与之交互的是virtual address,cpu每写一个byte,实际是对一个virtual address进行操作,然后这个virtual address再转换成物理地址,最后落实到写到一个memory上去。

 

virtual address到物理地址映射由page table完成,映射的最小单元是page,page table的条数就是virtual_memory_size/page_size。所以page table有可能很大,查询地址映射过程也可能很慢,这里就会对这个映射进一步做一个cache,也就是translation lookaside table。

 

体系结构书上讲virtual memory映射有segment(size变化的)和page(size固定的)的两种,但是在ps3系统中segment变成process address映射到virtual address的东东了,所以这个多少有些出入,以实际应用为准吧,毕竟这是想怎么弄怎么弄的东西,完全看实现OS的人的心情,囧。

 

virtual memory使用的时候会遇到page fault,就是用到的virtual memory部分没有对应的physical memory呢,这时候就要做换页了,涉及到换页策略问题(FIFO,Priority...)。然后page size也是一个影响因素,影响到碎片,交换效率,cache效率等等,好在这一般是OS实现者操心的事情,实际应用中,我们一般就2选择64k和1M,好了坏了试下就知道了。

 

这些事情都是有操作系统来完成,基本概念如此,实际实现中有很多可以变化的地方。

 

在现在操作系统中,可以是多process的,那么每个process有个地址空间,形成一个segment,segment再通过segment table map到virtual address, virtual address在通过page table map到物理地址

 

下面结合ps3上的一堆概念,来看下:


PS3上相应一堆概念:

在ps3上,概念复杂一些,首先有个virtual address

 

  • LPAR----logical partition, (wikipedia上说)一个电脑可以划分成多个LPAR,每个LPAR可以承载一个操作系统,是一个硬件资源的子集。应也就是物理地址。
  • VirtualAddress----80bit 的address, 它通过page map到LPAR,page size可以指定,64k或者1M。
  • EffectiveAddress----64bit address used by PPU. spu和ppu交互用的地址就是这个。其实是一个segment的概念,是以256M大小map到virtual address space
  • SLB : segment lookaside table :这个和TLB很像,TLB是一个virtual address到physical address转换的page table的cache,SLB是effective address到virtual address mapping信息(segment table)的cache。
  • TLB:上面说了呃。
  • Process address space----是针对effective address来说的(segment的概念),从0到0xffffffff,然后每个segment map到不同的virtual address,这样不同的process不会互相访问彼此的address。
  • LocalStorage----专门给spu访问的。
  • TLS----thread local storage----专门给某个thread访问的storage。

一些memory management的相关概念

 

ps3操作系统提供了一些memory相关函数来用,

  • 直接操作系列:sys_memory_allocate:alloc page size为单位的memory,map到process address上,然后返回map好的process address space上的地址。这种就是操作map好的memory
  • 自己map系列:sys_mmapper_xxx系列,这个就要自己手动去alloc一个物理地址,然后alloc一块process address,然后自己map。这种对于高杆一些的memory管理很有用。

virtual memory:

  • 除了256M main memory之外,还可以弄最多不超过256M的virtual memory,可以给ppu,spu用,对于一些memory巨缺的项目这个是相当有帮助的,当然这也是托了ps3标配硬盘的福,360就没这个能力了。
  • 初始化设置的时候,可以通过函数把virtual memory map到physical memory上,比如做100M map到40M这样的,出现miss,就自己换页。
  • Page fault----当游戏访问一个没有physical memory的virtual memory的时候,系统会试着去alloc一个physical memory。如果没有phsical memory可以alloc了,就交换出一个page(根据一些优先级规则),然后腾出一个地方。整个交换时间可能比较长,这个时候线程会sleep,甚至出现切换线程的情况。

小结下,总之说来我们在游戏里面用的pointer一类东西,里面是process address的逻辑地址。

这个逻辑地址通过segment table到virtual address, virtual address 通过page table到physical address。

physical address的allocate free等操作由操作系统管理,可以在游戏中调用相应函数来操作。


 

 

 

 

 

 

你可能感兴趣的:(LowLevel,ps3,table,translation,cache,游戏,64bit)