固件中程序如何执行?


9

我听说在固件领域工作的人们没有操作系统控制固件(例如USB驱动器中的固件)。在while循环中只有一个线程正在运行,等待外部命令,这是发生中断的起点,然后是ISR和控制,一直流到硬件。但是从根本上说,执行固件代码的那部分硬件是什么?只要设备加电,就会触发CPU还是基于ASIC的代码。我无法理解从基于常规CPU-OS的系统到固件的模式转变。


如果可能的话,有人可以举一个固件示例,说明CPU品牌以及任何其他硬件和软件详细信息。示例可能是SD卡,USB,HDD控制器等中的固件
Abhijit K Rao 2012年

Answers:


13

没有范式的转变。在这两种情况下,CPU都在执行软件/固件。

固件和软件是一回事。唯一的区别在于它的存储方式。软件通常在执行之前存储在大容量存储设备(例如磁盘驱动器)上,并加载到易失性存储器(例如DRAM)中。通过简单地将包含软件的文件替换为另一软件,即可轻松更改软件。

固件通常存储在或多或少直接连接到CPU的非易失性存储器(例如FLASH)中。修改起来比较困难(因此称为“ firm”),它可能会也可能不会转移到其他内存中执行。

实际上,带有“操作系统”的计算机的操作与固件描述基本没有区别。请记住,操作系统本身只是另一软件,或更可能是大量相互依赖的软件的集合。在最低级别上,CPU仍处于某种循环中,等待事情发生。只是这个循环被埋在了操作系统内部。


9

即使是带有操作系统的“常规” CPU也必须执行固件……在通用PC中通常称为BIOS。无论CPU是否连接到任何外围设备(磁盘驱动器,USB等),打开电源时,任何CPU的固件都是始终可用的软件。如果您使用的是功能完善的操作系统,则固件会找出要保存该操作系统代码的设备(磁盘,USB驱动器等),然后将代码复制到RAM中并运行它。对于小型嵌入式设备,不需要完整的操作系统,因为您无需加载不同的应用程序或连接各种设备,因此小型CPU仅使用非常简单的OS或“任务调度程序”。不同的任务可能是获取传感器读数,等待按钮被按下以及更新显示。对于非常简单的应用程序,CPU有足够的时间来执行所有任务,因此它仅按顺序执行每个任务,这也称为“循环”方法。更复杂的调度程序会考虑任务的优先级。

基本要点是,每个CPU必须具有一些在打开电源后始终可以执行的代码。该代码通常存储在相对较小的“只读”内存或ROM中,尽管现代CPU将固件放入“多数读取”的Flash ROM中。以这种方式存储的代码是CPU的“固件”。


6

您的问题似乎存在一些误解。

固件只是固定形式的软件,曾经位于普通的(一次写入或什至通过掩码编程)ROM中,现在大多位于闪存(可重写)ROM中。在某些系统上,此固件是唯一存在的软件,而在其他系统(如常规PC)上,其主要功能是加载其他软件。

应用程序可以在操作系统的控制下运行,也可以在没有操作系统的情况下运行。后者通常被称为“裸机”:应用程序与硬件“机壳”之间没有任何运行。操作系统在OS的情况下执行的功能(例如文件系统处理和多线程设置)仍可以在裸机系统中存在,但以与应用程序链接的库的形式存在。

软件可以具有许多不同的体系结构。一个非常简单的形式是“获取输入,执行处理,写入输出”循环。更复杂的形式可以包括轮询,中断或多线程。依赖于OS的应用程序和裸机应用程序都可以使用所有这些体系结构。

这三个问题是独立的:例如,固件可以运行裸机并使用多线程体系结构。或者固件是一个从使用简单的get-do-write循环体系结构的软盘(对不起,闪存卡..)加载应用程序的操作系统。


5

OS和CPU是不同的概念。是的,有一个CPU,它是机器核心的关键硬件。它从固件存储器中获取固件指令并将其执行。(顺便说一下如今,即使是小型系统,通常都有多个CPU可以并行执行;因此仅谈论CPU 有点过时。)

固件是存储在非易失性(或什至只读)存储器中的软件。因为它在这样的内存中,所以在打开机器电源时可以使用固件。机器打开后,机器可能几乎立即开始执行固件,或者某些小型启动程序(本身的固件)可以从某些电子存储设备(例如闪存)中提取较大的固件,并将其放入RAM中,然后执行。如今,现代使用闪存是为什么有时您会听到“刷新新固件”这一短语的原因,它指的是升级过程。固件不必像这样容易地升级。它可能来自集成电路芯片,因此将设备更新为新固件可能涉及从插槽中卸下集成电路(“ EPROM芯片”)并插入新的固件。PC BIOS' 曾经以这种方式进行更新,还有无数其他设备。这确实是单词的来历。如果人们不得不更换芯片或电路板来替换它,这看起来更像是硬件更新,则有些人对调用程序“软件”感到不舒服。因此创造了“固件”:比软件“更难”改变的东西。

