总线

基本概念

电脑当中不同的设备之间交互数据需要通路,比如CPU要和内存交互数据,那CPU就需要搭建一条通往内存的电路,CPU要和显卡交互数据,那CPU就要搭建一条通往显卡的电路,电脑当中不同设备交互数据的通路,就被我们称之为总线

总线毕竟是建立在物理学准则上的,你不可能瞬间把所有的数据秒传,因此总线和道路一样,数据传输也是有一定速度限制的,你在单位时间内只能传输一定数量的数据,总线的数据传输能力,就被我们成为带宽(bandwidth)

总线又分为串行总线并行总线, 常见的 USB 即 Universal Serial Bus 通用串行总线, 时至今日已经发展的很充分了

20240303205648

早些年的老式设备都是采用并行传输的,而现在的设备都采用串行传输. 那这不是退步了吗? 并行明显比串行好啊,4车道肯定比1车道要好啊,但是事实上并行改串行不仅不是退步,反而是巨大的进步

20240303205114

并行传输总线是多个数据同步传输,那就需要做到三个点

而串行总线就一个一个传过去就可以了. 并行总线需要照顾数据的协同传输,这就导致了并行总线的频率不能做的很高. 而对于串行总线来讲就没有这个问题,因为只有一条链路, 我就可以把频率做的很高很高,速度上去了就弥补了虽然一次只能传输一个数据的缺陷了

如果玩过FPS枪战射击游戏的同学应该知道,霰弹枪,也就是喷子,一次虽然可以喷出去很多子弹,但是霰弹枪的射速都不是很快,而机枪虽然一次只能发射一发子弹,但是可以做到很高的射速,这里霰弹枪就好比是并行总线,而机枪就好比是串行总线

并行总线两根相邻的链路之间由于是数据同时传输的,就会导致严重的干扰,而且并行的链路越多,这种干扰就越强,因此并行总线还需要加强抗干扰的能力,否则传输过程中数据可能就会发生损坏,而如果真的传输过程中数据故障了,假设传送了10个数据过去,有两个因为干扰出问题了,那你就还需要重新对齐数据再传输,如果是串行总线,一个数据出错了,你只需要重新传一个过去就可以了

20240303210201

除此之外并行总线的接口也是很大的问题. 因为并行总线是多链路一块传输数据的,这就导致他需要很多线,然后接口需要很多的针脚,所以一些看老式计算机里的并行接口,就会发现这些线都是扁平的而且很宽(如下图 IDE cable 所示),就是因为并行的链路很多,而且接口也做的异常的大,针脚的数量也是异常的多,线宽,针脚多,接口大,这对装机来讲就造成了很多不必要的麻烦,比如走线不方便,接口体积大占地,然后针脚还容易不小心弄弯了,也正是因为并行总线的这些缺点,后来我们的电脑里的总线就逐渐全部从并行换代成了串行

20240303210606

这里值得一提的是对于 PCIe 接口看起来也是密密麻麻的并行接口,但其实 PCIe 是串行总线,只不过串行总线同样可以做多链路传输,不过和并行的多链路不一样,串行的多链路,每根链路是独立的数据,相互之间没有关系,不像并行那样所有链路的数据是同步的

20240303210817

20240303210945

并行总线为了保证数据的同步,需要作出很多的牺牲,而串行总线虽然一次只能传输一个单位的数据,但是由于受到的限制少,可以把频率做的很高,这样就能把速度提上去了,因此串行总线才是未来的主流,所以我们的电脑都在使用串行总线而放弃了并行总线

PCI

早些年在微型电脑进入普通民用家庭的时候,电脑当中不同的设备所使用的总线接口是完全不一样的,声卡用着声卡的接口,网卡用着网卡的接口,显卡用着显卡的接口,而且最要命的是,不同品牌的接口还不一样,这就导致了你选择一块主板后,其搭载了什么总线接口,你就可以使用什么样接口的设备,你将来升级也只能使用这个接口的设备,这样的情况就造成了很多的局限性,而且对于硬件规格的统一带来了很多的麻烦

