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

linux - fsync(fd) 是否适用于外部程序创建的文件?

我有一个禁用写缓存的 SATA 硬盘:

我正在ext4使用这些挂载选项(以及其他选项)的分区上进行操作:

Linux 内核版本为2.6.32-5-686.

现在,我有一个无法修改的外部程序,但我知道它会通过以下方式创建一个文件:

即它在关闭前不同步。所以在这一点上,数据可能在 RAM 中,在内核/fs 缓存的某个地方。

注意:元数据还不是问题:在我确定数据已经到达磁盘盘片后,最终的元数据将被写入并同步。数据本身就是问题所在。

所以问题是,我怎样才能帮助数据到达实际的磁盘盘片?

之后我考虑过运行这个单独的程序:

这将有助于刷新数据,还是我应该使用不同的方法?

0 投票
3 回答
2021 浏览

c++ - 如何使用 ATA 命令读取磁盘的特定扇区?

我想在 vc++ 中使用 ATA 命令读取磁盘的特定扇区(MBR 扇区)。我是 VC++ 新手,所以在使用DeviceIoControl向磁盘发送命令时遇到问题。我提供了一个代码,用于使用命令读取扇区(0x20)读取扇区。

我无法理解这段代码有什么问题以及我在这里缺少什么,但它不起作用。我在这里缺少什么?如果 PATA_PASS_THROUGH_EX 结构的参数有问题,请告诉如何读取第一个扇区(MBR)。

0 投票
1 回答
199 浏览

linux - 访问硬件寄存器中的内存指针

我正在努力增强 Linux 中提供的股票 ahci 驱动程序,以执行一些需要的任务。我正试图向 AHCI HBA 发出命令以供硬盘驱动器处理。但是,每当我这样做时,我的系统都会锁定并重新启动。试图解释向 AHCI 驱动器发出命令的过程对于这个问题来说意义重大。如果需要,请参考此链接以进行完整讨论(该过程已完全定义,因为有几个部分,但是,第 4 章具有必要的数据结构)。

本质上,将适当的结构写入由 BIOS 或操作系统定义的内存区域。我应该写入的第一个内存区域是寄存器 PxCLB 中包含的命令列表基地址(如果适用 64 位寻址,还有 PxCLBU)。我的系统是 64 位的,所以我试图同时获取 32 位寄存器。我的代码基本上是这样的:

ahci_port_base()函数可以在 ahci 驱动程序中找到(至少它适用于 CentOS 6.x)。基本上,它会返回 AHCI 内存区域中该端口的正确地址。PORT_LST_ADDR 和 PORT_LST_ADDR_HI 都是该驱动程序中定义的宏。我得到高地址和低地址后得到的地址通常是0x0000000037900000。这个内存地址是否在我不能简单地取消引用它的空间中?

在这一点上,我的头撞到了墙上,因为这个链接表明以这种方式访问​​它本质上就是它的完成方式。

0 投票
1 回答
1661 浏览

c++ - 在 C/C++ 中,如何以编程方式检测 Windows 中的 SATA SSD 插入和拔出?

我正在尝试编写一个 C/C++ 程序来检测 Windows 7 中的新 SATA SSD(固态驱动器)连接。

这款 SATA SSD 还配有 SATA-USB 电缆。我已将 SATA 端连接到 SATA SDD 并将 USB 端连接到我的计算机。这样做我已经能够通过使用 Windows 消息系统检测WM_DEVICECHANGE消息和相关DBT_DEVICEARRIVAL事件来检测 SATA SDD 连接和删除。为此,我还使用RegisterDeviceNotification了注册设备(即 SATA SSD),以便顶级窗口接收DBT_DEVTYP_DEVICEINTERFACE具有 SATA SSD 的 classguid 的设备类型的通知。

但是,当我尝试将 SATA SDD 连接到计算机主板上的 SATA 端口时,我的程序无法运行。

在 C/C++ 中,如何检测 Windows 中的 SATA SSD 插入和拔出?

0 投票
0 回答
139 浏览

windows - 在使用 FILE_FLAG_WRITE_THROUGH 打开的 HANDLE 上调用时,WriteFile 何时应该阻塞?

