为什么灵动岛不显示 (为什么Linux现在才开始使用它-什么是TLB和PCID-为什么要有PCID)

文章编号:8970 更新时间:2024-02-20 分类:互联网资讯 阅读次数:

资讯内容

最近CPU爆出的大bug占领了各大头条,这对我们技术爱好者来说反倒是件好事。这不,原先没人关心的TLB,cache啥的开始出现在报纸上了,这是技术的春天来了吗?说不定我可以给某个纸面媒体发篇文章呢。不过其中有些不准确的信息让人颇为担心:

PCID这个在Westmere(1代酷睿,怎么知道我的电脑是酷睿几代呢?)就已经有的功能,现在相信大家所有使用中的IntelCPU都有这个特性,什么时候变成高级功能了?

关于PCID的文章很少,相信不少同学好奇它是什么?本文就来为你解惑。要介绍它,的要从TLB说起。

TLB和页表 为什么灵动岛不显示为什么Linux现在才开

我们在前文(Cache是怎么组织和工作的?)简单介绍了TLB,这里稍微回顾一下。

我们都知道地址分为逻辑地址(虚拟地址)、线性地址和物理地址。一个虚拟地址变换成物理地址的简单过程如下图,我就不详细说明了:

变换过程中线性地址到物理地址需要用到页表(pagetable)。页表由很多项组成,每一项叫一个页表项,整个页表由操作系统维护,并放置在内存中(或磁盘中)。从上文(L1,L2,L3Cache究竟在哪里?)我们知道,一次内存访问需要数百个时钟周期,如果每次地址转换都要查看内存页表也太浪费时间了。现代计算机为了加速这一过程,引入了翻译后援缓冲器TLB。TLB可以看作页表的Cache,CPU每次转换地址都会查看TLB,如果有了就不用去取内存页表了。TLB和Cache一样,也分级,分为L1和L2,还有数据TLB和代码TLB等等。

我们知道,现代操作系统进程地址空间都是分隔开来的,同一个线性地址VA1,在进程1中会被翻译成物理地址PA1,在进程2中也许会被翻译成PA2。它们的这种对应关系是因为不同的进程有不同的页表,页表的切换是在进程切换时候把页目录指针放入寄存器CR3来实现的。假如不做任何的处理,那么在进程1切换到进程2的时候,TLB中同时存在了1和2进程的页表数据,会造成混乱。这就需要我们在进程切换的时候清除TLB,给新换入的进程留下一个干净的空间。

但这样做会造成性能的损失。空空如也的TLB必定会带来极大的TLBmiss而不得不从主存调取页表,这将消耗数百个时钟周期。从前文(Cache是怎么组织和工作的?)我们还知道这样做还会进一步放大Cache的miss。我们管这种空TLB叫做coldTLB,它需要随着进程的运行warmup起来才能慢慢发挥起来效果,而在这个时候有可能又会有新的进程被调度了,而造成TLB的颠簸效应。如何做才能优化TLB的呢?

GlobalTLB和non-globalTLB

现代OS都将地址空间分为内核空间和用户空间。内核空间ring0访问,用户空间ring3访问。相信这些最基本的知识大家都耳熟能详了,我就不再啰嗦了。内核空间内容基本各个进程(包括内核线程)都差不多,内核地址空间是一样的,因此对于这部分地址翻译,无论进程如何切换,内核地址空间转换到物理地址的关系是永远不变的,在进程的时候,不需要清掉。对于用户空间,各个进程的内容都不太一样,保留只会造成混乱,需要清掉。

在这种思路引导下,CPU在加载CR3的时候,只会清掉不带Global标志的用户空间页表TLB,而不会动带有global标志的内核页表项。一个新的进程会开始一个半新的TLB,效能提高不少。

按照这种思路走下去,那就要思考,有没有别的办法能够不刷新TLB呢?有办法的,那就是PCID。

PCID(进程上下文标识符)是在Westmere架构引入的新特性。简单来说,在此之前,TLB是单纯的VA到PA的转换表,进程1和进程2的VA对应的PA不同,不能放在一起。加上PCID后,转换变成VA+进程上下文ID到PA的转换表,放在一起完全没有问题了。这样进程1和进程2的页表可以和谐的在TLB中共处,进程在它们之前切换完全不需要预热了!

所以新的加载CR3的过程变成了:如果CR4的PCID=1,加载CR3就不需要FlushTLB。

一切看起来很美好,PCID这个在多年前就有了的技术,现在已经在每个IntelCPU中生根了,那么是不是已经被广泛使用了呢?

标签: 操作系统Linux中央处理器CPU

本文地址: https://yihaiquanyi.com/article/2d2781b28af2ffa707b1.html

上一篇:硬件奥秘深探究硬件篇深入PCI与PCIe之一...
下一篇:cstate支持选C1C3C6C7C8C10CStates二CPU省...

发表评论