固件与中间件有什么联系和区别?
维基百科说
固件是持久性存储器以及存储在其中的程序代码和数据的组合。[1] 包含固件的设备的典型示例是嵌入式系统(例如交通信号灯、消费电器和数字手表)、计算机、计算机外围设备、移动电话和数码相机。这些设备中包含的固件为设备提供了控制程序。
中间件是一种计算机软件,它为软件应用程序提供操作系统无法提供的服务。它可以被描述为“软件粘合剂”。[1] 中间件使软件开发人员可以更轻松地进行通信和输入/输出,因此他们可以专注于应用程序的特定目的。
我仍然不明白它们在硬件、高级软件、操作系统等方面的角色差异。
例如,
BIOS 固件不是中间件吗?
操作系统的引导加载程序是固件、中间件还是某种软件?
CPU 的指令集是固件而不是中间件吗?
是否存在一些非固件的中间件?
设备驱动与固件、中间件有什么联系和区别?
谢谢!
答案1
固件和中间件是描述某一组“某些代码”的简单的行业术语。
固件(如 wiki 所述)“通常”表示“通常”用汇编语言或 C 语言编写的软件,并且“通常”运行在/的硬件。
“on/the” 表示该软件驻留在永久存储介质(如某种小型闪存)上,该介质直接连接到软件要控制的硬件。它被称为“固件”,因为它是专门为运行硬件而设计的软件。
我之所以经常引用这个词,是因为科技行业有一个可怕的习惯,即创造术语然后扭曲它们,以至于没有人知道这个词的真正意图。“嵌入式编程”就是一个很好的例子;虽然这个术语通常指的是开发固件的程序员(即低级 ASM/C 硬件开发人员),但这个术语后来演变为包括 Android 开发人员(即可以在 Java 和 C 级别操作的 Linux/内核开发人员)。我并不是在批评任何类型的开发人员或开发实践(我自己做了很多这类开发),只是指出科技行业喜欢误用词语。
中间件是此类词语的另一个例子;虽然我还没有听到或看到“固件”用于硬件级代码以外的任何用途,但我见过中间件用于从固件到 .NET/Java 的所有领域。中间件是一个通用术语,(作为开发人员)您通常可以从上下文中解读出其意图,因为我见过太多次误用它;因此,直接回答您:
我仍然不明白它们在硬件、高级软件、操作系统等方面的角色差异。 固件是驻留在特定硬件上并运行该硬件的软件(代码转换为二进制格式)。中间件可用于表示与硬件(或就此而言的另一软件)交互的 API/库。
BIOS 固件不是中间件吗? 取决于你对此的看法,它可能两者兼而有之。从技术上讲,BIOS 是固件(它是专门用于运行其所在硬件(即主板)的软件),但如果你的目的是以某种方式(如操作系统一样)直接与硬件交互,BIOS“可能”是中间件,因为你不必“编写”自己的 BIOS 和硬件例程,这就是“中间件”滥用的来源,但从传统意义上讲,BIOS 不是中间件。
操作系统的引导加载程序是固件、中间件还是某种软件? 操作系统的引导加载程序是位于 BIOS(或其他基本硬件子系统)和较高级别系统(通常是操作系统)之间的一段代码,用于告知较低级别系统(即 BIOS)操作系统在引导介质上的位置。一般来说,引导加载程序通常位于存储介质的特定位置(例如前几百个字节或更多),BIOS 知道(得益于行业标准)在哪里“查找”引导加载程序,此时引导加载程序将接管并执行其编写的任务(通常是启动操作系统)。
引导加载程序不是固件,但从技术上讲可以驻留在固件中,就它是否为“中间件”而言,这取决于“您”对“中间件”是什么/应该是什么的看法,尽管从中间件的传统概念来看,我不会考虑引导加载程序中间件,因为它没有为我提供任何更简单的上下文(除非我正在编写操作系统)。
CPU 的指令集是固件而不是中间件吗? CPU 的指令集更多地被视为应用程序编程接口 (API)(其“可以”被视为一种中间件),它不是固件,因为 CPU(中央处理单元本身)没有任何“可运行”的东西;CPU 指令集是软件“编译”成(汇编)的内容,然后 CPU“理解”如何运行。
是否存在一些非固件的中间件? 是的;您能想到的几乎任何软件框架(例如 .NET 或 Java 库)都可以被视为一种中间件,因为它们为程序员提供了一种与计算机各个方面交互的“更简单”方式。例如,使用 Java,您可以打开文件并写入文件,并让该代码在任何 Java 支持的系统上“工作”。由于某些 Java API 允许您使用几行代码与不同系统上的文件交互,因此它可以被视为一种“中间件”,因为开发人员不必为每个不同的系统(Linux/Windows/Apple 等)编写代码来与硬盘驱动器和操作系统的文件系统交互。
设备驱动与固件、中间件有什么联系和区别? 设备驱动程序是位于操作系统级别的软件(通常作为“已安装”库),它告诉操作系统“如何”与所述设备交互。例如,当您安装最新的视频驱动程序时,您正在安装操作系统“使用”与实际视频卡本身进行通信的软件。视频卡本身有固件,它知道如何解释操作系统提供的信息(由于驱动程序)并对其进行处理(例如绘制窗口或游戏精灵)。
设备驱动程序可以被视为中间件(同样取决于您对此的看法),因为它位于操作系统/硬件和任何想要通过操作系统使用硬件的人之间。
轶事:根据我的行业经验,我发现“中间件”的意思是“网络服务”或类似的东西(至少使用该术语的人的意思是这样),尽管我也看到/听到它在许多招聘信息和面试中被(误)用来表示各种各样的东西,从 API 和库(如 Boost 或 Spring)到 C++ STL 甚至 C# 本身(语言本身,而不是 .NET)。
我希望这能有所帮助。
答案2
BIOS 固件不是中间件吗?
对的。中间件在OS之上,利用OS服务来提供更高级别的服务。BIOS在OS之下。
操作系统的引导加载程序是固件、中间件还是某种软件?
引导加载程序是一种低级应用程序。它不是固件(因为它是平台特定的,而不是硬件特定的)或中间件(因为它不使用操作系统服务)。
CPU 的指令集是固件而不是中间件吗?
CPU 的指令集不是软件。所以它不是那些东西。它可能以硬件、微代码或某种组合的形式实现。
是否存在一些非固件的中间件?
中间件是特定于操作系统的,而固件不是。固件是为特定硬件构建的。中间件是为特定操作系统构建的。
设备驱动与固件、中间件有什么联系和区别?
固件通常嵌入硬件中并在硬件本身上运行。设备驱动程序是操作系统的一部分,在 CPU 上运行,而不是它们控制的硬件。中间件特定于操作系统,并使用操作系统服务来提供更高级别的服务——而不仅仅是硬件控制。
答案3
软件
软件的定义非常广泛,它是一组在处理器上执行的指令,用于指示处理器执行操作。根据此定义,固件、中间件和驱动程序也是软件,不同的术语描述了三种不同类型的软件,它们的作用截然不同。
固件
固件是通常驻留在非易失性存储器(例如 EEPROM 芯片)中的软件,负责引导(使其可用)其他系统硬件和/或为该硬件提供用于“更高级别”软件(例如操作系统)的软件接口。
例如,PC 的 BIOS(或 Mac 上的 EFI 环境)可以被视为固件,因为它们都驻留在非易失性存储器中(通常是主板上的芯片 IIRC),并且负责硬件初始化的某些方面,以及加载其他软件(例如引导加载程序),它可以使用 BIOS 提供的功能与磁盘等硬件进行通信,从中加载第二阶段引导加载程序或操作系统内核。
司机
驱动程序是一种为特定操作系统提供系统硬件接口的软件。例如,Windows 通用键盘驱动程序理解键盘为所有标准键发送的信号,当它收到这些信号时,它会以 Windows 理解的方式将它们呈现给操作系统。此外,如果您有一个带有非标准键的花式键盘,它将包含一个驱动程序来启用这些键,因为通用键盘驱动程序不理解这些非标准键。中间件
中间件是一种位于两个软件之间并充当中介的软件,通常用于促进两者之间的通信。例如,游戏引擎可以被视为中间件,因为它位于客户端应用程序(游戏)和游戏可能使用的操作系统公开的各种服务之间:
- 图形服务(Windows 的 DirectX 或 Windows、Mac、Linux 和其他操作系统的 OpenGL)
- 声音服务(适用于 Windows 的 DirectSound/Windows Audio、适用于 Mac 的 Core Audio)
- 网络服务(DirectPlay 或适用于 Windows 的 Windows Sockets)
当游戏使用游戏引擎时,它会要求引擎执行其想要执行的任务,而不是直接询问相关的操作系统服务。
通过中间件层使用服务的主要优点是,使用该服务的应用程序不需要关心服务如何工作的具体细节,因此游戏开发人员可以让引擎执行一项任务,例如绘制一个三角形,并且可以合理地确信,尽管从编程角度来看,执行绘图的实际服务实际上可能有很大不同,但三角形在 Windows 和 Mac 上绘制的结果相同。