6.15 Write command 写命令

写命令写数据和元数据,如果适用介质,发到逻辑块相应的I/O controller。主机也可以指定保护信息,作为操作的一部分包含进来。

命令用Command Dword 10,Command Dword 11,Command Dword 12,Command Dword 13,Command Dword 14,和Command Dword 15区域。如果命令使用PRPs传输数据,那么元数据指针,PRP Entry 1,和PRP Entry 2 域就被使用。【注:NVMe over Fabrics不使用PRP】。如果命令使用SGLs传输数据,那么元数据SGL Segment Pointer和SGL Entry 1域就被使用。

【为帮助直观理解,下图参照linux-5.2.9代码定义,黄色线框内,右侧是把Command Dword10~15定义成了相应内容字段】

Command Dword10~11这64位作为一个变量,其数值表示SLBA逻辑块地址起始位置(表示从0开始的第几个逻辑块)。

Command Dword12被分成两部分:

(1)前16位作为一个 变量,其数值表示逻辑块的数(Number of Logical Blocks),注意:这个数值是基于0开始的,即nvme_rw_command.length值为0时表示写一个逻辑块,值为自然数n时表示写n+1个逻辑块。

(2)后16位表示控制信息,依次分别为:4bit保留,4bit表示Directive Type(DTYPE),2bit保留,4bit表示Protection Information Field(PRINFO),1bit表示Force Unit Access(FUA),1bit表示Limited Retry(LR)。

Command Dword13用于DataSet管理

Command Dword14表示Inital Logical Block Reference Tag(ILBRT),此域字段仅用于格式化为端到端保护的namespace的情况。

Command Dword15仅用于端到端保护的情况,此Dword分为两部分:

(1)前16位表示Logical Block Application Tag(LBAT)。

(2)后16位表示Logical Block Application Tag Mask(LBATM)。

6.15.1 命令完成Command Completion

当命令完成不论成功还是失败,controller都应该发送一个表明命令状态的CQE到关联的I/O CQ完成队列。

写命令特定的错误定义在Figure 406中。

------------------------------------------------------------

【实验】

1、把test.log文件中的内容写入/nvme0n1盘中,参数-d表示指定data file,-z 10表示指定写入的字节数;

2、写成功后,再读出来,-z 10指定读10个字节。

3、实验时用的nvme over tcp,可以用wireshark查看命令内容,有下图可以看出,虽然-z指定了写10个字节,内容是HelloWorld,但还是向namespace1的逻辑块1写入了512字节。

4、读命令

最新文章

  1. Instsrv.exe和Srvany.exe的使用方法
  2. Facebook 发布「流程」
  3. Node.js~sails.js~package.json的作用
  4. &12-2 查找二叉搜索树
  5. Android之输入框光标和Hint的位置
  6. Android的快速开发框架afinal
  7. ubuntu中安装Rstdio无法切换中文输入法
  8. Fedora 17下安装Oracle 10g详细图文教程
  9. ORA-12154 TNS无法解析指定的连接标识符
  10. PHP内核探索之变量(1)变量的容器-Zval
  11. .NET 4 并行(多核)编程系列之四 Task的休眠
  12. 一种比较简单的在USB U盘中访问nandflash的方法
  13. MongoDB--MapReduce分布统计s
  14. 我的Java设计模式-策略模式
  15. svn2个小问题的解决
  16. stark组件之多级过滤
  17. 如何将OpenCV中的Mat类绑定为OpenGL中的纹理
  18. [LeetCode] 23. Merge k Sorted Lists ☆☆☆☆☆
  19. Maven install报MojoFailureException
  20. Cordova-conifg.xml配置

热门文章

  1. Spring Cloud(八):使用Spring Cloud Bus来实现配置动态更新
  2. Objective-C编程 — 并行编程
  3. apue 外传
  4. 如何修改Tomcat运行时jvm编码
  5. Linux物理磁盘扩容流程
  6. Java 代码块详解
  7. 逆战:微信小程序开发(二)
  8. 复习babel
  9. python list comprehensions
  10. gulp常用插件之http-proxy-middleware使用