说在开头:关于我的世界(3)
如此,我们是否能够得出一个结论:每个人所生活的世界与外部真实世界是不同的?我们生活在自我所感受的这个世界中(一座魔法城堡之中),而并非是在真实世界之中;但对于我们自己来说,自身所感受到的世界就是真实世界,然而更要命的是:由于每个人对同一客观事物的感受不尽相同,所以“我的世界”也不尽相同,即我们每个人都生活在不同的世界( “我的世界”)之中。
那么“我的世界”是主观还是客观的呢?首先,我们从出生后有自我意识以来,不管这个“我”是富二代还是负二代,是疾病还是健康,在人群中闪闪发光,还是如我一般默默无闻,“我”一直处在“我的世界”的中心(不要为自己的普通而气馁);“我的世界”从“我”的感知、思想、行动出发去理解、影响、改变现实世界和“他人世界”,同时“我的世界”也被现实世界和“他人世界”所影响着。 “我”永远是“我的世界”的主角(不要把“我”看的太轻);同时“我”永远不可能是“他人世界”的主角(也不要太在乎“他人”的看法)。
每个人生来就对现实世界的感知、理解会有差别,正如之前所说:有些人色弱/色盲,就会对某些颜色不敏感,有些人能听到超过20Hz~20KHz范围频率的声音,感知到了常人所无法理解的奇妙,父母所给予每个人不同的天赋,先天造成了我们对现实世界理解上或多或少的差别。同时每个人都以自己独特的角度在感受着现实世界,所以你感知到的现实世界都是独一无二的。假如有一群外星人,他们感知到的宇宙都是由“方块”组成(“方块人”的游戏:《我的世界》),那么他们的世界就是由方块组成的。
人的思想/思维是由语言来组成/组织的(母语类似于二进制),“我”所感知(输入)、思考(处理)、交流(输出),首先都是以母语(母语决定了人的思维方式,建立了道德基础)的形式呈现在我们的脑中,是我们理解现实世界和“他人世界”的最重要的途径。有着相同母语环境的人更能够相互理解,因为语言中隐含了对现实世界的基本理解和社会道德准则,决定了相同母语的人更能搭建起心灵之间的沟通之桥,所以母语必然是“我的世界”最重要的基石。
但是大家都说普通话,看着同样的方块字,就能有一样的思想了么?从我们的经验来判断,答案明显是否定的。我们受到不同时代的影响,每个人先天的天赋、性格,到家庭环境、教育背景、人生经历都不一样(就算是双胞胎也会有差别),影响了每个人对现实世界的理解不同,对“他人世界”的感受不同。同时我们的主观思想:包括情绪、态度、世界观和人生观等不同,也影响了我们对现实世界的感知和思考。所以并非事事如柯南所说:真相只有一个,各种罗生门事件中,不同人的不同叙述可能并非是刻意隐瞒或撒谎,只是不同人“眼中”的真相确实是不同的而已。甚至对于任何事情,在不同人的“眼中”都是不一样的真实,这取决于“我的世界”对现实世界的理解。
那“我的世界”到底是主观还是客观?我相信“我的世界”是主观的但也有对真实客观的反映;我们对现实世界有一个基本的、客观的认知,因为人有理性,当它发挥作用时,能够客观、规律化的去感知、理解并掌握现实世界;除此之外,“我的世界”都是主观的:大部分是自我想象的、带有情绪和有立场(屁股决定脑袋)的。所以我们是活在现实世界中么?不,我们活在“我的世界”中。人生若只如初见,那个初见的完美女神最终只是“我的世界”所臆想出来的。
最后来讲一个在传习录中的故事:有一年春天,王阳明和好基友来到山间游玩,看到山花烂漫非常漂亮,基友指着一颗花树问:“天下无心外之物,如此花树在深山中自开自落,于我心亦何相关?”,基友的意思是说:你王阳明说现实世界不在你心外,但是这深山中的自己开放的山花,跟我的心有毛关系?王阳明回答说:“你未看此花时,此花与汝心同归于寂;你来看此花时,此花颜色一时明白起来,便知此花不在你的心外。”,王阳明回答说,我没看这朵花,“我的世界”中并不存在这朵花,当看到了这朵花,我通过对这朵花的鲜活形态、颜色、香味等感知,它便进入到“我的世界”中来了。
有同学看到这里会愤怒:你TM在扯淡!我说:你说的对。
突然想起子曾经曰过:井蛙不可以语于海,夏虫不可以语于冰,曲士不可以语于道。我想我们每个人在这个世界面前,都只是井底之蛙,夏虫和曲士罢了。
二,PCIe总线层次结构(概述)
PCIe 定义了一种分层的体系结构(举个栗子:网络的7层结构就是一种分层的结构),我们可以认为这些层在逻辑上是相互独立的部分,因为他们各自都有一个用于发出信息流的发送端和一个接收信息流的接收端。这种分层的设计方法对硬件设计者来说有不少的优点,因为如果在设计中对逻辑进行了仔细的划分,那么就可以在以后升级到新的协议规范版本时仅改变原设计中的某一层即可,而不会影响或者变动其它层(解耦设计的思想)。虽然如此,但是需要注意的是,这些层只是定义了接口的工作职责,而实际设计并不要求为了符合规范而将设计严格按照层级来分成几个部分。PCIe总线协议分层如下所示。
如上图所示为 PCIe 设备内部层次包括:
1. 设备核心层以及它与事务层的接口:设备核心层实现了设备的核心功能,其并非是PCIe协议中定义的一个层级,我们可以将它当做是一个PCIe的层级,因为它位于事务层的上方,是所有事务请求的源头或目的地:提供了事务类型、地址以及所需传输的数据等;
1,如果设备是一个端点(EP),那么它最多可以包含 8 个功能(function),每个功能实现自己的配置空间;
2,如果设备是一个交换机,那么它的核心由数据包路由逻辑和为了实现路由的内部总线构成;
3,如果设备是一个 RC,那么其核心会实现一个虚拟的 PCI 总线 0,在这个虚拟的 PCI 总线 0中存在着所有的芯片组嵌入式端点以及虚拟桥。
2. 事务层:接收来自PCIe设备的核心层数据并封装为TLP(Transaction Layer Packet,事务层包)包发向数据链路层,同时在接收端对 TLP 进行译码;事务层也负责 QoS(Quality of Service,服务质量)、流量控制以及事务排序(这四个事务层的功能将下一章进行详细介绍)。
——PCIe总线事务大多与PCI总线兼容,可以通过Switch等设备传输到EP或RC。
3. 数据链路层:
1,保证来自事务层的报文可靠、完整地发送到接收端的数据链路层;数据链路层将来自事务层的报文条件:Sequence Number前缀和CRC后缀;同时ACK/NAK协议来保证报文的可靠传递;
2,定义了多种DLLP(Data Link Layer Packet,数据链路层包),DLLP包产生于数据链路层终止于数据链路层;
——TLP包与DLLP包是两种不同的数据包,TLP包并非是由DLLP包加上前缀、后缀组成。
4. 物理层:是PCIe总线的最底层,将PCIe设备连接在了一起;负责在发送端产生字符序列包,在接收端对字符序列包进行译码。
1,物理层将处理上述三种类型的包(TLP、DLLP、字符序列包)在物理链路上的发送与接收。
——字符序列包:PLP(Physical Layer Packet),用于同步PCIe链路,并进行链路管理。
2,物理层还定义了LTSSM(Link Training and Status State Machine)状态机,PCIe链路使用该状态机管理链路状态,并进行链路训练、链路恢复和电源管理;
——数据包在发送端要经过字节条带化逻辑、扰码器、8b/10b 编码器(Gen1/Gen2)或是 128b/130b 编码器(Gen3)以及数据包并串转换模块的处理。最终数据包以训练后的链路速率在所有通道上按照时钟以差分形式输出。在物理层的接收端,数据包处理包括串行地接收差分形式的比特信号,将其转换为数字信号形式,然后将输入比特流做串并转换。这个操作基于来源于 CDR(Clock and Data Recovery,时钟数据恢复)电路所提供的恢复时钟。接收下来的数据包要经过弹性缓存、8b/10b 解码器(Gen1/Gen2)或者 128b/130b 解码器(Gen3)、解扰器以及字节交换恢复逻辑。
每个 PCIe 接口都支持这些层的功能,那就PCIe Switch端口是否还需要实现所有的层次呢?毕竟它通常只用于转发数据包;如下图所示,很明显也是需要的:因为对包的内容进行解析来确定它们的路由是需要查看数据包的内部细节的,而这件事情是在事务层中完成的,而DLLP包是在一条链路的两端终结,并不会通过PCIe Switch转发。
本设备上的每个层都与链路对端设备的各自对应层进行通信,举个栗子,本设备的事务层与对端的事务层通信、本设备的数据链路层与对端的数据链路层通信。上面的两层通过在数据包内添加一串特定的比特信息,产生一个接收端的对应层可以识别的字段样式来实现对应层之间的通信。数据包通过其他层的转发,从而做到到达或者离开链路。物理层也直接与另一个设备中的物理层通信,但是方式与此不同。
从广义上来说,设备所发出的请求包或者完成包是在事务层进行组包的,组包所用到的信息是由设备核心层所提供。它提供的组包信息通常包括期望的命令类型、目标设备的地址、请求的属性特征等等;刚组好的数据包(TLP)会被存入一个被称为虚拟通道缓存(VCs),直到这个包可以被发往下一个层级。当这个包被向下发给数据链路层(Data Link Layer)后,数据链路层会在数据包中加入额外的信息以供对端的接收方进行错误检查(LCRC),而且这个数据包会在本地储存下来(TLP Retry Buffer),这样我们就可以在对端检测到传输出错时重新发送这个数据包。当数据包到达物理层后,它被编码(Encode),并使用链路上的所有可用的通道、以差分信号的形式进行传输。
——在如下PCIe层次结构图的数据链路层中,能够很明显看到TLP包和DLLP包是两个不同的模块所产生;同时物理层上实现LTSSM的Link Training也是单独的一个模块。
接收端对物理层的输入Bit进行解码(Decode),检查本层级所能发现的错误,如果没有检查到错误,那么就将接收下来的数据包向上转发给数据链路层。在数据链路层,数据包进行不同于物理层的错误检查,如果没有发现错误就向上转发给事务层。这个数据包在事务层被缓存和错误检查,并被拆包拆成各原始信息(命令、属性等等),这样就可以这些原始信息内容呈交给设备核心层,这里的设备核心层是这次数据传输的接收端设备的设备核心层。这个操作过程如上图进行了展示。
写在最后
本章部分相关内容和图片参考自:王齐 -《PCI Express 体系结构导读》,Mike Jackson-《PCI Express Technology 3.0》,知乎- LogicJitterGibbs《译文:PCI Express Technology 3.0》。下一章《PCIe总线基础-事务层》。