为了解决这个情况当时业内的电脑巨头IBM就联合intel为他们的PC/AT电脑制定了一个接口的标准,这就是大名鼎鼎的ISA总线

20240303215919

由于兼容性好, ISA 在上个世纪80年代是最广泛采用的系统总线,不过它的弱点也是显而易见的,由于使用的是并行总线,加上当时的抗干扰技术不成熟,他的频率无法做到很高,所以他的带宽只能达到每秒8MB/s的速率,比现在的USB接口还要慢很多,而且你插上一个设备后不能自动配置,还需要你手动去分配资源,无法做到即插即用,而且ISA总线最大只支持到6个外围设备,此外这个接口依赖于特定CPU才可以使用,并且受到CPU外频的影响,更换CPU导致的外频变更,会波及到所有接驳到ISA总线上的设备

也正是因为ISA总线的这些弊端,再加上我们电脑当中一些外围设备的性能需求越来越高,所需要的带宽也越来越高,所以ISA总线就逐渐被淘汰了,而在这之后有很多厂商陆续推出了各种各样的总线想来统一市场,但是最后都是昙花一现,而最终统一天下的就是PCI总线了,于是后来在PC/98规范中,大家就开始放弃了ISA总线,取而代之的就是更为先进的PCI总线

20240303220315

PCI(Peripheral Component Interconnect)接口相对于ISA接口来讲,不仅提高了带宽, 还做到了即插即用,插上设备以后,可以自动配置,不需要你手动去分配资源了.

此外PCI也是一种不依赖于具体的某款CPU的独立总线,之前的ISA就必须要在指定的CPU上才可以用,此外PCI总线还解决了硬件中断共享的一些相关问题, 也因此取代了几个慢速工业标准体系结构 (ISA) 插槽和一个快速 VESA 本地总线 (VLB) 插槽的组合作为总线配置

但是PCI也有他的天生设计缺陷,PCI采用的依旧是和ISA一样的并行传输,所以他的频率依旧不能做的很高,虽然速度相对于ISA提高了不少,但是还是不够快,此外PCI是采用共享总线的机制,这就让高负载下很多设备会一块抢带宽,最后还有一个就是不支持热拔插, 因此最后让位于 PCI Express

PCIe

所以为了解决PCI总线的这些缺陷,技术再一次进行了总线革新,这就是目前我们所用的PCIe总线了,PCIe有两个存在形态,一个是接口,一个是通道,当他以接口形式存在的时候,就是你主板上那横着的长槽

20240303210817

大多数人对于PCIe插槽的理解可能就只是插显卡,事实上,除了显卡,你还可以插PCIe接口的固态硬盘,PCIe接口的无线网卡,PCIe接口的有线网卡,PCIe接口的声卡,视频采集卡,你还可以把PCIe转接成其他的接口,比如PCIe转M.2,PCIe转USB,PCIe转Type-c,所以这个接口的用途真的是异常的广泛,几乎所有高带宽需求的外围设备都能插在这个接口上

主板上的PCIe插槽通常标有它们拥有的PCIe通道数.有时,看似很大的插槽可能只有几条车道.例如,只有 4 个 PCIe 通道(底部插槽)的 x16 插槽很常见.

20240303222420

PCIe除了作为接口形式存在,还可以作为通道的形式存在,比如主板上的M.2固态硬盘接口,他虽然外形是M.2,但是数据传输是依赖于PCIe通道的,所以这时候接口形状是M.2,PCIe在这里就承担数据传输总线的作用了

关于 PCIe NVMe SATA M.2 等关于总线/协议/接口的知识会在 arch/disk 中介绍

PCIe总线的带宽是按长度计算的,最短的是PCIe X1,然后是PCIe X2,PCIe X4P,CIe X8,最长的就是PCIe X16. X16的PCIe速度就是X8的2倍,X4就是X1的4倍

20240303222924

任何X16的设备都可以插在尾部非闭合的X1槽中运行,只不过这个设备肯定是没法发挥全部的性能了,你也可以把X1的设备插在X16的槽中运行,只不过这样就会浪费带宽了

