《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(8)
8 Feature(特性)
8.1 固件升级过程
固件升级通过重启激活的过程是:
1. 主机发一个Firmware Image Download命令,下载固件映像版本到controller。可能有多个固件映像版本的部分需要下载,因此每个固件映像版本部分的下载偏移量在Firmware Image Download命令中指定。Firmware Image Download命令中提供的数据应该符合Firmware Update Granularity,如在Identify Controller数据结构中或固件升级可能会失败的固件升级粒度;
2. 固件下载到controller之后,下一步是由主机提交一个Firmware Commit命令。Firmware Commit命令验证最后下载的固件映像版本有效性并提交映像版本到将要使用的固件槽位里。固件映像版本不从偏移量为0的位置启动,包括缺口,或包括区域重叠被认为是无效的。controller可以采用额外的供应商指定的手段(例如:checksum,CRC,密码哈希或数字签名)来确定固件映像版本的有效性:
a. Firmware Commit命令可能也被用于激活之前提交的固件槽位中的固件映像版本;
3. 最后一步是执行重启,来触发Firmware Commit命令中指定的固件槽位域里的固件映像版本激活。重启可以是一个NVM Subsystem Reset,Conventional Reset,Function Level Reset,也可以是Controller Reset(把CC.EN的值从1变成0):
a. 有些场景Conventional Reset 或 NVM Subsystem Reset需要激活一个固件映像。这个要求由Firmware Commit命令特定的状态(参考5.11.1章节)来表明的;
4. 重启完成之后,主机软件重新初始化controller。包括重新申请I/O提交队列和I/O完成队列。请参考7.6.1章节。
不用重启的固件升级和激活步骤:
1. 主机发一个Firmware Image Download命令,下载固件映像版本到controller。可能有多个固件映像版本的部分需要下载,因此每个固件映像版本部分的下载偏移量在Firmware Image Download命令中指定。Firmware Image Download命令中提供的数据应该符合Firmware Update Granularity,如在Identify Controller数据结构中或固件升级可能会失败的固件升级粒度;
2. 主机提交Firmware Commit命令,带上值为011b的Commit Action指定映像版本不重启的情况下立即激活。下载的这个映像版本应该替换掉固件槽中的映像版本。如果从最后一次重启或Firmware Commit命令之后没有下载的映像版本(例如:第一步被跳过),那么controller必须验证和激活指定槽位中的映像版本。如果controller开始激活映像版本,如果开启了Firmware Activation Notices,任何受新固件影响的controller都向主机发送Firmware Activation Starting异步事件(请参考Figure287):
a. Firmware Commit命令也可以用于激活之前提交的固件槽位中的固件映像版本;
3. controller完成Firmware Commit命令。以下是应对某些错误场景的操作:
a. 如果固件映像版本无效,那么controller报告响应的错误;
b. 如果固件激活未成功是因为激活固件要求的Controller Level Reset原因,那么controller报告Firmware Activation Requires Controller Level Reset的错误,在下一次Controller Level Reset再使用这个映像版本;
c. 如果固件激活未成功应因为激活固件要求的NVM Subsystem Reset原因,那么controller报告Firmware Activation Requires NVM Subsystem Reset的错误,在下一次NVM Subsystem Reset时再使用这个映像版本;
d. 如果固件激活未成功应因为激活固件要求的Conventional Reset原因,那么controller报告Firmware Activation Requires Conventional Reset的错误,在下一次Conventional Reset时再使用这个映像版本;
e. 如果固件激活未成功因为固件激活时间将超过在Identify Controller数据结构中报告的MTFA值,那么controller报告Firmware Activation Requires Maximum Time Violation的错误,这种情况,为了激活固件,需要重新提交Firmware Commit命令和使用一个重启激活映像版本。
在Firmware Commit命令的提交之后,准备激活固件映像版本,在这个Firmware Commit完成之前,如果controller转换到了D3cold状态(请参考PCIe基础规格说明书),那么controller恢复运行用的既不是Firmware Commit命令正要激活的固件映像版本也不是原来已经激活的那个固件映像版本。
如果固件不能被成功加载,那么如果可能的话,controller应该还原回当前的最近的已激活的固件槽位固件映像版本或那个只读的基线固件映像版本,并且作为一个Firmware Image Load Error的异步事件表明这个故障。
如果主机覆盖写激活固件槽位中的固件,那么这个已经激活的固件映像版本可能不再可用。因此,任何需要使用该固件槽位的操作(例如,循环加电重启控制器)都可以使用当前位于该固件槽位中的固件映像。
主机软件不能同时的升级多个固件映像。下载完一个映像,主机软件在下载其他的固件映像之前提交Firmware Commit命令。第一个Firmware Download命令的处理如果晚于Firmware Commit命令完成,如果还有未下载完的映像部分,剩下的部分将导致被controller丢弃。如果固件下载和Firmware Commit命令的完成之间发生了重启,那么controller应该丢弃下载映像的所有的部分。
8.2 元数据处理
Controller可以支持每个逻辑块的元数据。元数据是在每个逻辑块基础上分配的附加数据。对主机如何使用元数据区没有要求。元数据最普遍的用法之一是传达端到端保护信息。
元数据可以在controller到主机和主机到controller任意一个方向上传送,当格式化namespace时选择使用机制。
传送元数据的第一个机制是相应的元数据作为逻辑块的一个连续的部分。元数据紧跟对应逻辑块的后边被传送,形成扩展的逻辑块。这种机制的插图见图Figure 449。在这种情况,逻辑块数据和逻辑块元数据二者都被PRP1和PRP2指针所指向(或SGL Entry 1,如果使用了SGL的话)。
传送元数据的第二种机制是元数据作为一个单独的数据缓冲区。这种机制的插图见图Figure 450。这种情况,元数据被Metadata Pointer元数据指针所指向,而逻辑块数据被Data Pointer指针所指向。命令中元数据使用PRPs时,要求元数据是物理上连续的。命令中的元数据使用SGLs时,不要求元数据是物理上连续的。
每个namespace被格式化时都必须选择传送机制的其中一种机制;不支持传送这部分元数据使用一种机制,而传送另一部分元数据使用另一种机制。
如果使用了端到端的数据保护,那么每个逻辑块的Protection Information域都包含在元数据中。
8.3 端到端数据保护
提供从应用到NVM媒介以及再回到应用自身的健壮的数据保护,可以使用端到端数据保护。如果开启了这个可选机制,那么附加的保护信息(例如CRC)就被加到逻辑块,可以由controller和/或主机软件判断,以确定逻辑块的完整性。如果存在这个附加的保护信息,基于namespace的格式,它可以是元数据的第一个八字节或者元数据的最后八字节。对于多于八字节的元数据格式,如果保护信息包含在元数据的第一个八字节里,那么CRC不涵盖任何元数据字节。对于保护信息包含在元数据的最后八字节中的这种多于八字节的元数据格式,CRC涵盖除了这最后八字节之外的所有的元数据字节。【注:也就是说CRC只计算它前边的字节。如果CRC位于元数据的最前边八字节,那么其他元数据字节都在CRC之后,计算CRC时不计算CRC后边的这些元数据字节;如果CRC位于元数据最后,那么计算CRC时就把前边的元数据计算到CRC里边了】。如8.2章节描述,元数据和这些保护信息或许是与逻辑块数据连续的,或许是存储在单独的缓冲区里。
在企业级实施里使用的最通用的数据保护机制是SCSI Protection信息,通常称为Data Integrity Field(DIF)和Data Integrity Extension(DIX)。这两个机制之间最主要的区别是保护信息的位置。在DIF中,保护信息创建扩展逻辑块且与逻辑块数据是连续的。而DIX中,保护信息存放于单独的缓冲区中。本规格说明书定义的端到端数据保护机制从功能上兼容DIF和DIX二者。通过配置元数据与逻辑块数据连续实现DIF功能(如图Figure449所示),而通过配置元数据和数据在单独的缓冲区里实现DIX功能(如图Figure450)。
NVMe支持SBC-3中指定的定义在SCSI Protection信息模型中的相同的端到端保护类型。当格式化namespace时,端到端数据保护的类型(例如Type1、Type2或Type3)是可选的,并在Identify Namespace数据结构(参考Figure245)中记录。
保护信息格式如图Figure 451所示,包含在与每个逻辑块对应的元数据中。Guard域包含一个通过逻辑块数据计算的CRC-16。CRC-16的计算公式定义在SBC-3中。除了RCR-16之外,DIX也指定一个可选的IP checksum,NVMe接口不支持这个。Application Tag是不透明的数据域,不能被controller理解,它可以用于禁止保护信息的检查。Reference Tag把逻辑块数据与一个地址关联起来,防止被误用或者乱序逻辑块传输。类似于Application Tag,Reference Tag也可以用于禁止保护信息的检查。
8.3.1 The PRACT Bit
作为读和写命令的副作用执行的保护信息处理由命令中的Protection Information保护信息活动(PRACT)位控制。【注:a side effect术语是什么概念?这里被写成副作用了】
8.3.1.1 Protection Infomation和Write Commands
图Figure 452提供了一些保护信息处理作为写命令副作用出现的例子。
如果namespace没有带端到端数据保护格式化,那么逻辑块数据和元数据从主机到NVM传送不带有由控制器相关处理的保护信息。
如果namespace带保护信息格式化,PRACT位被清0,那么逻辑块数据和元数据,包含保护信息,还可能包含额外元数据,从主机缓冲区到NVM被传送(即:元数据字段在NVM和主机缓冲区中保持相同的大小)。当逻辑块数据和元数据透传到controller时,保护信息被校验。如果保护信息校验被发现错误,命令带着检测到错误的状态错误状态码结束(例如:End-to-end Guard Check Error, End-to-end Application Tag Check Error, or End-to-end Reference Tag Check Error)。
如果namespace格式化带保护信息并且PRACT位设置成1,那么:
1. 如果namespace格式化时,元数据大小【Metadata Size】等于8(参考Figure 246),那么逻辑块数据从主机缓冲区到controller传送。当逻辑块数据透传到controller,controller生成和追加保护信息到逻辑块数据尾部,逻辑块数据和保护信息被写入到NVM(元数据不驻留在主机缓冲区内)。
2. 如果namespace格式化时,元数据大小【Metadata Size】大于8,那么逻辑块数据和元数据从主机缓冲区到controller被传送。当元数据透传到controller,controller覆盖写这个保护信息,保护信息属于元数据的一部分。逻辑块数据和元数据都被写入到NVM(在NVM中和主机缓冲区中,元数据域保持同样的大小)。在元数据内部保护信息的位置是namespace格式化时配置的(请参考Figure 245的DPS域)。
8.3.1.2 Protection Infomation和Read Commands
Figure 453 提供一些保护信息处理例子,可能产生读命令处理的副作用。
如果namespace格式化时设置了带保护信息,PRACT的bit位被清0,那么逻辑块数据和元数据被controller从NVM中读出并传递到主机缓冲区,元数据包含保护信息和其他可能的主机元数据(元数据域在NVM中和在主机缓冲区中保持相同的大小)。当逻辑块数据和元数据透传到controller时,元数据内的保护信息被校验的。如果保护信息被校验发现错误,命令结束,返回错误状态码(End-toend Guard Check Error, End-to-end Application Tag Check Error, or End-to-end Reference Tag Check Error)。
如果namespace格式化时,设置带保护信息,PRACT的bit为被设置为1,那么:
a)如果namespace格式化时设置的元数据大小(Metadata Size)等于8(参见Figure246),逻辑块数据和元数据由controller从NVM中读取。当逻辑块和元数据透传到controller时,保护信息被校验,如果保护信息被检测到错误,命令结束,返回探测到的错误码状态(End-toend Guard Check Error, End-to-end Application Tag Check Error, or End-to-end Reference Tag Check Error)。处理完保护信息之后,controller只向主机发送逻辑块数据。
b)如果namespace格式化时,设置Metadata Size大于8,这种情况controller从NVM中读逻辑块数据和元数据,元数据包括保护信息和附件的主机格式的元数据。当逻辑块和元数据透传到controller时,嵌入在元数据中的保护信息被校验,如果保护信息被检测到错误,命令结束,返回探测到的错误码状态(End-toend Guard Check Error, End-to-end Application Tag Check Error, or End-to-end Reference Tag Check Error)。处理完保护信息之后,controller把逻辑块数据和元数据交给主机,嵌入在元数据中的保护信息不做任何变化。(元数据在NVM中和主机缓冲区中大小保持一样)
8.3.1.3 Protection Infomation for Fused Operations
组成的融合操作命令在保护处理方面与单个命令保护处理过程是相同的。
8.3.1.4 Protection Information和Compare命令
图Figure 454 展示保护信息处理导致Compare命令可能产生的额外处理。Compare命令处理同时涉及Write和Read命令,作为Compare命令的一部分,从主机向controller传递的数据和保护信息,保护信息由controller执行校验,与controller执行Write命令保护信息检查并行。Compare命令的另一部分,从NVM媒介中向controller传送数据和保护信息,controller执行保护信息校验与Read命令保护信息检查并行。
8.3.1.5 Control of Protection Infomation Checking - PRCHK
保护信息的校验包括controller如下执行的一系列操作。如果命令中Protection Infomation Check(PRCHK)域的第二位bit2设置为1,controller将保护信息Guard域与逻辑块数据计算的CRC-16进行比较。如果PRCHK的第一位bit 1被设置为1,controller将保护信息Application Tag域的未被屏蔽位与命令中Logical Block Application Tag(LBAT)域进行比较。如果命令中Logical Block Application Tag Mask(LBATM)域某bit位被设置为0,相应的信息保护Application Tag域的那个bit位屏蔽掉。
对于Type 1保护,如果PRCHK域的bit 0被设置为1,controller将保护信息Reference Tag域与计算的reference tag进行比较。为命令的第一个LBA计算的reference tag值,包含在命令的Initial Logical Block Reference Tag(ILBRT)或Expected Initial Logical Block Reference Tag(EILBRT)域中。如果namespace被格式化为Type 1或Type 2保护,计算出的引用标记对每个后来的逻辑块是递增的。如果namespace被格式化成Type 3保护,对于每个后续逻辑块的引用标记都与初始引用标记保持相同。不像SCSI Protection Infomation Type 1 保护那样暗中使用LBA的最小有效四字节,NVMe使用Type 1保护时,controller总是使用ILBRT或EILBRT域,并要求主机软件来初始化ILBRT或ELBRT域到LBA的最小有效四字节。Type 1保护,controller应该校验ILBRT域或EILBRT域是否正确;如果值与LBA最小有效四字节不匹配,controller结束这个命令,返回非法保护信息的状态。
对于Type 2保护,如果PRCHK域的第0位被设置为1,controller将每个逻辑块的保护信息引用标记域与计算的引用标记进行对比。计算的引用标记对每个后续的逻辑块都递增。为第一个命令的LBA计算的引用标记值,是命令中ILBRT或EILBRT域内的值。主机软件可以设置ILBRT和EILBRT域为任意值。
对于Type 3保护,如果PRCHK域的第0位被设置为1,这个命令应该被终止,返回非法保护信息状态,也可以在命令中Invalid Field状态终止命令。当使用Type 3保护时,因为计算的引用标记保持不变,所以controller可以忽略ILBRT和EILBRT域。
保护校验可以不管命令中的PRCHK域的状态,作为保护信息Application Tag和Reference Tag域值的一个额外处理,关闭它。如果namespace格式化为Type 1或Type 2保护,当保护信息Application Tag的值是0xFFFF时,不论PRCHK域的状态如何,所有保护信息校验被关闭。如果namespace格式化为Type 3保护,当保护信息Application Tag的值是0xFFFF和保护信息Reference Tag值是0xFFFFFFFF时,不论PRCHK域的状态如何,所有保护信息校验被关闭。
插入的保护信息包括Guard域中计算的CRC-16,Application Tag域中LBAT字段值,以及Reference Tag域中计算的引用标记。
《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(8)的更多相关文章
- 《手把手教你构建自己的 Linux 系统》学习笔记(10)
目录 /etc/fstab 文件的作用是什么? Linux 内核的图形化启动是怎么回事? Linux 系统中的文件名是否以大小写来进行区别? 「GRUB 中无法找到硬盘」怎么解决? 「GRUB 及配置 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(9)
目录 autoreconf 命令的作用是什么? aclocal automake -a autoconf 一条命令搞完三面三步 既然有其他的「编译控制软件」为何还是使用 make 来进行编译控制? M ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(8)
目录 Binutils 软件包有什么用? make -k 的作用是什么? man-pages 里有几种文档?分别表示什么意思? 如何查询指定目录的 man-pages ? 如何使用 make 命令的同 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(6)
目录 /dev 目录是干什么的? /proc 和 /sys 目录是干什么的? udev 这个软件是干什么用的? 目录映射是临时性的,还是永久性的? 命令行里大括号 "{}" 的作用 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(5)
交叉编译是什么? 交叉编译就是在一个系统上,编译生成另外一个系统运行的程序文件. 「硬件体系结构」和「操作系统」的关系是什么? 硬件体系结构也可以称为架构,主要是通过 CPU 的指令集来进行区分的,操 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(2)
Linux 系统定制原理 虚拟根目录 我们的目标是为了完成目标系统(也就是我们要做的系统),他是一个可以独立运行的系统,不依赖雨主系统和临时系统,根据 Linux 系统的特点它需要存放在根目录下面,但 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(1)
第二章.基础准备--Linux 系统定制原理 Linux 系统的组成及架构 共享库和静态库 在 Linux 系统中,函数库包含两种形式:共享库和静态库. 共享库 共享库在程序运行时,为其提供所需要的函 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(7)
目录 tee 命令的缺陷是什么?如何解决这个缺陷? /etc/ld.so.conf 文件的作用是什么? 动态链接和静态链接有什么不同? 动态编译 静态编译 共享库为什么会有版本?共享库的版本升级原理是 ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(4)
汇编链接器(Binutils) 这是一个软件包,这个软件包其实是一个工具集,里面含有了大量的用于汇编程序活着读取二进制文件相关的程序. CC 它是一条命令的别名,这条命令的作用是使用 GCC 的 C ...
- 《手把手教你构建自己的 Linux 系统》学习笔记(3)
需要注意的是,制作操作系统权限全程都要用 root pushd 和 popd 为了方便目录管理,所以出现了这种两个命令,他们的原理就是利用堆栈来实现目录管理. 这两个命令,pushd 负责将指定的目录 ...
随机推荐
- 【超详细】vultr(CentOS7)+LNMP+WordPress 搭建个人博客
心血来潮想搭建个人博客,我的vps只用来搭ss未免太过浪费 在这里记录一下搭建个人博客的历程 0x00 写在前面 why vultr: 优点:便宜. 性能优良.按时间计费(不用包年 学生党的福音).稳 ...
- MYSQL数据库的安装,配置文件,登入
07.13自我总结 MYSQL数据库 一.MYQL数据库的安装 可以去mysql官网下载mysql压缩包 运行程序:在bin文件夹中,其中客户端运行文件是mysql.exe,服务端运行文件为mysql ...
- 使用 Spring Framework 时常犯的十大错误
Spring 可以说是最流行的 Java 框架之一,也是一只需要驯服的强大野兽.虽然它的基本概念相当容易掌握,但成为一名强大的 Spring 开发者仍需要很多时间和努力. 在本文中,我们将介绍 Spr ...
- 【Java中级】(一)面向对象的特性与八种基本类型
1.1.Java 基本数据类型: Java提供了8种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. byte.short.int.long.float.double. ...
- Java 面向对象面试题
1.Java面向对象的三种特性 封装:封装是把数据和操作数据的方法封装起来,对数据的访问只能通过已定义的接口进行访问. Java的四种访问控制符: - 默认的(default):不使用任何修饰符,在同 ...
- idea新建javaweb工程
最近尝试了idea的使用,将idea建立javaweb工程的步骤记录下来 1.方框里边是重点 2.next后输入工程文件名点击finish 3.如图看到项目文件夹里边没有WEB-INF文件夹及里边的w ...
- Android利用Handler异步获取子线程中的产生的值
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 近段时间有一个需求:在线获取图片并且显示在界面 ...
- web设计_7_页面缺失图片或CSS的情况下仍然易读
1. 在任何可能使用背景图片的地方应设置同样的颜色的背景色. 防止图片不能加载的情况下,页面内容同样保持较好可读性. 例如文字为白色,背景图为深色,如果不设置背景色,当背景图未成功加载, 而浏览器多数 ...
- pyhthon字典练习题
pyhthon字典练习题: 有如下集合: [11,22,33,44,55,66,77,88,99] 将所有大于55的值保存至第一个KEY值中,将所有小于55的值保存至第二个KEY值中.{"k ...
- 【iOS】UIImageView 点击事件
UIImageView 并不像 UIButton 那样点击鼠标就可以关联点击事件,也不像 Android 里有 onClickListener,这个时候就需要借助 UITapGestureRecogn ...