问题标签 [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 投票
0 回答
118 浏览

c++ - Write28 始终写入硬盘驱动器/磁盘

我的这个 Write28() 函数有问题,它在 28 位 PIO 模式下写入 ATA 驱动程序(HDD 驱动程序)。好吧,首先你可以在我的 kernel.c++ 中看到我称之为:

这完全有效,并写入硬盘...但是..这是问题所在...我正在制作一个命令 mkfile (现在默认为文件名生成文件),它写入 ATA 驱动程序还。

有趣的是,这在 Read28 中发生在我身上,我不能多次调用 Read28 ......这是因为我之前 @millenburg 警告我返回一个指向局部变量的指针......基本上是 return (char*) str .. 当 str 是一个数组时。我删除了它似乎可以工作......但是 write28() 也没有使用它......我已经花了好几次尝试调试它并解决它,但它不起作用。如果有人对更多信息感兴趣,这是一个视频。这是我的 Write28 函数:

.. 我已经展示了 Minimal Code Possible 所以如果你想了解更多信息,请查看我的源代码(ata.c++ 用于 ata 代码):https ://github.com/amanuel2/OS_Mirror 。我正在尝试积极地找到这个错误,但我没有成功:(。任何提示或帮助将不胜感激!

0 投票
1 回答
1058 浏览

c++ - IOCTL_ATA_PASS_THROUGH 是如何使用的?

我一直在努力创建一个程序来发送(最好是任意的)ATA 命令,到目前为止,我在 Windows 中找到的唯一选项是IOCTL_ATA_PASS_THROUGH和一个相关的结构,使用 C++的ATA_PASS_THROUGH_EX 。

不幸的是,对于那些还不知道自己在做什么的人来说,我一直发现缺少这些文档。这是我没有弄清楚的:

  • 如何IOCTL_ATA_PASS_THROUGH在语句中使用?
  • 您将 ATA 命令发送到哪里?
  • ATA_PASS_THROUGH_EX.DataTransferLength应该是数据缓冲区的大小,以字节为单位。那是 struct + ATA 命令,还是只是命令?
  • 您如何选择命令将要执行的驱动器?
  • 驱动器的响应在哪里?
0 投票
0 回答
377 浏览

c - 无法在内核模式程序中写入 AHCI 控制器上的 SATA 磁盘

我正在编写一个实验性的内核模式程序来测试一些东西。我想对连接到 AHCI 控制器的 SATA 磁盘进行 IO。我有一个 C 驱动程序,该驱动程序以前在另一个类似项目上工作过,该项目在我不再拥有的另一台 PC 上运行。我现在拥有的 PC 是配备 ICH9 芯片组的 HP 笔记本电脑。所有读取和写入都是 2 个扇区大小,一次发生一个,因此它发出正常的 LBA48 DMA 读/写命令(无 NCQ)并获得一个中断信号完成。阅读按预期完美地工作,但写作失败 100% 的时间。PxSERR 保持为零,但 PxIS 中的 TFES 位亮起。设备在错误寄存器中显示 0x84(接口 CRC 错误,命令中止),在状态寄存器中显示 0x51(错误,查找完成,设备就绪)。这似乎指向布线问题或类似的硬件问题,但是 Linux 在同一设备上读取或写入同一分区没有问题,并且 BIOS 内置磁盘测试报告磁盘工作​​正常。向设备发送指定较低 DMA 模式的 SET FEATURES 命令没有任何区别,Linux 报告无论如何都将设备置于 UDMA/133 模式。(这甚至与 SATA 有关吗?)无论如何,有人能想到我缺少的东西吗?

0 投票
0 回答
100 浏览

limit - What may cause a limit on SG_IO ioctl maximum sector count of a transfer?

I need to pass a direct ATA request to a hard drive (0x25, READ DMA EXT), to disobey max sector count (long story), and to bypass all possible OS caches, buffers, reorderings et al.

HDIO_DRIVE_TASKFILE IOCTL is no longer available due to libata.

I accomplished the goal with a SG_IO IOCTL with ATA pass-through (SG_ATA_16). Works perfectly except one problem: I can read a maximum of 8192 sectors in one command. I need to read a full of 32767 sectors.

  • max_hw_sectors_kb is 32767, so the drive supports this much transfer
  • max_sectors_kb was low, yet I brought it up to 32767 sectors, to no avail
  • scheduler is set to noop, no change.
  • Tried gather buffer (iovec_count>0, properly set iovecs to consecutive buffer slices), no change.

Environment: Ubuntu 16.04/16.10/17.04 with standard kernels, SATA drive connected to standard AHCI interface on Intel chipset.

No matter what I do, starting with 8193 sectors, IOCTL bails out with "Invalid argument" error.

Where to look? What else can cause a 4MB data transfer cap?

0 投票
1 回答
495 浏览

delphi - 在哪里可以找到 HDD 的 SMART 阈值?

我正在编写一个 SMART 监控工具,我设法使用 SMART_REA_DATA 命令获取 SMART 属性 [当前、最差、原始数据],但我也需要阈值,我搜索了ATA 文档,但我没有找到任何关于如何阅读阈值。有谁知道我可以从哪里得到这些值?

0 投票
2 回答
1111 浏览

c# - 如何执行 SMART 自检

我正在编写一个基于 .NET 的应用程序,用于检查系统中一个或多个磁盘的健康状况。

我可以使用 ATAPI 的 WMI 接口来获取 SMART 数据,然后链接:http ://wutils.com/wmi/root/wmi/msstoragedriver_atapismartdata/

但我不知道如何执行 SMART 自检。有没有办法通过使用 C# 来做到这一点?

0 投票
2 回答
34 浏览

time - 一次获取最小值,最大值的 SQL 代码

如何一次显示表中的最低和最高工资(一次2条记录,一条带有最大值,另一条带有最小值)?

我的输入表数据:

输出:

0 投票
1 回答
2997 浏览

raspberry-pi - 如何让 Raspberry Pi 成为 VoIP ATA 设备

我想使用 Raspberry Pi 制作一个 VoIP ATA(模拟电话适配器)设备,此外,我还想将 FXS 端口添加到 Raspberry Pi。请告诉我这是否可能。如果是,那么如何?

这是 参考链接

0 投票
2 回答
723 浏览

assembly - 在没有 BIOS 中断的情况下从 HDD 读取数据 DRQ 位未设置

重要提示:此代码将在没有格式化或恢复的情况下使媒体无法使用。使用未使用的、空的或不需要的介质。

复制 BIOS 中断函数的行为应该很简单,但在线有关它的信息在现实生活中的使用场景中却乏善可陈。所以我编写了代码来读取 2.5" 硬盘驱动器标识信息,这是 int 13h 的函数。我在检查 0x1f7 状态寄存器的 DRQ(数据准备好查询?)位的阶段遇到了问题。当我评论在 check-DRQ 循环中代码继续执行,但数据全为 0,可能是因为它没有被读取。我尝试过改变从属和主位,以及主/辅助总线......辅助总线通过 DRQ 检查但数据似乎全为 1。重要的是,int 13h 在同一个驱动器和同一台机器上工作正常。有谁知道是否有办法:a)知道硬盘的 ide 位置(主要/​​次要,主/从)正在启动,然后 b) 测试它' s 那里没有读取它,并且 c) 弄清楚如何让 DRQ 位变为绿色?错误寄存器在 DRQ 出来之前是否有意义?

有趣的是,BIOS 显示除了 USB、DVD 和 LAN 条目之外的 3 个 HDD,但我只有两个用于硬盘驱动器的插槽。而且我永远无法插入我的 HDD,使其成为 HDD1。奇怪。这可能有关系吗?

这是我的可引导代码,用于使用控制寄存器从 ATA HDD 主主机读取并在屏幕上将其几个字节作为二进制数打印:

0 投票
0 回答
251 浏览

x86 - (ATA PIO) 从端口读取垃圾

我一直在尝试编写一个 ATA PIO 驱动程序来从保护模式加载文件,但我从端口收到的所有数据似乎都是垃圾(0xffff)。

这是我第一次编写 PIO 驱动程序,所以我不确定我在做什么是正确的。我一直在关注 OsDev 的链接以使 28 位 PIO 正常工作。(https://wiki.osdev.org/ATA_PIO_Mode#28_bit_PIO

这是尝试使用 PIO 读取加载第一个扇区的代码片段。

从我的 asm 我这样称呼它:

以下是 disk_wait 和 drq_wait 函数:

但我收到的所有数据似乎都是0xffff.

我已经检查了引导加载程序中的 boot_disk 值。并且 dl 的值是080hqemu 从硬盘启动。