我从固件领域的工作人员那里听说,没有操作系统控制固件(例如 USB 驱动器中的固件)。只有一个线程在 while 循环中运行,等待外部命令,这是中断发生的起点,随后是 ISR,控制一直流向硬件。但从根本上说,执行固件代码的硬件部分是什么?是否有 CPU 或基于 ASIC 的代码,只要设备通电就会触发。我无法理解从基于常规 CPU-OS 的系统到固件的范式转变。
固件中的程序执行是如何发生的?
没有范式转变;在这两种情况下,CPU 都在执行软件/固件。
固件和软件是一回事;唯一的区别在于它的存储方式。软件通常存储在大容量存储设备(例如,磁盘驱动器)上,并在执行之前加载到易失性存储器(例如,DRAM)中。更改软件很容易,只需将包含它的文件替换为不同的文件即可。
固件通常存储在或多或少直接连接到 CPU 的非易失性存储器(例如,闪存)中。它更难修改(因此是“公司”),它可能会或可能不会转移到不同的内存中执行。
确实,带有“操作系统”的计算机的操作与您对固件的描述根本没有区别。请记住,操作系统本身只是另一个软件——或者更有可能是相互依赖的软件的巨大集合。在最低级别,CPU 仍然处于某种循环中,等待要做的事情。只是那个循环被隐藏在操作系统内部。
即使是带有操作系统的“常规”CPU 也必须执行固件……它通常在通用 PC 中被称为 BIOS。任何 CPU 的固件只是打开电源时始终可用的软件,无论 CPU 是否连接到任何外围设备(磁盘驱动器、USB 等)。如果你有一个成熟的操作系统,那么固件只是找出哪个设备(磁盘、USB 驱动器等)保存了操作系统的代码,将代码复制到 RAM 中,然后运行它。对于小型嵌入式设备,不需要完整的操作系统,因为您不会加载不同的应用程序或连接各种设备,因此小型 CPU 只需使用非常简单的操作系统或“任务调度程序”。不同的任务可能是获取传感器读数、等待按钮被按下以及更新显示。对于非常简单的应用程序,CPU 有足够的时间来完成所有任务,因此它只是按顺序执行每个任务,这也称为“循环”方法。更复杂的调度程序会考虑任务的优先级。
基本点是每个 CPU 都必须有一些代码,这些代码在打开电源时始终可以执行。该代码通常存储在相对较小的“只读”存储器或 ROM 中,尽管现代 CPU 将固件放入“主要读取”的闪存 ROM。以这种方式存储的代码是 CPU 的“固件”。
你的问题似乎有一些误解。
固件只是固定形式的软件,过去是在普通的(一次写入甚至掩码编程)ROM 中,现在主要是在闪存(可重写)ROM 中。在某些系统上,该固件是唯一存在的软件,而在其他系统(如普通 PC)上,它的主要功能是加载其他软件。
应用程序可以在操作系统的控制下运行,也可以在没有操作系统的情况下运行。后一种情况通常被称为“裸机”:应用程序在硬件“金属”之间没有任何东西运行。操作系统执行的带有操作系统情况下的功能,例如文件系统处理和多线程配置,仍然可以存在于裸机系统中,但以与应用程序链接的库的形式存在.
软件可以有很多不同的架构。一个非常简单的形式是“获取输入,进行处理,写入输出”循环。更复杂的形式可以包括轮询、中断或多线程。依赖于操作系统的应用程序和裸机应用程序都可以使用所有这些架构。
这三个问题是独立的:例如固件可以运行裸机并使用多线程架构。或者固件是一个操作系统,它从使用简单的 get-do-write 循环架构的软盘(对不起,闪存卡..)加载应用程序。
操作系统和 CPU 是不同的概念。是的,有一个 CPU,它是机器核心的关键硬件。它从固件存储器中获取固件指令并执行它们。(顺便说一句,现在即使是小型系统也很常见有多个 CPU 用于并行执行;因此只谈论 CPU 有点过时了。)
固件是存储在非易失性(甚至可能是只读)存储器中的软件。因为它在这样的内存中,所以当机器打开时固件是可用的。机器开机后几乎可以立即开始执行固件,或者一些小的启动程序(本身的固件)可以从一些电子存储器(如闪存)中提取较大的固件并将其放入 RAM 中,然后执行它。这些天闪存存储的现代使用是为什么有时您可能会听到“刷新新固件”一词,指的是升级过程。固件不必像这样轻松升级。它可能出现在集成电路芯片上,因此将设备更新为新固件可能涉及从插座中移除集成电路(“EPROM 芯片”)并插入新的。电脑BIOS' s 以前都是这样更新的,其他设备无数。这确实是这个词的来源。有些人不愿意将程序称为“软件”,如果他们不得不更换芯片或电路板来替换它,这看起来更像是硬件更新。因此创造了“固件”:比软件“更难”改变的东西。
固件可以是“成熟”的操作系统。例如,Tomato 是基于 Linux 的无线路由器固件:
http://www.polarcloud.com/tomato
我们可以通过 ssh 登录 Tomato,并获得 Linux 提示。所以它是一个高级操作系统,它是固件。但是,如果路由器中有一个硬盘,并且如果在启动时必须从该磁盘加载相同的操作系统,它就不能再被合法地称为固件。固件必须存储在处理器上电后可立即访问的电子存储中,例如闪存或 EPROM 芯片。
如今,许多消费类设备都具有可升级的固件。例如,如果您有一台数码相机,您应该找到它的网站并查看是否没有更新的固件版本,该版本修复了工厂安装的固件中可能存在的一些问题。如今,即使对于相对非技术的最终用户来说,更新固件也很容易。上述番茄是替代工厂固件的第三方开源固件的示例。
“操作系统”这个词只是指在管理机器资源和为程序提供合理高级服务方面具有一定程度的复杂性和完整性的控制程序:文件系统、网络协议、内存和进程管理等功能,对设备的高级访问,可能还有某种用户模型以及安全性。并非所有这些都必须存在于操作系统中。通常内存、进程管理和 I/O 是关键。如果控制程序允许其他程序执行,给这些程序一个标识,通过该标识它们与自己的资源相关联,并且如果它为它们提供管理处理器和内存以及进行 I/O 的服务,我们可以称之为控制对操作系统进行编程。
既然你很好奇,你可能真的很喜欢一些关于计算机体系结构的教科书,比如 William Stallings 或 Heennesy 和 Patterson 的那些。