PCIe1.0的时候单向传输X1的速度只有250MB/S,那X2就是500MB/S,X4也就1GB/S,X8的话是2GB/S,X16才4GB/S,而我们的显卡,硬盘,还有网卡这些设备速度在不断的提高,所以第一版PCIe的速度很快就不够用了,由于PCIe目前没有什么明显的使用缺陷,所以不需要进行大版本的技术革新和换代,我们只需要让他传输的速度更快就行了,接口的形状和通讯协议就不需要变动了,这样的话还可以做到向下兼容,一些1.0的设备还可以插到2.0上用,2.0的设备也可以插在1.0的接口上用,虽然会降速,但是总比不能用强

而PCIe2.0的时候速度就相对于1.0做到了翻倍,X1的速度为500MB/S,X2为1GB/S,X4为2GB/S,X8为4GB/S,X16为8GB/S,而后来2.0也不够快了,所以我们的工程师又把PCIe的版本进行了更新,升级到了3.0,也就是目前我们绝大多数电脑里正在使用的PCIe总线的版本了,只要你是近几年配的电脑,主板上的PCIe总线版本都是3.0

PCIe3.0的速度相对于2.0又进行了翻倍,X1的速度就可以达到了1GB/S,而X2就是2GB/S,X4就是4GB/S,X8就是8GB/S,X16就是16GB/S,所以我们这就可以解释一个问题了,为什么目前的M.2固态硬盘顺序读写速度最高就3G/s呢,是因为目前的M.2接口所使用的总线版本为均为PCIe3.0 X4,速率上限4GB/S,所以你是无论如何也不可能跑到4GB/S以上的,因为接口的速率上限就这么高

准确来说应该是 M.2 固态硬盘是用的是 M.2 接口, 插在一个 PCIe 槽上, 由南桥到 CPU 的系统总线是用的是 PCIe3.0 X4, 最大速率是 4.0GB/s

简单来说每隔一代 PCIe 升级其总线带宽就会翻倍, 如今最新的版本为 PCIe6.0

20240303223715

这里的编码 8:10 指的是 8 位用于数据传输, 2 位用于校验

使用下面的命令查看系统总线上的设备

lspci -tv

南桥芯片组(south bridge)

PCIE是一种高速传输总线,他既可以直接以接口的形式存在,也可以以通道的形式存在. 那既然PCIE这么快,那为什么我们不让所有的设备都使用这个接口或者总线呢?

确实是这样,想法很美好,我们自然希望电脑里所有的设备都使用超高速的总线,而不是现在这样够用就好,最大的问题还是受制于成本和市场,PCIE作为一种超高速串行总线,为了达到飞快的速度,所以他的频率设置的异常的高,这种高频率的总线就对总线的线路设计要求非常的高,比如屏蔽磁干扰这些,所以PCIE总线对于主板的布线来讲是一大考验,为了安排下这种高速总线,主板不得不做更多的层数来解决高频总线带来的种种需要

PCIe设备通常需要更多的电力,并且可能会产生更多的热量.在对功率和热管理有特殊要求的环境中,如便携式设备或低功耗应用,可能会避免使用PCIe. PCIe插槽和连接器的物理尺寸可能不适合所有类型的设备.在空间受限的应用中,如嵌入式系统或紧凑型设备,可能会选择更小尺寸的接口. 而且并非所有设备都需要PCIe提供的高速数据传输能力.对于一些低速或低带宽需求的设备,使用更简单的总线可能就足够了

PCIE之所以可以达到这么快的速度,是因为他直接接通在CPU的PCIE控制器上,所以他才可以做到超低的延迟,超高的速度,而CPU的PCIE控制器本身也不可能提供无限数量的PCIE通道,CPU也需要考虑电路的设计成本,所以我们的民用平台CPU目前都只提供有限的可用PCIE通道数量

