我无法理解固件这个术语(作为一种软件);
如果它是一个 CS 概念,那么最好在这里询问一下,以获得正式的定义和对我的错误的纠正,作为解决方案。
我记得 Richard Stallman 在不同讲座中说过,固件通常是一种非自由软件,因此其源代码(或者我猜是编译后的代码)嵌入在硬件中,因此无法根据需要进行研究和更改(因此也无法删除)。
这让我感到困惑:
如果固件不是“虚拟”存储在内存中,而是作为硬件架构嵌入硬件(“金属编写”)的软件,那么它如何能够像 Bios 升级一样升级,但永远不会被删除?
例如,我可以在内核中升级 Apple iphone 的操作系统,但永远不会删除它,我误解了为什么。
答案1
“固件”是一个相当模糊的概念。固件与非固件之间的确切界限取决于具体情况。
固件通常不是主操作系统的代码,也不是在主操作系统上运行的软件。但这个定义留下了一些回旋余地。
在计算机外围设备的背景下,固件而不是驱动程序有一个精确的定义:驱动程序作为主操作系统的组件在主处理器 (CPU) 上运行,而固件在辅助处理器 (GPU、磁盘控制器、网络控制器等) 上运行。此类外设的固件可能随外设一起提供并存储在 EEPROM 或闪存中,或者驱动程序可以将其加载到外设的 RAM 中 — 这取决于外设是否具有持久内存。如果外设不提供固件,它通常会作为“二进制 blob”制造商没有记录。
在其他情况下,固件也可以指在主处理器上运行的代码。固件是在比操作系统更低的级别上运行的软件。或者,如果您是固件或操作系统开发人员,您的软件可能是其他人的固件,而其他人的固件则是您的软件——固件在堆栈上位于软件之下,但边界取决于您与谁交谈。例如,操作系统开发人员通常将 BIOS 和 UEFI 视为“固件”,但便携式 UEFI 实现的开发人员可能会将他们的软件视为在硬件制造商制作的固件之上运行的应用程序。
另一种可能的定义固件固件的定义是与硬件一起出售的软件,而不是可以稍后安装的软件。但这一定义的应用存在一些不一致之处。人们通常将手机上的操作系统称为“固件”,但 PC 上的操作系统则不这么认为。
升级或修改固件的难度取决于硬件制造商提供的工具以及对固件的限制。对于具有持久存储的外围设备,升级固件的接口可能有记录,也可能没有记录,也可能没有在特定操作系统的驱动程序中实现。对于自主设备,升级固件可能通过某些图形界面(在手机或某些路由器上升级操作系统)完成,也可能借助某些外部硬件和软件(例如,连接正确格式的 USB 加密狗,或连接到 JTAG 端口,或拔出 EEPROM 芯片)完成。
无论定义如何,非开源固件存在的原因纯粹是社会结构问题:没有任何技术原因导致固件的开源性低于任何其他类型的软件。
答案2
我认为您对“理解/学习”部分感到困惑。
固件是编译并嵌入硬件中的,因此比高级程序“更难”理解。最终用户无法轻松检查和修改此固件。这并不意味着它不是具有适当语义的可执行对象(程序)。事实上,人们确实反向工程固件无法准确理解它如何与硬件交互。要完全理解编译后的低级程序到底做什么,需要付出更多努力。但是,许多固件也是开源的,您可以选择将其中一个固件刷入硬件。
此外,固件是存储在某种形式的内存中,并且可擦除。然而,与 RAM 不同,此内存是非易失性的,因此写入的固件在多个电源循环后仍会保留,直到通过以下方式明确擦除/重写闪烁。
当你升级 iPhone 固件时,完全删除它是完全有可能的——只是 Apple 的软件让最终用户更难犯这样的错误。