是固件代码还是数据?


29

当有人说他们将固件“刷新”到设备上时,我很好奇这实际上意味着什么。

  1. 固件是否只是存储在内存中并且可以由设备的CPU解释的本机二进制文件(就像计算机上的任何其他EXE一样)?还是固件只是作为不可变程序输入的数据已经硬编码/连接到设备上?
  2. 如果后一个示例不是固件,您将如何称呼它?例如,假设设备上有一些二进制(someapp.exe),则您无法删除或修改此二进制。二进制文件在运行时从存储芯片获取输入。您可以将数据“刷新”到该芯片,从而影响该芯片的输入/配置,someapp.exe在下次运行时会受到影响。如果不是固件,将其称为什么?

12
这是一个非常好的问题。这与“我的烤面包机不烤面包。我可以在里面放上arduino吗?问题。
Jason_L_Bens 2014年

17
好吧,即使不是主要缺陷,这个问题也将是一个好问题:就Von Neumann架构/模型而言,代码数据,数据可以是代码。因此,整个问题都是徒劳的-因为代码可以(并且通常当作数据)对待,反之亦然;另外,对OP:为什么不检查en.wikipedia.org/wiki/Firmware?它可以回答这个问题,也可以解决许多其他有关固件的问题-因此,尽管与“我可以将12V的灯泡插入230V的插座中”这个问题一个不错的突破,但它在我的书中还是没有达到标准的。 。
vaxquis

2
我很确定这里的答案是“是”。
康纳·沃尔夫

7
机器代码只是输入到CPU不变布线的数据。
user253751

2
是书中的单词还是字母?
尼克T

Answers:


27

通常,对于此类定义,我们在大多数情况下都同意,但是在什么是固件与什么不是固件之间并没有真正确定的界限。固件为

  • 永久存储(某些知识丰富的人可以更改它...)
  • 不打算更改(...除外)
  • 无需其他软件即可在处理器上运行(除非...您知道吗?)

对于由(固件)解释器解释的数据:这通常不是在专业环境中完成的,因为这会使产品价格更高:要达到相同的最终目标,需要更多的内存,CPU能力等。它但是有时爱好者环境中使用,往往与闪光灯Basic解释,以及(切分)Basic应用程序存储在EEPROM(或在Flash太)。例如检查PICAXE和各种基本印章。

在这种设置下,IMO在基本解释器和基本应用程序中均应称为固件。


XBOX 360启动是一个有趣的固件解释器,用于解释存储的代码(也应将IMO视为固件)。这个精彩的演讲详细介绍了它。


下面的MSalters怀疑是否应将FPGA代码/配置数据视为固件。

在最重要的方面(这是在生产过程的后期可以更改的信息,但最终用户无意随意更改),FPGA位的行为类似于固件。这就提出了一个问题,即是否根据任何定义的固件。重要的一点是它可以(并且应该)像固件一样被编写,处理和管理。(如果它走路像鸭子一样嘎嘎叫,是鸭子吗?)

当定义没有用时,不要理会它们。是微码固件吗?代表性重要吗?上下文重要吗?IWM固件的ROM位吗?


Vaxquis对OP问题的评论促使我阅读了他链接到的Wiki文章。IMO那里给出的固件定义(永久存储器,程序代码和存储在其中的数据)很麻烦。IMO,无论如何存储,存储在汽车导航系统中的地图都是数据,而不是固件(根据Wiki,它们应该是固件)。iPhone或Android手机中的应用程序是应用程序,而不是固件(根据Wiki,它们也应该是固件)。


我现在想知道FPGA程序是否算作固件。直观上可以,但是它不能在处理器上运行。但是,这是位在代码和数据之间的中间位置的经典情况。
MSalters 2014年

TI 99/4计算机(1979年)包括ROM中的解释器(称为GPL)和BASIC解释器(由GPL编写)。GPL的一个基本功能是它可以运行存储在GROM芯片中的代码(该代码设计用于主要顺序访问,并且在物理上可以比随机存取ROM便宜些),因此TI 99/4可以被视为一种市场上的个人计算机,其设计类似于BASIC邮票的设计。
超级猫

