显存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求诸多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面缓存、页面统计等,并且对性能也有很高的要求。本文从显存管理硬件构架、地址空间界定和显存管理软件构架三个方面入手,尝试对显存管理的软硬件构架做一些宏观上的剖析总结。
显存管理硬件构架
由于显存管理是内核最为核心的一个功能,针对显存管理性能优化,不仅软件优化,硬件构架也做了好多的优化设计。右图是一个目前主流处理器上的储存器层次结构设计方案。
从图中可以看出,对于读写显存linux内核占用cpu高,硬件设计了3条优化路径。
1)首先L1cache支持虚拟地址主存,保证CPU下来的虚拟地址(VA)不须要转换成化学地址(PA)就可以拿来直接查找L1cache,提升cache查找效率。其实用VA查找cache,有安全等缺陷,这须要CPU做一些非常的设计来进行填补。
2)假如L1cache没有命中,这就须要进行地址转换,把VA转换成PA。linux的显存映射管理是通过页表来实现的,并且页表是置于显存中的,假如每次地址转换过程都须要访问一次显存linux数据恢复,其效率是非常低下的。这儿CPU通过TLB硬件单元来加速地址转换。
3)获得PA后linux就该这么学,在L2cache中再查找缓存数据。L2cache通常比L1cache大一个数目级linux内核占用cpu高,其查找命中率也更高。假如命中获得数据,则可防止去访问显存,提升访问效率。
可见,为了优化显存访问效率,现代处理器引入多级cache、TLB等硬件模块(如右图是一款8核MIPS处理器硬件框图)。每位硬件模块内部还有大量的设计细节,这儿不再深入。
【文章福利】小编推荐自己的Linux内核技术交流群:【977878001】整理一些个人认为比较好得学习书籍、视频资料共享在群文件上面,有须要的可以自行添加哦!!!前100进群发放,额外附赠一份价值699的内核资料包(含视频教程、电子书、实战项目及代码)
内核资料直通车:Linux内核源码技术学习路线+视频教程代码资料
学习直通车:Linux内核源码/显存调优/文件系统/进程管理/设备驱动/网路合同栈-学习视频教程-腾讯课堂
显存映射空间界定
依照不同的显存使用方法和使用场景须要,内核把显存映射地址空间界定成多个部份,每位界定空间都有自己的起止地址、分配插口和使用场景。右图是一个常见的32位地址空间界定结构。
持久映射地址空间:内核上下文切换会伴随着TLB刷新,这会造成性能下滑。但一些使用高档显存的模块对性能也有很高要求。持久映射空间在内核上下文切换时,其TLB不刷新,所以它们映射的低端地址空间轮询效率较高。其分配通过kmap插口来申请。kmap与vmap的区别是:vmap可以映射一组page,即page不连续,但虚拟地址连续,而kmap只能映射一个page到虚拟地址空间。kmap主要用于fs、net等对高档显存访问有较高性能要求的模块中。固定映射地址空间:持久映射的问题是可能会休眠,在中断上下文、自旋锁临界区等不能阻塞的场景中不可用。为了解决这个问题,内核又界定出固定映射,其插口不会休眠。固定映射空间通过kmap_atomic插口来映射。kmap_atomic的使用场景与kmap较为相像,主要用于mm、fs、net等对高档显存访问有较高性能要求并且不能休眠的模块中。
不同的CPU体系构架在地址空间界定上不尽相同,但为了保证CPU体系差别对外部模块不可见,显存地址空间的分配插口的语义是一致的。
由于64位CPU通常都不须要高档显存(其实也可以支持),在地址空间界定上与32位CPU的差别较大,右图(大图)是一个MIPS64CPU的内核地址空间界定示例。
显存管理软件构架
内核显存管理的核心工作就是显存的分配回收管理,其内部份为2个体系:页管理和对象管理。页管理体系是一个两级的层次结构,对象管理体系是一个五级的层次结构,分配成本和操作对CPUcache和TLB的负面影响,从上而下渐渐下降。
不仅显存分配,显存释放也是根据此层次结构操作。如释放对象,先释放到per-cpu缓存,再释放到slab缓存,最后再释放到伙伴系统。
框图中有三个主要模块,即伙伴系统、slab分配器和per-cpu(冷热)缓存。她们的对比剖析如下。
原文链接:https://www.cnblogs.com/wahaha02/p/9392088.html