显存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求诸多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,并且对性能也有很高的要求。本文从显存管理硬件构架、地址空间界定和显存管理软件构架三个方面入手,尝试对显存管理的软硬件构架做一些宏观上的剖析总结。
显存管理硬件构架
由于显存管理是内核最为核心的一个功能,针对显存管理性能优化,不仅软件优化,硬件构架也做了好多的优化设计。右图是一个目前主流处理器上的储存器层次结构设计方案。
从图中可以看出,对于读写显存,硬件设计了3条优化路径。
1)首先L1cache支持虚拟地址主存,保证CPU下来的虚拟地址(VA)不须要转换成化学地址(PA)就可以拿来直接查找L1cache,提升cache查找效率。其实用VA查找cache,有安全等缺陷,这须要CPU做一些非常的设计来进行填补,具体可以阅读《计算机体系结构:量化研究方式》了解相关细节。
2)假如L1cache没有命中,这就须要进行地址转换,把VA转换成PA。linux的显存映射管理是通过页表来实现的,并且页表是置于显存中的,假如每次地址转换过程都须要访问一次显存,其效率是非常低下的。这儿CPU通过TLB硬件单元来加速地址转换。
3)获得PA后,在L2cache中再查找缓存数据。L2cache通常比L1cache大一个数目级linux内核占用cpu高,其查找命中率也更高。假如命中获得数据,则可防止去访问显存,提升访问效率。
可见linux环境变量,为了优化显存访问效率,现代处理器引入多级cache、TLB等硬件模块(如右图是一款8核MIPS处理器硬件框图)。每位硬件模块内部还有大量的设计细节,这儿不再深入,如有兴趣可以阅读《计算机体系结构:量化研究方式》等书籍进一步了解。
C/C++Linux服务器开发精彩内容包括:C/C++,Linux,Nginxlinux内核占用cpu高,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,P2P,Linux内核,Docker,TCP/IP,解释器,DPDK多个中级知识点分享linux系统日志,视频获取+qun:正在跳转
显存映射空间界定
按照不同的显存使用方法和使用场景须要,内核把显存映射地址空间界定成多个部份,每位界定空间都有自己的起止地址、分配插口和使用场景。右图是一个常见的32位地址空间界定结构(点击见大图)。
不同的CPU体系构架在地址空间界定上不尽相同,但为了保证CPU体系差别对外部模块不可见,显存地址空间的分配插口的语义是一致的。
由于64位CPU通常都不须要高档显存(其实也可以支持),在地址空间界定上与32位CPU的差别较大,右图(大图)是一个MIPS64CPU的内核地址空间界定示例。
显存管理软件构架
内核显存管理的核心工作就是显存的分配回收管理,其内部份为2个体系:页管理和对象管理。页管理体系是一个两级的层次结构,对象管理体系是一个五级的层次结构,分配成本和操作对CPUcache和TLB的负面影响,从上而下渐渐下降。
不仅显存分配,显存释放也是根据此层次结构操作。如释放对象,先释放到per-cpu缓存,再释放到slab缓存,最后再释放到伙伴系统。
框图中有三个主要模块,即伙伴系统、slab分配器和per-cpu(冷热)缓存。她们的对比剖析如下。