问题标签 [ata]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
187 浏览

rfc - 寻找官方的 ATA-4 规范/RFC

我正在寻找以下之一: - ATA-4 规范 - 以实模式汇编 (MASM/TURBO ASM) 编写的 ATA-4 规范的包装器

0 投票
1 回答
2560 浏览

drivers - ATA TRIM 规范?

有人知道我在哪里可以找到详细说明触发 TRIM 的协议的 ATA 参考资料吗?我正在寻找我需要在原始 IOCTL 中发送什么样的结构/对象/数据才能让 ATA 设备触发 TRIM(显然,假设有适当的硬件/固件支持)。

谢谢。

0 投票
1 回答
1670 浏览

hard-drive - LBA 级磁盘访问

向 SATA 磁盘发出磁盘命令(从 lba n 等读取 k 块)的最佳方法是什么?操作系统的选择并不重要。我还需要能够发出 ATA 命令。我宁愿通过工具/应用程序来做到这一点,也不愿以编程方式使用 ioctls。

0 投票
1 回答
5310 浏览

linux - Linux 中的 ATA 可信命令

同事,

我正在实现对 ATA 可信命令的支持

用于 Linux(两个主机,Fedora 12 和 14)以支持自加密驱动器。我从这个页面http://www.jukie.net/bart/blog/ata-via-scsi 获取了一个代码作为基本代码。对于可信接收(在这一层上它与 IDENTIFY, 0xEC 相同):

它非常适用于识别和所有其他命令,但不适用于受信任的命令。当我连接协议分析器时,我看到这些命令没有发送到 SATA 总线。适配器能够发送它们,因为它们在 Windows 下运行良好(不是我的代码,但我认为使用 ATA_PASS_THROUGH)。是的,我以 root 身份运行此代码。

请帮助解决这个谜团:)

0 投票
1 回答
1201 浏览

drive - Windows XP 中 SAS 总线上的 ATA 直通

我想向 SAS(SATA 附加 SCSI)总线上的驱动器发送“ATA Pass through Direct”命令。驱动器为 SATA 驱动器,在 Windows XP(x86) 环境下。我希望有一个 STP(SATA 隧道协议)层可以将 ATA 命令转换为 STP,以通过 SCSI 总线发送到我的 SATA 驱动器。但是,当向 Win32 API DeviceIOControl() 发送“ATA Pass through direct”命令时,状态返回错误“错误功能”。Windows XP 中是否存在 STP 层,它必须,Win32 API Readfile()/Writefile() 工作。但是如何让“ATA Pass through direct”命令与 SAS 总线上的 Win32 API 一起工作?

0 投票
3 回答
31755 浏览

windows - 将 ATA 命令直接发送到 Windows 中的设备?

我正在尝试将 ATA 命令发送到 Windows 中的物理磁盘,并从设备获取响应。

注意:在这种情况下,我想发送IDENTIFY DEVICE(0xEC) 命令。该设备将响应一个 512 字节的数据块。(特别是我对第 119 字的第 0 位感兴趣——设备对命令的支持TRIM)。

我知道我需要使用CreateFile来打开设备:

但在此之后,我不知道该怎么做。

我考虑过0xEC使用发送[DeviceIoControl][4]

但这是完全错误的。发送到DeviceIoControl的 IoControlCode必须是有效的 IO_CTL,它是使用宏构建的

查看 SDK,有许多有效的磁盘管理控制代码,例如:

  • IOCTL_DISK_CREATE_DISK
  • IOCTL_DISK_GET_DRIVE_GEOMETRY
  • IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
  • IOCTL_DISK_GET_PARTITION_INFO
  • IOCTL_STORAGE_QUERY_PROPERTY

但它们都不是IDENTIFY DEVICE命令,也不是返回它返回的任何东西。

所以我相信我必须使用一些“原始”的方法来发送命令。


环顾四周,我遇到了无证 IOCTL

当您分解 IOCTL 部分时,这意味着:

但是在任何地方都没有关于inputBuffer必须包含什么、它的大小、outputBuffer它将包含什么或它需要什么的文档。我也不知道functionCode34 (0x22) 是什么。


我的问题:如何向 ATA 设备发送原始 ATA 命令(例如 0xEC)并读取其响应?

也可以看看


答案片段

打开具有读写访问权限的驱动器:

设置一个ATA_PASS_THROUGH_EX结构作为我们的输入缓冲区以与IOCTL_ATA_PASS_THROUGHIO 控制代码一起使用:

设置一个输出缓冲区来保存我们预期的来自驱动器的 512 字节响应:

致电DeviceIoControl

关闭文件句柄:

0 投票
1 回答
1069 浏览

device-driver - 确认 ATA/IDE 中断的正确方法是什么?

