问题标签 [sata]

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 回答
1056 浏览

delphi - Delphi - 在 Windows 中枚举 SATA IO 端口号

给你一个新的。我准备帮助另一个程序员将​​他的程序从 C# 移植到 Delphi。我不能真正阅读 C#,他也没有在这一点上给我发送实际的源代码,所以从讨论中我认为我将在一个时间点从一个函数处理大部分问题。

我需要能够获取连接到系统的所有 SATA 设备(我相信我的意思是设备)的 IO 端口号。我知道 WMI 不会这样做,所以我不知道从哪里开始。我知道这个应用程序的 C# 版本使用基本上解析注册表的 C# 类。我一直很讨厌直接从注册表中读取。如果可能的话,我觉得从 windows api 或相关信息获取信息在 windows 版本之间更可靠。

0 投票
3 回答
2719 浏览

windows - 直接控制 ATA 命令

我正在做硬盘分析,想知道有没有办法在windows下直接控制ATA硬盘。简而言之,我想做一个像数据包嗅探器这样的东西,但是对于发送到/从硬盘驱动器的 ATA 命令。

之后,我希望能够直接在驱动器上编写 ATA 命令。如果这在 Windows 下是不可能的,那么 Linux 是第二选择。

第三个选择是制作一个在 PC 控制下完成所有这些工作的 FPGA。

关于这是否可以通过标准 API 实现的任何想法?

0 投票
1 回答
972 浏览

c++ - 如何以编程方式检测 SuSE Linux 中的 sata 驱动器拔出?

有谁知道我可以用来以编程方式检测 SATA 硬盘驱动器是否已拔出的方法?当我们需要检测驱动器的移除时,我们的文件系统以只读模式安装。前几天我们注意到,我们能够拔下硬盘驱动器,并且一切都继续顺利运行,直到我们下次尝试从磁盘上的文件中读取。

0 投票
1 回答
1670 浏览

hard-drive - LBA 级磁盘访问

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

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 投票
2 回答
2494 浏览

linux - 如何在 Debian Linux 中检查驱动器是否存在

我有一个 Debian Linux 服务器,上面连接了两个 eSATA 驱动器(NTFS,bleh)。它们目前安装良好,并且具有正确的 fstab 条目设置(使用 UUID,而不是 /dev 位置)。

我得出的结论是,我需要添加“noauto”挂载选项,以便在服务器启动时不会挂载它们(以防止服务器在它们不存在时挂起。我确实计划将它们放在偶尔出游)。

但是,一旦系统启动,我应该如何设置一个初始化脚本来挂载它们?我可以做 a mount /mount/location,但我更愿意在做之前检查它们的存在(以防止抛出错误)。另外,我是否只需将此脚本放入/etc/init.d/目录中即可工作?(我对 Debian 很陌生)

0 投票
1 回答
2649 浏览

delphi - SATA驱动器的硬盘ID

我正在使用我的软件的硬盘 ID 来检查真实用户是否正在使用该软件。对于 IDE 类型的硬盘,我使用过程 GetIdeSerialNumber 获取 id。

但如果是 SATA 驱动器,它会将 id 设为空白。

然后在 SATA 驱动器的情况下,我使用卷 ID 作为唯一 ID。

但是当系统格式化时,volume id 会改变

现在我想知道我正在使用哪个硬盘驱动器,以及如何在delphi 7中获取SATA驱动器的硬盘ID?

编辑:根据客户规格的软件需要锁定到硬件,相关的 ID 是

  1. MAC地址
  2. 高清 ID(SATA 或 IDE)
  3. 控制器ID(这是驱动软件开发的硬件的电机,ID是唯一的)

客户端已接受如果系统更改,则身份验证层将失败,但我们已获准将软件锁定到硬件。

所以我想知道如何获取 SATA ID

0 投票
0 回答
3354 浏览

c - 如何在代码中在 SATA 控制器上从 PIO 切换到 DMA 模式?

我正在运行 Windows 7。我需要构建一个无人值守/自动测试来运行一些 SATA 驱动器。测试要求之一是在两种状态(启用和禁用)下使用 DMA 运行驱动器。

要手动更改此设置,您将:


正如我所说,我需要在无人看管的情况下执行此操作。关于如何完成的任何想法?我搜索了 Windows 开发中心,包括驱动程序开发工具包中的设备实例和设置内容。我在那里找不到任何相关的东西。我还搜索了可能完成这项工作的注册表项,但也没有找到任何东西。

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上有没有人可以启发我?

0 投票
3 回答
3115 浏览

c# - 如何确定给定磁盘的 SATA 通道?

使用DISKPART命令行实用程序,我可以得到一个名为“位置路径”的东西,它似乎给了我我需要的东西,你可以detail diskdiskpart.

看来我可以通过此类以编程方式获取此信息:MSFT_Disk

我不确定如何获取此类的实例。我有一些使用ManagementObjectSearcherforWMI类的示例,但该方法对我不起作用,我也不确定MSFT_Disk' 在 Windows 7 中的可用性,因为该页面提到这是针对 Windows 8 的。

有谁知道获取 SATA 通道信息或磁盘“位置路径”的好方法?