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