我目前正在开发一个爱好操作系统,特别是 ATA 驱动程序。我在使用带有中断的 PIO 数据输入命令时遇到了一些问题。我正在尝试执行 READ MULTIPLE 命令以逐块读取驱动器中的多个扇区,并为每个块触发一个中断。

如果我请求读取 4 个块(每块 1 个扇区)。我希望得到 4 个中断,每个数据块一个。在收到第四次中断后,我可以确定我已经传输了所有数据并相应地更新了我的请求结构。但是,在 VirtualBox 中,我发现在传输最后一个数据块后,我收到了另一个中断(状态 = 0x50,就绪,重叠模式服务器请求)。我可以简单地读取状态寄存器然后将其清除,但我认为根据规范我不应该收到第 5 个中断。

那么,什么是正确的方法来确认 ATA 设备发出的中断呢?

在这个例子中,我发出一个 READ MULTIPLE 命令,然后我的 ISR 执行以下操作:

  1. 禁用 CPU 中断,设置 nIEN
  2. 从 DATA 寄存器读取单个数据块(不是扇区!),
  3. 如果已读取所有数据,则读取 STATUS 寄存器以清除“额外”中断
  4. 通过清除 nIEN 退出,并向主从 PIC 发送 EOI

PIO 数据输入命令协议的 ATA 规范并不表示您需要读取状态寄存器。由此我假设当我收到中断时,我所要做的就是遵循协议并通过将 EOI 发送到 PIC 来完成。至于 nIEN 的设置/清除,在处理 VirtualBox 时,我发现如果我不这样做,我不会收到任何超过第一个中断的中断。所以我在进入ISR的时候设置了nIEN,然后在我离开之前清除它。我认为这不会有任何影响,但它必须与读取/写入该特定寄存器有关。

0 投票
1 回答
196 浏览

assembly - 读取 I/O 端口有副作用吗?那么在程序化 I/O 中呢?

读取 CPU 端口(通过in/out指令)是否有任何副作用?

例如:

  1. 它是否“告诉”设备该端口已被读取?

  2. 不小心读取任意端口会造成任何伤害吗?

我假设它不应该,但是有些东西对我来说没有意义:

如果没有副作用,那么 ATA 驱动器如何在进行编程 I/O 时“知道”何时读取了一个字,以便提供下一个数据字?

0 投票
0 回答
2304 浏览

windows - 发送 IDENTIFY DEVICE COMMAND - ATA PASS THROUGH on raid - SSD

我的目标是在具有 raid 配置的系统中检测固态驱动器。使用 smartmontools 的以下命令,我观察到位 434 (217) 显示 SSD 的值 1: smartctl -i -r ataioctl,2 /dev/csmi0,0

尝试读取相同的 512 字节数据我尝试通过以下 2 种方式发送 IDENTIFY DEVICE 命令:

方法 1 失败,DeviceIoControl() 将 GetLastError() 设置为 87 (ERROR_INVALID_PARAMETER),你能帮我理解什么可能是错误的,我是否在正确的轨道上?

方法 2 有 info->IoctlHeader.ReturnCode = 3 这意味着 CSMI_SAS_STATUS_INVALID_PARAMETER。(提供的 CSMI 缓冲区太小)

///////// 方法一 /////////

//////// 方法二 //////////

0 投票
1 回答
1750 浏览

linux-kernel - 绕过 I/O 调度和 linux 内核页面缓冲

我想要完成的工作:

PATA/SATA 硬盘驱动器 (HDD) 发送 ATA 命令(实际上只有那些不修改访问的 HDD 上的任何字节的 ATA 命令 - 例如,READ_SECTOR、IDENTIFY_DEVICE、SET_FEATURES 等)。

“完全”,我的意思是只要 HDD 通电(一个自定义硬件 - 这是一个简单的开关,确保在加载应用程序并希望这样做之前,HDD 不会通电),第一个并且只有我的应用程序才能访问该 HDD。除了我的应用程序之外的 IOW,甚至 linux 内核(包括 SCSI 子系统)或任何其他应用程序或进程或人类用户都无法访问该 HDD,除非我的应用程序指示/允许他们这样做。

我的应用程序还有另一个要求:由于在我们的应用程序中对 HDD 的访问非常关键(在控制方面而不是在性能方面),因此不希望在完成的事务中涉及任何 I/O 调度按应用程序(此 HDD 上的性能不是限制。)。此外,不希望从 HDD 读取的数据由内核缓冲区或页面缓冲区进行缓冲。应用程序将读取 512 字节或仅其倍数的块大小。

现在我面临的问题是:

SCSI 子系统位于 I/O 调度程序和内核缓冲区或页面缓冲区高速缓存下方(并被写入以与之一起工作)。

