《深入浅出SSD》学习中…
文章目录
- 《深入浅出SSD》学习中.....
- 一、SSD主控
- 二、PCIe和NVMe控制器前端子系统
- 1.PCIe控制器
- 2.NVMe控制器
一、SSD主控
就是类似电脑CPU的东西,在SSD中收取处理Host端的命令,管理NAND闪存
二、PCIe和NVMe控制器前端子系统
主要用于处理来自host以及协议接口的命令,对应PCIe协议和NVMe协议(以下Host代表电脑或服务器等外接SSD的设备端)
1.PCIe控制器
决定控制器前端和host之间的带宽,由两种因素决定,一个是协议,一个是通道数
所谓协议就是常听到的PCIe3.0/PCIe4.0 或是 GEN3/GEN4,每种协议对应的通道支持的速率是不一样的。 以PCIe 4.0x4 为例:
理论单通道速率为: 16GT/s ,转换为带宽就是 1969MB/s
x4 代表是4通道,所以速率x4 得到理论
带宽为 7.88GB/s
至于转换公式,不做赘述,放个wiki百科上的截图参考:
2.NVMe控制器
利用PCIe接口实现NVMe相关协议,实现基本的读写等操作
整个过程基于三个概念:
Submission Queue(SQ) :Host把命令放在该队列,这个队列通常在Host内存里。
Completion Queue(CQ):SSD从SQ中取出命令执行完成后,把消息写入该队列,指示命令完成状态,这个队列通常在Host内存里。
Doorbell Register(DB):当主机写了SQ后,再写DB,通知SSD去SQ取命令执行。DB位于SSD控制器内部
交互流程图如下:
1,首先Host往自己的SQ内提交命令,写了一个任务计划,准备安排SSD去执行了
2,提交完命令了同时需要让SSD知道,所以又下了DB命令,可以理解为Host敲了SSD的门,告诉他,我来命令啦
3,SSD的NVMe控制器在收到DB后,知道自己又有活干了,就去SQ内取命令。
4,NVMe控制器在取到命令后,把命令给到SSD主控,主控进行相应的命令操作
5,SSD执行完命令后,往主机另一个队列CQ中写入命令执行结果,更新任务进度,记录自己哪条SQ完成了
6,SSD以中断的方式告诉Host,这个命令我完成了。
7,Host响应中断并处理CQ里面完成的命令
8,Host更新自己的记录,标记整个任务完成,画上句号,释放资源
这里还能引入一个概念(待深入理解):
队列大小有16bit,最小队列大小为2个元素(因为满队列的定义方式,所以最小为2个元素),对于I/O队列,最大队列大小为64k;对于Admin队列,最大队列为4
Host利用 QID来标识唯一ID,16bit。host可以修改队列优先级(如果支持的话),共四级,U(Urgent)、H(High Priority)、M(Medium Priority)、L(Low Priority)