SATA信息传输FIS结构总结通过实例代码(快速)掌握(二)

目录

    • 一、简介
    • 二、总体介绍
      • 2.1 详细FIS传输过程
      • 2.2 FIS内容详解
    • 三、FIS实例
      • 3.1 构造一个write FIS
        • 3.1.1 WRITE FIS内容
        • 3.1.2 协议分析仪trace分析
        • 3.1.3 write过程总trace
      • 3.2 构造一个read FIS
        • 3.2.1 READ FIS内容
        • 3.2.2 协议分析仪 read trace
        • 3.2.3 read过程总trace
      • 3.3 FIS和Command List储存
        • 3.3.1 HBA Memory Space Usage
        • 3.3.2 具体FIS存放规则
      • 3.4 Comand List
        • 3.4.1 Port System Memory Structures
        • 3.4.2 command具体内容
        • 3.4.3 构造一个Command List
    • 四、其他trace
      • 4.1 PIO SETUP FIS
      • 4.2 DMA SETUP FIS
      • 4.3 DATA FIS
      • 4.4 Set Device Bist FIS
    • 五、其他链接
      • 1、SATA模块之HBA卡开发总结
      • 2、PCIe物理层总结-PCIE专题知识(一)
      • 3、PCIe数据链路层图文总结-PCIe专题知识(二)
      • 4、SSD硬盘SATA接口和M.2接口区别总结

一、简介

FIS是一种用于Host和device之间信息传输的机制,每个FIS的格式都是固定的,并且对应唯一的ID。本文主要介绍常用FIS传输过程和对FIS内容进行详解,通过构造的FIS例子方便大家快速掌握FIS,常用的FIS TYPE如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/7a5be2d656f04f48a6a4f45313c8a5b2.png

二、总体介绍

2.1 详细FIS传输过程

当双方都空闲时,都在持续发送 SYNC 原语,这种状态称为空闲状态(IDLE)。发送方想要发起 FIS 发送,它开始持续发送 X_RDY 原语。经过一段延迟后,接收方收到了 X_RDY (该延迟来自链路层、物理层的信号处理延迟),此时如果接收方准备好接收 FIS 了,就持续发送 R_RDY 原语。发送方收到了 R_RDY 原语,就发送一个 SOF 原语,随后紧跟着逐个发送 FIS 数据包的 dword (包括 FIS-type,Payload,CRC),最后一个 dword (CRC) 发送完后要紧跟一个 EOF 原语,然后持续发送 WTRM 原语。接收方收到 SOF 后,开始持续发送 R_IP 原语,指示接受正在进行 (receiving in progress) 。完整地收完 FIS 后进行 CRC 检查。在收到 WTRM 原语后,如果 CRC 检查正确,就持续发送 R_OK 原语,否则持续发送 R_ERR 原语。发送方收到 R_OK 或 R_ERR 后,开始持续发送 SYNC 。接收方收到 SYNC 后,也开始持续发送 SYNC ,至此回到空闲状态,FIS 传输结束。如果发送方收到的是 R_ERR ,就向上层报告错误,上层决定是否重传该 FIS 。

从该过程我们可以看到,当一个通道发送 FIS 时,另一个通道在发送 R_RDY, R_IP, R_OK, R_ERR 这四种原语来控制对方发送 FIS 的过程,因此在一个时间点上 FIS 不可能双向发送。换句话说,SATA在物理上是全双工,在逻辑上是半双工。

另外,由于 HBA 和 device 都有发起 FIS 发送过程的权力,因此有可能刚好 HBA 和 device 都在发送 X_RDY,同时试图启动 FIS 发送。SATA规定这种情况下 HBA 总是要让着 device : HBA 只要检测到了 device 发来的 X_RDY ,就要放弃当前的发送进程,转而发送 R_RDY ,准备接收 device 发来的 FIS 。
在这里插入图片描述

2.2 FIS内容详解