14

固件是存储在非易失性存储器(例如闪存)中的程序代码。该术语最常与嵌入式系统结合使用。它可以与处理器在同一芯片上,也可以在单独的设备上。


感谢@Leon Heller(+1)-上面的第二个示例是否有名称,其中一个实质上是将输入数据“刷新”到芯片上的固定二进制文件中?还是通常不实践?再次感谢!
HeineyBehind

只是数据而已。它可以存储在易失性或非易失性存储器中。
莱昂·海勒2014年

我将为您的#2使用的术语是“查找表”。我能想到的一个例子是用于数控振荡器的正弦函数值。
kjgregory 2014年

1
@KGregory它可以是查找表,可以是解释程序,可以是图像数据...
glglgl14年

@glglgl同意。我可能会争辩说,可以将其视为查找表的形式,但是我认为我们现在离题了。
kjgregory 2014年

9

我认为这两种选择都是正确的,只是查看处于不同抽象级别的微处理器。您所说的不可变二进制文件将是硬件本身,它的功能相当有限。获取指令地址0x0000,解码指令,获取提供的地址/寄存器,执行,递增指令计数器。那是微处理器管道,您不能更改它。您可以通过将指令存储在内存中来控制微控制器的工作,然后依次读取这些指令。因此,基本上,是的,固件只是低级抽象的不可变程序的输入数据。不过,通常而言,将固件想象为控制微处理器的特殊程序会更容易,因为从概念上讲,这种方式会更容易。


喜欢这个答案,+ 1,在强调数据和代码方面做得很好,最终都是同一回事。

至少对于冯·诺依曼架构来说,它们是相同的。一旦拥有独立的总线,您就可以开始争论它们是不同的东西,尽管最后都只是一点点而已。
Jason_L_Bens 2014年

8

实际上两者都是。

固件的一个示例是PC BIOS,BIOS的一部分是可执行的,但BIOS本身的其他部分实际上是数据,特别是在显示表格中以枚举BIOS ROM的不同功能,而不管其所基于的技术类型如何。上。通常,数据会存储在另一个闪存,电池或电容器支持的RAM(CMOS SRAM或另一种兼容的存储芯片技术)中。

固件是用于不变/非易失性存储器的通用术语,只要电路没有电气错误或在存在编程循环的情况下,对于EEPROMs或闪存,它就可以按照电源周期存在并且可以按照电源周期进行访问ROM。

根据定义,固件是最低级别的访问权限,它初始化,测试您已安装在系统或嵌入式组件中的硬件,并提​​供操作系统需要使用这些组件的低级例程(有时被称为BIOS函数调用)在您的系统中。在过去,BIOS或基本输入输出系统还包括一种称为“ BASIC”的编程语言,例如Commodore 64和1970年代的其他个人计算机,当然,有些较旧的计算机内置了BASIC以供使用。由专业计算机科学家也是如此。如果您听说过字符ROM或符号ROM是执行程序ROM或程序ROM的纯数据形式,则系统可以转到该字符ROM并按顺序查找字符或将整个芯片转储到RAM中以进行操作那里。

默认的PROM,EPROM,EEPROM,Flash编程器会像后缀.hex或.bin一样在芯片上刻录固件,这是类似的格式,具体取决于要用于发送到芯片的应用程序(固件)。

此外,还有固件blob文件,它们是在运行时以库和例程的形式执行的可执行文件,无线硬件驱动程序就是一个很好的例子,它们包含足够的代码来通过您的设备运行那些卡中的所有硬件。计算机系统。唯一的区别是卡和基于USB的固件实际上并不存储在它们上,而是存储在硬盘上并加载到内存中。本质上,它充当翻译服务层和过滤器。它也是数据和代码。