在工作中,我们在 Jenkins 的帮助下定期在几台构建机器上运行我们的单元测试。其中一个单元测试打开一个带有 的文件,并对该文件FILE_FLAG_WRITE_THROUGH进行数万次调用。WriteFile为什么这样做与这个问题无关。仅在其中一台构建机器上,此测试不断超时。经过一番调查,结果发现其根本原因是每次调用都WriteFile被阻塞(线程被切换出去,然后又被切换进来),使得测试运行速度大大降低。奇怪的是,当在这台机器上手动启动测试时,WriteFile并没有阻塞,因此测试没有超时。

经过数小时的反复试验,我找到了一个“解决方法”:在受影响的机器上,如果 Jenkins 是使用任务计划程序启动的,WriteFile被阻止,如果它是手动启动的,或者通过将 BAT 文件放在 Startup 文件夹中,它没有。我认为我需要进行更多调查,所以我创建了一个最小的 repro,一个用 . 打开文件的小程序,FILE_FLAG_WRITE_THROUGH并使用随机数据调用WriteFile它 10000 次。有了这个最小的复制,WriteFile无论我如何启动它,都会不断地阻塞。我真的很困惑,所以在这里我要求对这种行为进行任何解释。我进行测试的所有机器都有 SATA 驱动器,默认设置(写入缓存和 Windows 写入缓存刷新已启用)。

首先对我来说,它甚至不是 100% 清楚FILE_FLAG_WRITE_THROUGH应该做什么。互联网上的信息表明,一个特殊的标志被传递给设备,要求它在写入后刷新其缓存。根据Raymond Chen(和其他一些人)的说法,现在这几乎无关紧要,因为大多数 SATA 驱动器由于性能原因默默地忽略了这个标志。在“应该或不应该阻止”方面,此页面明确指出 withFILE_FLAG_WRITE_THROUGH WriteFile 应该阻止:

在将数据写入文件之前,write 调用不会返回。

你知道为什么我会看到这种奇怪的行为(不一致)吗?我该如何进一步调查?

0 投票
1 回答
378 浏览

ide - QNX 从 IDE 驱动器镜像到 SATA 驱动器问题


提前抱歉这个很长的问题。
我正在尝试将许多运行 QNX 以用于控制和监视目的的旧 PC 升级到新 PC。
旧 PC 非常旧,安装在 IDE 驱动器上。
我已经成功地将旧驱动器镜像到 SATA 驱动器上,并成功地让它在具有 IDE 和 SATA 连接器的旧 PC 上运行(远不及原始 PC)。
这里值得注意的一件事是,在 QNX 启动期间,它会验证连接了哪些驱动器。在这种情况下,它将 SATA 驱动器检测为 IDE 驱动器,而不是将其检测为 SATA 驱动器。(QNX 首先检查 SATA,然后是 IDE 和 USB)。
当我尝试将同一个新硬盘连接到没有 IDE 的较新 PC 时,问题就开始了。在这种情况下,尽管 QNX 在启动过程中无法检测到 SATA 驱动器,但它会开始从 SATA 驱动器安装,并有效地停止,无处可去。
通过讨论和研究,我发现我可能会得到一台具有 BIOS 的 PC,您可以在其中更改 SATA 设置以充当 IDE。所以我购买了一台可以做到这一点的新电脑(变得非常罕见)。不幸的是,它再次失败了,这次不同。当 QNX 启动到尝试验证硬盘驱动器是否存在的地步时,而不是通过 SATA、IDE 和 USB 选项进行压缩,什么也没找到,它锁定在 IDE 检查中,只留下本应是旋转 /-- 在初始 / 位置,需要重新启动 PC,它只是继续做同样的事情。
所以现在是假设和问题。
我不太确定为什么 QNX 会出现新驱动器的问题。QNX 是否因为镜像的原始驱动器中的一些残留 IDE 信息而无法验证 SATA 驱动器,从而混淆它,为什么 QNX 在它是 SATA 时将其检测为 IDE 驱动器?
从哪里来?任何想法将不胜感激,因为这已经持续了一段时间。
一个想法是沿着 SATA 驱动器上可能残留的 IDE 信息,如果有办法覆盖它,所以驱动器被识别为 SATA?我在 Google 上找不到任何关于此的信息,这让我觉得残留的 IDE 信息可能有点牵强:)。
感谢阅读,希望对您有所帮助。
干杯,
马库斯

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 投票
1 回答
380 浏览

linux-device-driver - 使用 DD 命令进行磁盘写操作的混乱



我正在为基于 FPGA 的嵌入式系统开发低级 SATA 驱动程序。司机运行良好。

