简述
主控是个片上系统,由硬件和固件组成一个功能完整的系统;上文所述的FTL就属于主控的固件范畴。主控+闪存构成了整个SSD,在闪存确定的情况下,主控就反映了各家SSD的差异。实时上各家SSD的差异也主要反应在主控上,毕竟闪存是个标准的东西。
主控架构
前端主机接口
作用:连接主机并与主机进行数据交互;
连接主机是指硬件接口,如PCIe,数据交互需要利用跑在接口上的协议,如NVMe协议。
主机和设备的交互有两个通道:命令通道和数据通道。
命令通道,传输的是命令,就是我们常说的I/O请求/响应命令;
比如命令在主机的块层封装为bio结构,然后经过拆分或合并,封装为request结构,
再经过NVMe驱动封装为nvme_command结构(经过SCSI层的会封装为scsi_cmnd的结构);
主机把封装好的命令,放在提交队列(SQ)中,这个队列虽然是在主机内存中分配,但主机和设备主控都能访问(因为SQ分配在主机的DMA区,主机分配后会把DMA的地址告诉设备),
主控中也有与主机中对应的队列,主控会把主机SQ中的命令搬到自己的队列中,此时的命令传输就是PCIe接口完成的,PCIe的报文格式是TLP,也就是说nvme_commnad会被封装为TLP经过PCIe传输到设备后再恢复为nvme_command;但是TLP是PCIe传输层(事物层)做的事,我们无需关注;总之主控能处理的类型是nvme_commad。
另外还有数据通道,主要处理主机发起的读/写命令;比如写,I/O请求时携带数据的,所携带的数据是不放在提交队列中的,也不会随着命令下发到主控的队列中;而是通过DMA进行专门的数据传输,把主机内存中的数据搬移到控制的缓存中 。
命令传输和数据搬移就是前端主机模块的主要功能。
计算子系统
当然前端主机接口模块也要在计算子系统下工作,因为计算子系统是整个主控系统的核心,当然它更重要的工作是调度后端数据处理模块对获取的数据进行处理。
在需要安全计算的情况下,计算子系统还需要调度安全子系统对数据进行加解密。
安全子系统
一般有两个用途,一是用于控制器的FW的校验,比如升级FW时会校验下载到的FW是不是经过认证的、在FW启动时校验FW是否完整。
第二个用途就是数据加解密,比如存在闪存上的数据要加密,就是通过这个模块进行的;既然闪存上的数据是加密的,但从闪存读取数据时也就需要经过这个模块进行解密。国内的应用中一般不用数据加解密,但国外一般都需要。
后端闪存接口模块
它也有多个模块构成,首先有任务调度模块,在计算子系统的调度下获取I/O命令,然后通过数据处理单元进行处理,再经由闪存驱动把对闪存进行读/写。
SQ/CQ
这个系统中会存在多个层次的SQ(提交队列)和CQ(完成队列)。
首先主机与控制器的命令交互,在主机中有SQ和CQ队列,在设备中有同主机对等的队列;
其次在控制器与后端闪存接口模块中,可以看到后端闪存接口模块也有自己的SRAM/DDR,此时控制器中有SQ、CQ,闪存接口模块中也有对等的队列。