我这样做的基础是,我实际上为其他计算机和嵌入式系统编写了BIOS(例如,无线固件,当您的操作系统启动时会实际加载它,然后开始加载低级硬件驱动程序,其中还包括运行时固件) )。之所以称为固件,是因为它永远不会更改其例程,除非您从制造商那里获得更新,然后该更新会覆盖旧版本。在这种情况下,将充当新固件,直到发现有新内容被更新为止(如果未更新),这就是您加载操作系统时使用的固件。

我同意,不应将其称为固件,因为从技术上讲,它不是永久性解决方案,它并不需要特殊的工具和应用程序来升级固件(对于旧的BIOS与闪存而言)。

还有其他问题,我们很乐意为您解答。


6

固件是在某种开发环境中生成的代码,就像软件代码一样,但是它可以归结为机器代码,以便CPU可以理解。如果您转储微控制器或其他芯片的内存,您会发现它看上去与C代码或我们编写程序的方式完全不同。

因此,您无需为其编写.EXE,因为它是在某种OS环境中运行的已编译程序。您通常会以.hex或.elf进行编程,这实际上取决于您正在编程的设备,但这并不重要,因为您无需担心文件类型,因为编译器会编译该文件。将代码向下编码为机器代码,然后将其放入片上闪存或任何其具有的存储方案中。

固件通常是不可变的,因为必须编写环境条件。您不能更改固件代码并将其保留,必须进行更改,编译并重新刷新设备。

  • 通常,软件代码是要在操作系统之上运行的代码。
  • 固件代码是在芯片的裸机上运行的信息。固件可以是实际的应用程序,也可以是简单的操作系统,然后您可以通过可移动存储或嵌入式世界中的RAM加载软件。该级别可以一直下降到二进制代码,因为那仍然是代码。
  • 一旦开始直接使用电压工作,就已经达到了硬件级别。

2
“但是随后将其归结为机器代码,以便CPU可以理解它。” 就像软件代码一样,只要它是用C或类似语言编写的。
glglgl

1
处理器可以理解的是,二进制是的,但是对于那些仍使用汇编语言进行编程的人来说,它们具有一种称为记忆运算代码(在行业中常见的操作代码),这恰好比机器语言[二进制]高出了一步。 ])。

0

固件是一个通用术语,通常用于指定位于软件世界和硬件世界中间的东西。

硬件很难更改。软件易于更改。固件不像硬件那样难更改,但是比软件难更改。

它可以用来讨论可执行代码,数据或可更改的配置信息(如在FPGA / PLD / etc中)。


从广义上讲,这是真的。虽然,这些芯片实际上不是代码,也不是数据。编译器完成后会创建逻辑设计,将其作为完整解决方案或胶合逻辑将系统的不同部分组合在一起。代替使用物理74和54串联逻辑门和寄存器来解决。实际上,我很高兴您提出这个建议,亚当。

0

从内部来进一步解释什么是固件。

固件是在非常特定的硬件上执行的代码,这意味着它的操作码特定于为其编写的硬件,它可以是一系列芯片或接口,也可以仅用于一项。

从本质上讲,固件会执行此操作;

  1. 具有给定处理器执行和执行的硬连线指令,这称为“引导程序”。哪些最可引导的计算机在其BIOS中具有此功能。

  2. 通过固件中的指令初始化所述硬件。

  3. 加载/加载跳转表。

  4. 使对给定设备上的寄存器的访问可访问。

  5. 在冷(掉电状态)或热启动(已使用正常重启或复位引脚)之后使用BIOS后,将控制权移交给退出例程。

  6. 大多数BIOS(固件)是为特定的芯片组而设计的,并根除了这些芯片的所有功能,并充实了可以连接到计算机或嵌入式设备中给定总线上的某些数据。

  7. 硬盘是存储解决方案的一个很好的例子,该存储解决方案本身就是嵌入式设备,它上面也有BIOS,并且在芯片上有某种形式的固件。

