-1

我们知道基于“vtable”原理的接口。一旦有了指向对象的指针,就可以将其缩小到接口,新对象是同一个对象,但仅限于接口。我一直认为硬件固件有点相似。例如,对于块设备(HDD 或 SSD),此接口类似于readwritestatus等。所以驱动程序就是这样一个设备接口的用户。

事实证明,任何存储设备都有固件和一个标记为内部的特殊存储区域,用于保存固件。制造商发布的程序允许“闪存”他们的特定设备,例如通过将新程序写入其内部空间,对操作系统隐藏

我的问题是:在软件级别上,他们如何对驱动器的“隐藏”区域执行这种读写操作?死的“COM端口”有什么关系?

如果 HDD 可以在所有操作系统上运行,为什么固件升级软件只针对 Windows 发布?在 linux 的开源世界中,我需要阅读哪些内容才能更好地理解“调试固件”?

4

2 回答 2

2

我们知道基于“vtable”原理的接口。一旦有了指向对象的指针,就可以将其缩小到接口,新对象是同一个对象,但仅限于接口。我一直认为硬件固件有点相似。例如,对于块设备(HDD 或 SSD),此接口类似于读、写、状态等。所以驱动程序就是这样一个设备接口的用户。

不,不是。面向对象的编程与个人计算机硬件无关,您认为virtual调用与设备驱动程序相关的印象是错误的。他们完全没有关系。

事实证明,任何存储设备都有固件和一个标记为内部的特殊存储区域,用于保存固件。制造商发布的程序允许“闪存”他们的特定设备,例如通过将新程序写入其内部空间,对操作系统隐藏。

这不是真的。并非所有存储设备都具有固件 - 并且它们具有的任何固件(如果有)不一定存储在可重写闪存上。例如,存在不可重写的ROM 芯片。

我的问题是:在软件级别上,他们如何对驱动器的“隐藏”区域执行这种读写操作?死的“COM端口”有什么关系?

如果您指的是现代(2004 年后)SATA 和 NVMe 存储设备的固件更新,那么可以使用 SATA 和 NVMe 的内置命令更新这些设备的固件。

这记录在像这样的地方t13.org ATA/ATAPI 命令集 - 4

如果 HDD 可以在所有操作系统上运行,为什么固件升级软件只针对 Windows 发布?在 linux 的开源世界中,我需要阅读哪些内容才能更好地理解“调试固件”?

为什么固件升级软件只针对Window发布

因为 Windows 是这类硬件用户使用的主要操作系统。虽然可以使用原始 SATA/NVMe 命令更新固件,但您仍然需要主机操作系统来运行将发出这些 SATA/NVMe 命令的程序。假设为 Windows 的 SSD 构建固件更新需要 10 万美元,而 Linux 的固件更新需要花费 10 万美元(Linux 和 Windows 都需要 20 万美元)——但 90% 的 Linux 用户也运行 Windows——那么为什么要花 20 万美元购买 100当您可以花 10 万美元购买 90% 的覆盖率,然后花额外的 10 万美元购买法拉利或特斯拉 Model X P100D 并责怪用户没有从 Windows U 盘启动来升级他们的固件时,百分比覆盖率?(旁注:我选择了后者,是的,我真的很喜欢我的特斯拉 Model X)

你不可能有一个程序只是神奇地在任何计算机平台(Windows、BSD、Linux、macOS、QNX 等)上运行并更新外围设备固件:它总是需要是一个可以由主机操作系统执行的程序(你可以认为 UEFI/EFI 是一种与平台无关的方法,但实际上 UEFI/EFI 仍然是它自己的平台)

在 linux 的开源世界中,我需要阅读哪些内容才能更好地理解“调试固件”?

200 毫克 Adderall 和IDA Pro的盗版副本。

...或 500mg 右旋糖苷和NSA Ghidra

于 2019-11-30T14:36:44.107 回答
1

这取决于块设备的确切类型以及它与 PC 的接口方式。一个非常常见的接口是 SATA,它可以直接与家用 PC 中的 SATA 控制器一起使用 - 或者可以通过 USB-SATA 桥接器访问。

如果我们以 SATA 为例,在 SATA 协议中存在一个特殊的命令,称为“下载微码”(命令 ID 0x92) - 仅用于将新固件传输到驱动控制器。

正如您所指出的,固件通常不存储在“驱动器的隐藏区域”本身 - 它通常存储在闪存或驱动控制器 PCB 上的类似存储器或驱动控制器 IC 内。

这其中不涉及“死 COM 端口”。

硬盘供应商有时只为 Windows 发布固件更新工具的原因可能是他们的大多数客户使用 Windows 的简单原因,而且他们只支持一个平台更便宜。

于 2019-11-30T14:36:33.410 回答