固件可以是“功能完善”的操作系统。例如,Tomato是用于无线路由器的基于Linux的固件:

http://www.polarcloud.com/tomato

我们可以通过ssh登录到Tomato,并获得Linux提示。因此,它是高级操作系统,并且是固件。但是,如果路由器中装有硬盘,并且在启动时必须从该磁盘加载相同的操作系统,则该路由器将不再合法地称为固件。固件必须存储在电子存储器中,如加电存储器或EPROM芯片,该存储器可在加电后立即供处理器访问。

如今,许多消费类设备都具有可升级的固件。例如,如果您有数码相机,则应找到其网站,并查看是否没有较新的固件版本,该版本解决了工厂安装的固件中可能存在的一些问题。即使对于非技术性的最终用户,如今也很容易更新固件。前面提到的Tomato是代替工厂固件的第三方开源固件的示例。

“操作系统”一词仅指控制程序,它在管理机器资源和为程序提供合理的高级服务时具有一定程度的复杂性和完整性:文件系统,网络协议,内存和进程管理,对设备的高级访问,以及用户的某些型号以及安全性。并非所有这些都必须存在于操作系统中。通常,内存,过程管理和I / O是关键。如果控制程序允许其他程序执行,给这些程序一个标识,使其与自己的资源相关联,并且如果它向它们提供了用于管理处理器和内存以及进行I / O的服务,则我们可以称该控件为对操作系统进行编程。

出于好奇,您可能真的会喜欢一些关于计算机体系结构的教科书,例如William Stallings或Hennesy和Patterson的教科书。


4

从最根本的角度讲,CPU只是状态机,它逐步执行一系列指令,这些指令改变其自身的内部状态和/或产生一些输出。将这个概念抽象化并改进到很高的水平,即可获得Intel提供的最新台式机和移动处理器产品。但是基本原理很简单-您可以用大约十二个TTL集成电路构建一个非常基本的处理器,并且从1970年代初期到中期,专为台式计算器和交通信号灯控制器设计的微处理器并不比这复杂得多。 。显然,摩尔定律将其推向了另一个高度,现代高性能处理器与35年前的祖先几乎没有相似之处。

即使这样,处理器(通常称为微控制器)的市场仍然巨大,其复杂性远不及尖端技术。例如,这些就是您可能在USB驱动器上找到的处理器类型。为了解决您的问题-您提到的设备的某些功能可能是由ASIC处理的,但是如果您的同事正在谈论线程和中断,这通常表明存在一段时间的CPU,可能是在微控制器上。从它们具有ALU,寄存器,程序计数器,堆栈等的意义上来说,它们的确是成熟的计算机,但是它们的功耗非常低且非常便宜,并且可能只有几十条指令,而不是数以百计的x86架构。

不需要这些设备具有任何类型的操作系统或上下文切换的任何概念(尽管在某些情况下是可能的),其应用所需的全部操作是一步步地遍历其程序中的指令。正如您所说,这确实是一个非常简单的程序。


1

减去一些权限,CPU将无法确定其执行代码是否来自OS或任何其他类型的程序。对于CPU,它只是执行从内存中获取的指令。

我们不要忘记操作系统是什么:始终在内存中的程序,负责安全地处理和调度多个任务。我们用来描述独立任务的术语是“过程”。OS允许进程安全地共享资源(硬件,内存等),并安排执行的优先级,并提供进程间通信之类的功能。所有这些都是由于需要支持多个并发任务。减去一些权限级别,对CPU来说,它只是在执行指令OS或不执行OS-它不知道区别。

当我们为微控制器编写固件时,通常我们并不总是在内存中有这个额外的程序(操作系统)来为我们管理任务。为什么?因为我们不需要多个并发任务-嵌入式系统通常经过设计和编程才能很好地完成一个应用程序。与此相比,PC应该具有很高的灵活性,并且能够一次运行各种应用程序。

不再需要担心一个进程占用和占用另一进程的内存空间,也不必担心一个进程占用了所有CPU时间。这是因为我们正在编写一个可以随时访问所有资源的程序,因为它是系统上运行的唯一程序,因此我们不需要像OS这样的其他程序来管理它。再说一次,对于CPU来说,它只是执行从内存中获取的指令,它无法分辨出是操作系统还是没有操作系统。

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.