从本质上讲,所有固件都是一串指令,另一个处理器会执行该指令以使所述设备发挥功能。它是一种加载到物理设备中的软件,一旦断电,设备恢复供电后即会存在。

从技术上讲,您可以使用任何编程或脚本语言来创建二进制文件。您只需要知道将要定位的处理器的工作方式,实际的操作码,内部寄存器(更不用说它们的作用),学习二进制和十六进制数系统以及如何创建可以保存的汇编程序即可。您的汇编语言代码。完成后,您可以任务另一个程序将其转换为二进制文件,然后将其另存为.bin或.hex文件。

如果您想知道Ada,C,C ++,D和其他编程语言是如何将其“令牌”转换为原始代码的,这些原始代码会被切成伪操作码并转换为机器语言。我建议您阅读几本书,其中有些是基本的书,并且围绕非常特定的处理器而著,但值得学习。我暂时不会给您一本书,因为我不想淹没您或阅读此信息的任何人。

  1. Charles N. Fischer和Richard J. LeBlanc,Jr.用C编写编译器。
  2. 请访问该站点,它基于IBM PC中的x86芯片组; http://www.laynetworks.com/assembly%20tutorials.htm

那是一开始对PC上的汇编语言编程的介绍。它讨论了有关处理中断(硬件和软件中断)以及许多其他主题的内容,并且更深入地介绍了BIOS的实际功能以及如何使用它。

与汇编语言和机器语言不同,如果您不了解硬件特性,则可以在Ada,C,C ++,D中获得更多知识。在汇编语言和机器语言中,如果您不知道自己在做什么,则可能会发生不好的事情,或者代码将无法正常工作。我更喜欢后一种情况,而不是坏事。

注意:关于以上答案,关于闪存RAM,没有这样的东西,有闪存ROM但没有闪存。闪存ROM中包含固件,由电池或电容器支持的RAM,或另一个闪存ROM,其中包含用于您所设置的BIOS选项的参数。

如果是闪存ROM或RAM芯片,则固件中包含有关如何存储或清除数据存储器(而不是程序存储器/固件本身)的代码。在PC上,如果您的BIOS密码出现乱码或不记得(或者有人在惹您),您可以打开机箱并找到两个销子,分别为“ CMOS CLR / CMOS CLEAR / BIOS RESET / BIOS RST”,将这两个引脚短路在一起也会清除内存,这之后您需要做的就是在两个引脚仍短路的情况下按下复位按钮。这将清除密码,并允许您完全访问PC BIOS(假设您有一台1990年代以后的新计算机)。

在新的PC上,您具有用于固件的闪存,并且具有电池后备的SRAM(并不需要像DRAM芯片那样不断刷新,它是基于较旧的技术)。


0

对于嵌入式系统而言,闪存固件意味着您已经使用闪存设备擦除了微控制器的ROM,并用新代码对其进行了重写。该要刷新的固件为十六进制格式。

就与操作系统有关的术语而言,它也被刷新在ROM中,但是这是操作系统的责任,当有更新时,要对其进行刷新。


0

我相信,使用“历史”观点可以对固件是什么有更基本的了解。
它首先从“硬件”开始。为了提供/创建给定的功能,可以使用电子管,继电器,晶体管和IC。您将使用许多这些组件,并创建执行所需功能的设备。这被认为是“硬件”,因为如果您想要(或需要)更改功能,则需要拆焊电线,插座等,这是“困难的”事情。因此,这种实现功能的方法被称为使用硬件。使用CPU,RAM和代码成为创建函数的另一种方法,并且被称为“软件”来进行设计更改。”但是,也有必要(主要是来自制造商)尽早完成尽可能多的设计,但能够使“最后一刻”的设计更改尽可能容易且具有成本效益。 。ROM的使用使灵活性达到了“首次交付”的地步。EEPROMS甚至允许在“首次交付”之后进行更改(在现场)。ROM和PROM所需/使用的代码被命名为“固件”。 ”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.