在这里插入图片描述C -当寄存器传输是由于命令寄存器的更新时,这个位被设置为1。当寄存器传输由于设备控制寄存器的更新而被设置为零。
Control -包含Shadow Register的设备控制寄存器的内容
Command - 包含Shadow Register块的命令寄存器的内容
Device-包含Shadow Register的设备寄存器的内容
LBA(7:0) - Contains the contents of the LBA low register of the Shadow Register Block.
LBA(15:8) - Contains the contents of the LBA mid register of the Shadow Register Block.
LBA(23:16) - Contains the contents of the LBA high register of the Shadow Register Block.
LBA(31:24) - Contains the contents of the expanded address field of the Shadow Register Block
LBA(39:32) – Contains the contents of the expanded address field of the Shadow Register Block
LBA(47:40) – Contains the contents of the expanded address field of the Shadow Register Block
Features(7:0) - Contains the contents of the Features register of the Shadow Register Block
Features(15:8) – Contains the contents of the expanded address field of the Shadow Register Block
PM Port – If an endpoint device is attached via a Port Multiplier, specifies the device port address that the FIS should be delivered to.This field is set by the host.
R – Reserved – shall be cleared to zero.
Count(7:0) - Contains the contents of the Sector Count register of the Shadow Register Block.

三、FIS实例

3.1 构造一个write FIS

通过协议可以看到一个write buffer的FIS COMMAND是0xE8,然后Device位根据描述可以填写。
在这里插入图片描述

3.1.1 WRITE FIS内容

在这里插入图片描述

3.1.2 协议分析仪trace分析

对照2.2所描述的FIS结构,SOF可以不关注,第二行开始依次对应一个Dword。
分析第一个Dword,0x0A618027,bit[7:0] = 27代表FIS TYPE,bit[11:8] = 0表示不支持PMP,bit[15:12] = 0x8,表示C bit置位,应从COMMAND位读取bit [23:16] = 0x61为WRITE FPDMA命令,Sector count bit[31:24] = 0x0A,即10 LBA,后面的FIS依次参考分析。
在这里插入图片描述

3.1.3 write过程总trace

在这里插入图片描述在这里插入图片描述

3.2 构造一个read FIS

通过协议可以看到一个read buffer的FIS COMMAND是0xE4,然后Device位根据描述可以填写。
在这里插入图片描述

3.2.1 READ FIS内容

在这里插入图片描述

3.2.2 协议分析仪 read trace

具体分析过程参考3.1.2 write过程
在这里插入图片描述

3.2.3 read过程总trace

在这里插入图片描述

3.3 FIS和Command List储存

HBA使用系统内存的一个区域来通信接收到的fis上的信息。该结构由PxFBU和PxFB所设置的值。
对每个port对应的P#CLB和P#FB寄存器进行赋值
在这里插入图片描述

3.3.1 HBA Memory Space Usage

具体存放位置如下:
在这里插入图片描述

3.3.2 具体FIS存放规则

在这里插入图片描述
当DMA设置FIS从设备到达时,HBA将其复制到该结构的DSFIS区域。
当一个PIO设置FIS从设备到达时,HBA将其复制到该结构的PSFIS区域。
当D2H寄存器FIS从设备到达时,HBA将其复制到该结构的RFIS区域。
当Set Device Bits FIS从设备到达时,HBA将其复制到该设备的SDBFIS区域。

3.4 Comand List

主机与Device通信是通过FIS进行相互通知,通知后Device根据命令内容从command list对应的地址去获取相应的信息。
一个Port最多支持32个command,同时不同的command对应不同的command table。

3.4.1 Port System Memory Structures

在这里插入图片描述

3.4.2 command具体内容

Command List Structure
整体结构内容如下:
在这里插入图片描述
详细内容介绍:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.4.3 构造一个Command List

在这里插入图片描述

Command Table
在这里插入图片描述
Command FIS (CFIS)
这是一个软件构建的FIS。对于数据传输操作,这是H2D寄存器FIS格式Serial ATA Revision 2.6规范中规定的。HBA卡设置PxTFD.STS。BSY,然后发送此结构为附加端口。如果附加了端口倍增器,则该字段必须具有端口倍增器FIS本身的端口号-它不能由HBA卡添加。CFIS的有效长度为2 ~ 16个Dwords并且必须是Dword粒度。
ATAPI Command (ACMD)
这是一个软件构造的区域,长度为12或16字节,包含ATAPI命令to如果在命令头中设置了“A”位,则发送。ATAPI命令长度为12或16字节在长度。HBA卡传输的长度由bios发送的PIO设置FIS决定请求ATAPI命令的设备。
Physical Region Descriptor Table (PRDT)
该表包含数据传输的分散/收集列表。它包含一个0的列表(没有数据要传输)最多65,535个条目。PRD表中每个字段的细分如下所示。第0项是指在PRD表中的第一个条目。“CH[PRDTL] - 1”指的是表中的最后一项,其中长度为字段来自该命令槽的命令列表条目中的PRDTL字段。

