如何判断磁盘是否在旋转(没有声音/触摸)?

如何判断磁盘是否在旋转(没有声音/触摸)?

是否有一种“编程”方式来确定磁盘是否正在旋转(旋转,不一定是读取/写入)?

答案1

磁盘是否旋转取决于其电源模式;通常主轴电机将在“活动”和“空闲”模式下运行,并在“待机”和“睡眠”模式下停止。(对于具有 NV 缓存电源管理的驱动器,情况会变得有点复杂,我对此了解不多,无法在此介绍。)

如果驱动器处于睡眠状态,它肯定不会旋转(或执行任何其他操作,包括与主机通信);否则您可以询问它的当前模式。

E5对于 ATA 驱动器,“检查电源模式”命令将执行此操作。发送命令寄存器中的值,它将FF在扇区计数寄存器中返回驱动器是处于活动状态还是空闲状态。

通过编程方式执行此操作会进入 Stack Overflow 领域,但这里有一个可以在 Windows 上执行此操作的 C 代码片段:

int isSpinning = -1;
HANDLE hDevice = CreateFile(TEXT("\\\\.\\PHYSICALDRIVE0"), GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
if (hDevice != INVALID_HANDLE_VALUE)
{
    DWORD cb = 0;
    ATA_PASS_THROUGH_EX cmd = {sizeof(ATA_PASS_THROUGH_EX)};
    cmd.AtaFlags = ATA_FLAGS_DRDY_REQUIRED; /*  Require drive to be ready  */
    cmd.TimeOutValue = 3;                   /*  Arbitrary timeout (seconds)  */
    cmd.CurrentTaskFile[6] = 0xE5;          /*  "Check Power Mode" in command register  */
    if (DeviceIoControl(hDevice, IOCTL_ATA_PASS_THROUGH, &cmd, sizeof(cmd), &cmd, sizeof(cmd), &cb, 0))
    {
        /*  FF in sector count register means the drive is 
            active or idle (and therefore spinning)  */
        isSpinning = cmd.CurrentTaskFile[1] == 0xFF;
    }
}

相关内容