当我使用 dd 命令从磁盘读取扇区时,我可以看到 SCSI read(10) 命令(操作码 0x28)被我的低级驱动程序接收,我认为这是正确的。但是,当我使用 dd 命令将扇区写入磁盘时,SCSI 驱动程序会多次发送第一次读取(10)命令(操作码 0x28),然后发送少量写入(10)命令(操作码 0x2A)。

有人可以解释一下,为什么 SCSI 驱动程序在写操作期间发送 read() 命令?


编辑:在文件写入操作期间,我可以看到驱动程序首先从 LBA 0 读取(DMA 模式)到大约 8 个扇区。然后它写入 (DMA) sg 块,然后读取 (PIO) 磁盘特定信息。之后,它需要一些随机 LBA 并执行几次读取(DMA),最后它通过读取设备特定数据读取(PIO)来停止。这是 dd'ing 1KB 文件的序列。该磁盘没有分区表,也没有文件系统(通过 fdisk 实用程序验证)。这是司机的正常行为吗?如果是,那么它不会降低运行速度吗?由于写入操作中的额外读取,整体文件读取比写入快。

谢谢

0 投票
0 回答
438 浏览

driver - SATA驱动程序;AHCI端口初始化;启动(ST)命令列表;

我在开发板上初始化和运行 AHCI 端口时遇到问题。处理器具有 SATA 主机控制器,实现了 2 个端口(端口 0 和端口 1)。带 SATA 接口的 SSD 驱动器连接到端口 1。

PxCMD.ST根据“Serial ATA AHCI 1.3.1 Specification”的“10.3.1 Start (PxCMD.ST)”一章,在设置为“1”之前应满足一系列条件。设置该位后,PxCMD.CR应设置以指示端口已准备好并运行。

问题PxCMD.CR永远不会被设定。

启用前的状态PxCMD.ST

  • 端口处于空闲状态,PxCMD.ST并且PxCMD.CR都是“0”
  • FIS 接收启用,PxCMD.FRE为“1”
  • 驱动器连接到端口PxSSTS = 0x00000133( SSTS.IPM = 1, SSTS.SPD = 3, SSTS.DET = 3), PxTFD = 0x00000150( TFD.STS.BSY = 0, TFD.STS.DRQ = 0, TFD.STS.ERR = 0)
  • PxCLB/PxCLBU用物理地址设置缓冲区并且缓冲区对齐。(1KB 缓冲区,1KB 对齐)
  • PxCMD = 0x00404010( PxCMD.FBSCP = 1& PxCMD.FRE = 1)

设置后,PxCMD.ST保持“0”PxCMD = 0x00404011PxCMD.CR

  • PxSERR = 0保持原样。ERR在设置前被提前清理PxCMD.FRE
  • PxSCTL = 0x00000330( IPM = 3, SPD = 3, DET = 0)
  • PxTFD = 0x00000150保持原样
  • PxSIG = 0x00000101. 0xFFFFFFFF未连接驱动器时,该 reg 具有。


假设PxSIG已设置且PxSERR为“0”,则 SATA HC 的 PLL 设置正确的可能性更大。

我担心PxTFD.ERR = 1(当驱动器断开连接时PxTFD具有默认0x7F值和PxTFD.ERR = 0)但没有发现它是否相关或也不考虑仍然TFD.STS.ERR = 0


任何理想都错过了什么?



PS:与Linux无关。

0 投票
1 回答
197 浏览

data-transfer - 将 Sata 硬盘从笔记本电脑传输到 USB 外接机箱时文件夹为空

我需要一点帮助 - 我正在尝试使用 Sata 硬盘驱动器(2.5 英寸串行 ATA 硬盘驱动器外壳)将数据从硬盘驱动器传输到另一台笔记本电脑。但是,它被成功识别为 E 驱动器,但驱动器显示它是空的。我的用户帐户具有管理员权限(完全控制) 我可以看到驱动器为 E 驱动 器打开 E 驱动器时,它说文件夹为空 这是包含隐藏文件的视图。它仅显示来自 SATA 的系统数据驱动器但不是从旧笔记本电脑 传输数据的原因是我的笔记本电脑在启动 Windows 时出现蓝屏。BIOS 工作正常,所以我尝试从最新备份恢复系统。但是,它在某些时候崩溃了。我尝试了几次,但似乎读到同一点时。

如果有人能就此提出建议,将不胜感激。先感谢您。