四、其他trace

4.1 PIO SETUP FIS

在这里插入图片描述

4.2 DMA SETUP FIS

在这里插入图片描述

4.3 DATA FIS

在这里插入图片描述

4.4 Set Device Bist FIS

在这里插入图片描述

五、其他链接

1、SATA模块之HBA卡开发总结

2、PCIe物理层总结-PCIE专题知识(一)

3、PCIe数据链路层图文总结-PCIe专题知识(二)

4、SSD硬盘SATA接口和M.2接口区别总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/191143.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统管理:WinSCP 安装与使用

目录 一、实验 1.下载WinSCP 2.安装WinSCP 3.使用WinSCP 一、实验 1.下载WinSCP (1)地址 Downloading WinSCP-6.1.2-Setup.exe :: WinSCP 2.安装WinSCP (1)选择安装程序模式 (2)点击 (3…

C++初识类和对象

前言 上一期我们介绍了一些C入门的基础知识,本期我们来介绍面向对象。初步认识一下面向对象和面向过程、类、以及封装! 本期内容介绍 面向过程和面向对象 类的引入 类的定义 类的访问限定符和封装 类的作用域 类的实例化 类对象模型 this指针 一、面向…

name 属性:提高 Vue 应用可维护性的关键

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Linux加强篇006-存储结构与管理硬盘

目录 前言 1. 从“/”开始 2. 物理设备命名规则 3. 文件系统与数据资料 4. 挂载硬件设备 5. 添加硬盘设备 6. 添加交换分区 7. 磁盘容量配额 8. VDO虚拟数据优化 9. 软硬方式链接 前言 悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非…

5.7 Windows驱动开发:取进程模块函数地址

在笔者上一篇文章《内核取应用层模块基地址》中简单为大家介绍了如何通过遍历PLIST_ENTRY32链表的方式获取到32位应用程序中特定模块的基地址,由于是入门系列所以并没有封装实现太过于通用的获取函数,本章将继续延申这个话题,并依次实现通用版…

linux内核态内存泄漏检测-kmemleak

参考文章:Linux内核态内存泄漏检测工具--kmemleak工具原理及应用_linux 内存泄漏检测工具-CSDN博客 细说|Linux 内存泄漏检测实现原理与实现_内核_指针_信息 kmemleak原理:看网上说大概原理是在通过kmalloc,vmalloc&#xff0c…

分布式锁,分布式锁应该具备哪些条件,分布式锁的实现方式有:基于Zookeeper实现、Redis实现、数据库实现

文章目录 分布式锁0-1分布式锁--包含CAP理论模型概述分布式锁:分布式锁应该具备哪些条件:分布式锁的业务场景: 分布式锁的实现方式有:基于Zookeeper - 分布式锁实现思想优缺点基于Redis - 分布式锁实现思想实现思想的具体步骤&…

[AutoSAR存储] 车载存储层次 和 常用存储芯片概述

公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《AutoSAR存储》 <<<< 返回总目录 <<<< 1 存储系统层次 先抛个问题&#xff0c; 为什么要划分存储器的层次&#xff1f; 速度越快&#xff0c;但成本越高&#xff0c;从经济的角度规…

【Web】[GKCTF 2021]easycms

直接点击登录按钮没有反应 扫目录扫出来/admin.php 访问 弱口令admin 12345直接登录成功 点开设计--主题--自定义 编辑页头&#xff0c;类型选择php源代码 点保存显示权限不够 设计--组件--素材库 先随便上传一个文件&#xff0c;之后改文件名称为../../../../../system/tmp…

OSS+CDN的资费和安全

文章目录 花费OSSCDNOSS CDN 安全OSS防盗链跨域设置CORS数据加密 CDN防盗链URL鉴权Cookie鉴权远程鉴权IP黑白名单UA黑白名单 回源服务自定义私有参数IP黑白名单数据加密 花费 OSS 存储费用 &#xff1a;0.12元/GB/月下行流量费用 &#xff1a;0.5元/GB请求费用 &#xff1a;…

2023金盾杯线上赛-AGRT战队-WP

目录 WEB ApeCoin get_source ezupload easyphp MISC 来都来了 芙宁娜 Honor Crypto 我看看谁还不会RSA hakiehs babyrsa PWN sign-format RE Re1 WEB ApeCoin 扫描发现有源码泄露&#xff0c;访问www.tar.gz得到源码。 在源码中发现了冰蝎马。 Md5解码&am…

持续集成部署-k8s-配置与存储-存储类:动态创建NFS-PV案例

动态创建NFS-PV案例 1. 前置条件2. StorageClass 存储类的概念和使用3. RBAC 配置4. storageClass 配置5. 创建应用&#xff0c;测试 PVC 的自动配置6. 解决 PVC 为 Pending 状态问题7. 单独测试自动创建 PVC 1. 前置条件 这里使用 NFS 存储的方式&#xff0c;来演示动态创建 …

springboot打印启动信息

打印启动信息 转载自:www.javaman.cn 1 spring Bean实例化流程 基本流程&#xff1a; 1、Spring容器在进行初始化时&#xff0c;会将xml或者annotation配置的bean的信息封装成一个BeanDefinition对象&#xff08;每一个bean标签或者bean注解都封装成一个BeanDefinition对象&a…

传输层协议[精选]

网络: 跨主机通信. 互联网通信: 两点之间的通信路径有无数条. 集线器: 把一根网线差出来两根,但是同一时刻只能有一根线跑.交换机: 组建局域网.路由器: 本质就是将两个局域网连接起来 交换机和路由器之间的区别越来越模糊. 调制解调器: 使用电话线上网的时候,需要将电话线的模…

推动卓越创新:了解 4 种研发团队架构如何优化您的组织

揭示敏捷实践中常犯的12大错误&#xff0c;了解如何避免这些敏捷失败 陷阱&#xff0c;找出问题根源并采取有效改进措施&#xff0c;提高项目成功率。立即连线 Runwise.co 社区敏捷专家获得专业建议&#xff0c;或 Runwise.co 在线学习敏捷方法实战课程&#xff0c;提升您和团队…

Node——Node.js基础

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;它能够让JavaScript脚本运行在服务端&#xff0c;这使得JavaScript成为与PHP、Python等服务端语言平起平坐的脚本语言。 1、认识Node.js Node.js是当今网站开发中非常流行的一种技术&#xff0c;它以简单易…

【go入门】表单

4.1 处理表单的输入 先来看一个表单递交的例子&#xff0c;我们有如下的表单内容&#xff0c;命名成文件login.gtpl(放入当前新建项目的目录里面) <html> <head> <title></title> </head> <body> <form action"/login" meth…

11-25碎片小知识

一.strlen补充 strlen函数返回值是size_t&#xff0c;即无符号整型&#xff0c; size_t有头文件&#xff0c;是stdio.h 由于strlen函数返回值是无符号整型&#xff0c;所以下面代码要注意 -3会被转换成无符号的 实现my_strlen 法一&#xff1a;指针减指针 #define _CRT_S…

uniapp IOS从打包到上架流程(详细简单)

​ uniapp IOS从打包到上架流程&#xff08;详细简单&#xff09; 原创 1.登入苹果开发者网站&#xff0c;打开App Store Connect ​ 2.新App的创建 点击我的App可以进入App管理界面&#xff0c;在右上角点击➕新建App 即可创建新的App&#xff0c;如下图&#xff1a; ​ 3.…

MetaObject-BeanWrapper-MetaClass-Reflector的关系

MetaObject、BeanWrapper、MetaClass、Reflector之间是通过装饰器模式逐层进行装饰的。其中MetaObject、BeanWrapper是操作对象&#xff1b;MetaClass、Reflector是操作Class ObjectWrapper类结构图 BaseWrapper是对BeanWrapper、MapWrapper公共方法的提取及类图的优化&#…