电脑里所有的设备最终都是要和CPU通信的,比如显卡/声卡/网卡/内存/硬盘,他们的数据最终无论怎么去,都要汇入CPU才可以计算,所以这些设备就必须要能和CPU通信,但是电脑里的外围设备太多了啊,主板上那么多的电子元器件,你让所有的设备都去找CPU,这对主板的布线难度要求就直接提升了好几个档次. 但实际上CPU没有必要实时去和所有的外围设备通信, 对于一些慢速设备可以使用南桥芯片组将数据汇总以后再交给CPU

通常可以在主板的右下角看到南桥芯片组

20240205174656

由于内存太过重要,CPU就亲自直接和它对接,而直连PCIe的话,数据交互的实时要求也很高,也由CPU直接去负责,而其余的设备,比如声卡,网卡,固态硬盘,机械硬盘,USB这些对实时通讯要求不高的设备,就全部接入南桥,南桥收集好数据后再汇报给CPU就可以了

20240303231927

下图是一张intel Z390平台官方的结构图, 这里注意左上角一个细节,直连CPU的PCIE只有16条,要么单16,要么8+8,要么8+4+4,而我们的目前的显卡大部分使用的都是PCIeX16,那如果我插一块显卡,这16条通道就全部被占用了, 那么M.2固态硬盘用的也是PCIE,而且一下就用掉了PCIE X4,那我的M.2固态硬盘是不是就会和显卡抢带宽啊,插上了固态硬盘显卡是不是就变成X12了呢?

20240303232356

事实上在intel平台,我们的M.2固态硬盘使用的PCIE通道并不是直接来自CPU的, 我们可以看见下方南桥最大可以延伸出来24根非直连PCIE,我们的M.2使用的就是来自南桥的这些PCIE, 所以你的显卡不会和M.2去抢PCIE通道,显卡使用的是左上角直连的X16,而M2使用的则是来自南桥当中的其中4条

而AMD的Ryzen平台则有那么一点细微的差异,AMD的Ryzen CPU提供了20条直连的PCIE通道,其中16条分给了PCIE槽,而另外4条分给了其中的一个M.2,所以AMD的Ryzen平台上,大部分主板上的第一个M.2所使用的PCIE通道都是CPU直接提供的

20240303232605

比方说很火的B450M MORTAR迫击炮,其最上方的M.2就是直连CPU的PCIE3.0X4,而下方第二条M.2使用的则是来自南桥的PCIE2.0X4,而PCIE2.0X4的带宽只有2GB/S,所以如果你把你的固态插在了第二个槽上,他就无法跑到2GB/S以上的速度了

20240303232724

我们接着看回intel官方的结构图,CPU和主板南桥之间是通过一个叫DMI3.0的总线进行连接的

20240303232356

实际上这个总线就是PCIE3.0 X4,AMD也比较实诚,直接就在自己的芯片组结构图上标注着PCIE.,也就是说,CPU和南桥之间的数据带宽上限为PCIE3.0 X4,也就是4GB/S,所以我们这里就可以解释另外一个问题了,为什么目前的固态硬盘,包括M.2接口大部分都是使用PCIE3.0X4的总线了,因为目前的M.2都是接在南桥的,而南桥和CPU之间的总线速率上限是PCIE3.0 X4,所以所有接驳到南桥上的设备,其速率都无法超过4GB/S,

那么南桥明明可以分出24根PCIE,那为什么南桥和CPU之间却只开放一个PCIE3.0 X4的小水管呢? 原因很简单,那就是接驳到南桥上的设备,通常来讲不会全部同时工作,你的硬盘声卡网卡还有USB以及光驱,在大多数情况都只是一两个设备在传输,就算好几个设备同时从南桥往CPU传输数据,这几个设备也不太可能同时都是满载状态,可能确实存在这个情况,但是概率太低了

假设一个停车场能停100辆车,但是不代表他的出入口也需要修成100条车道宽,因为这100辆车不太可能同时进出,在一瞬间内,也就几辆而已,所以就留两条路,一个进一个出就完全够用了,2车道在100辆车面前虽然显得很少,但是够用了, 南桥通往CPU的这个DMI3.0同理,虽然只有PCIE3.0 X4的速度也就是4GB/S,但是南桥上的设备同时满载的可能性太低,所以以目前的情况来讲是完全够用的

参考

zood