将我的 32GB USB 驱动器插入计算机,计算机如何知道它是 32GB 驱动器?这些信息存储在哪里,如何检索?
答案1
计算机如何知道与其连接的驱动器的容量?
早期的 PC 硬盘驱动器(例如 ST506、MFM、RLL)需要用户提供驱动器几何参数(即每条磁道的扇区数、R/W 磁头数和柱面数),以便CHS 寻址当然,(IBM)PC 假定/定义了 512 字节的扇区大小。
这些参数通常存储在 PC 的 BIOS 中。
IDE 驱动器引入了 ATA 命令集,其中包括一个Identify Device
命令(使用命令代码 0xEC),该命令报告驱动器几何结构和其他信息。
在 ATAPI 版本 3 中,对此命令的响应包括total number of user addressable sectors
。(我没有 ATAPI 规范的早期版本,因此我不确定 ATA-3 之前的响应中到底是什么。)
使用扇区总数和扇区大小,可以轻松计算出驱动器的总容量。
由于现代版本的 ATA(例如具有区域位记录的 SATA 驱动器)不再支持 CHS 寻址,因此驱动器几何形状无关紧要(甚至不是恒定的,因为区域位记录)。
USB 闪存驱动器仅使用 USB 作为传输协议,并像 HDDS 和 SSD 一样实现 ATA 命令集。因此,通过使用 ATA 命令查询驱动器,可以轻松获取 USB 闪存驱动器(以及 SATA HDD/SSD)的容量Identify Device
。
SD 卡具有专用命令协议,可通过其接口使用。卡的容量、速度能力和其他信息通过其命令行(而不是通过卡的数据接口)作为响应报告。
操作系统主要为用户提供对大容量存储设备(如 HDD 和 SSD)的文件系统访问。
根据 PC 惯例,驱动器必须进行分区,并且文件系统必须存在于驱动器的分区中。请注意,软盘和可选的 USB 闪存驱动器未进行分区。
分区的显著驱动器参数(即起始和结束扇区/LBA 地址)从分区表(位于 MBR 或 GPT 扇区中)中检索。
答案2
操作系统或多或少完全依赖于驱动器来传达驱动器容量。
这一事实被利用了……
在大多数常见的 SSD 中,它们都保留了相当一部分存储空间用于缓存,并作为驱动器开始老化时的备用存储空间
廉价的 USB 驱动器声称其容量比实际容量大得多,甚至会欺骗操作系统写入超出其可保存容量的数据,从而用于不良目的
所有类型的驱动器都包含少量的非易失性存储器,其中包含这些信息并在连接时向操作系统报告。
答案3
PC 不直接控制驱动器,而是向总线上的主机适配器或控制器发出命令。对于现代(至少自 80 年代末/90 年代初以来)驱动器,适配器/控制器将这些命令转发给运行固件的驱动器上的 CPU。标准化总线及其相应的命令方案包括 ATA、AHCI、SCSI、SAS。
特定于驱动器的参数(例如容量)是该固件的一部分或可由该固件发现,特定命令使固件返回该信息而不是读取/写入数据。
例如:ATA-1 标准(非常古老)描述了“识别驱动器”命令,该命令返回驱动器的 CHS 值,从中可以确定容量。因此,这将是操作系统在执行任何读/写操作之前发送给驱动器的第一个命令。
我认为 ATA 之前的驱动器(例如 MFM 或 RLL 驱动器)没有智能固件(格式化除外) - 对于这些 80 年代早期的系统,您必须知道“驱动器类型” - 这只是众所周知的容量,或者直接在 BIOS 中设置自定义容量。
对于 USB,原理是一样的——通过 USB 发送的命令会与控制器对话,从而获取信息而不是读取/写入数据。