虽然 SCSI 子系统提供了 'sg-driver' 来直接发送命令(- Linux SCSI 子系统命令,而不是 ATA 或 SCSI 命令直接 - 然后由 libata 转换为实际的 ATA 命令。我在这里吗?) HDD,但这是一种 I/O 方法 - 你给 i/p 并获得 o/p,即你无法控制数据传输协议的过程(例如 PIO、DMA 和 ATA 状态和错误寄存器等)和设备配置(通过设置功能 ATA 命令。)。

此外,错误报告机制必须健全且特定于 ATA 协议,而不仅仅是 Linux SCSI 子系统错误代码。IOWs 我的应用程序需要访问 PATA/SATA HDD 上的 ATA 错误寄存器和 ATA 状态寄存器。

我的应用程序需要的是对 HDD 的独占控制 - 例如。发出 READ_SECTOR ATA cmd,然后通过读取 i/o 端口或通过“libata”直接从 HDD 中检索数据本身必须满足上述要求。

我不能做什么?

我不会编写 PATA/SATA HBA 设备驱动程序或市场上可用的每个 HBA,因为它们已经包含在 libata 的内核中。

到现在为止我学到了什么?

为了完成所需的任务,我可能(或可能不需要?)需要编写一个直接与 VFS 层交互的块设备驱动程序(或者有什么方法可以绕过 VFS,以便我的应用程序可以直接与这个块驱动程序通信) w/o 涉及/弄乱内核缓冲区或页面缓冲区和 I/O 调度程序。此块驱动程序将直接与 libata 通信(绕过 SCSI 子系统上层),然后与 PATA/SATA HBA 驱动程序通信。

是否可以以独立于 cpu 架构的方式编写这样的驱动程序?

这是一种可行的方法吗?如果是,那么它会影响我的应用程序未访问的其他附加硬盘的 I/O 性能。这样。在这种情况下,我是否需要通过 VFS 编写系统调用(或绕过它),以便我的应用程序与我的块驱动程序进行通信?请告诉我这种方法。

或者我的块设备驱动程序是否可以直接与为 libata 编写的 PATA/SATA HBA 驱动程序通信,但是这种方法会再次影响我的应用程序无法访问的其他附加硬盘的 I/O 性能。这样。另外,我的应用程序将如何与此块设备驱动程序通信?

请赐教。

此外,我想了解我的应用程序的相同场景,但有一个区别 - 如果我有 SCSI 硬盘驱动器及其变体,而不是 PATA/SATA 驱动器 - 特别是 SAS、光纤通道和 USB。当然这次我不会使用 libata 和 ATA 命令,而是使用 SCSI 协议命令。

你想推荐一个 live cd 发行版作为我的应用程序主机,它包含 PATA/SATA HBA libata 驱动程序(-不适用于 IDE 子系统,因为我不会使用它,因为它现在已贬值,因此可能不会更新关于对于 HBA 驱动程序。)对于大多数 HBA。

简而言之,Linux 应用程序访问 PATA/SATA 或 SCSI/SAS/光纤通道 HDD 的最直接方式是什么。

我希望,我已就我的问题提供了足够的信息,但如果您想获得更多信息或更多说明,请随时提问。

Update1(2012 年 6 月 27 日)
通过与 Chris 的有益讨论(见下文)和我的研究,我得出以下结论:

  1. 一个现成的 USB 到 PATA/SATA 适配器不能解决我的目的,因为它不允许我的应用程序。或驱动程序即时更改数据传输模式(PIO vs DMA),它不允许我的应用程序。或驱动程序来读取 ATA 寄存器。

  2. 定制的 USB 到 PATA/SATA 适配器可能会有所帮助,但这需要一个需要实现 ATA 协议的嵌入式处理器,或者一个实现整个 ATA 协议的 FPGA 芯片。但是嵌入式处理器解决方案涉及 GPIO,不适合 SATA,因为它需要专门的收发器,而且 I/O 性能对于 PATA 和 SATA 来说都是一个问题——对于我的应用程序来说太慢了。

这样的适配器将与我的 linux 内核驱动程序(或通过 libusb)与我的应用程序通信。通过自定义协议帮助我的应用程序进行黑白通信。和嵌入式处理器上的 ATA 协议。如果是 FPGA 芯片解决方案,我需要在 FPGA 本身中实现这个协议以及 ATA 协议。

但此时我实现FPGA解决方案和嵌入式处理器解决方案在人力、时间和金钱方面是不可行的。所以我坚持使用纯软件解决方案

最后,我可能不得不复制和修改所有内容,直至硬件接口层,以满足 Chris 所说的要求。

因此,在 VFS 层和 HBA 驱动程序或 libata 层之间,我应该如何进行。哪些事情需要实施,哪些不需要?

有人可以阐明这个问题吗?有任何想法吗??

Update2(2012 年 1 月 7 日)
我正在努力解决这个问题。SO上有没有人可以启发我?