简介:
Open Firmware是定义计算器固件接口的标准,以前由IEEE认可。起源于Sun Microsystems,最初被称为OpenBoot。
这个是BIOS技术的开源版,而我们平时说的BIOS就是各个主板上的自有程序,那些是没有标准定义的。
这种程序是固化在计算机里的,一般是放在主板里,和计算机的操作系统无关,计算机生产商会提供这个程序的维护和升级。它是计算机系统启动时最先运行的软件,它控制处理器,执行系统自检,然后才是加载操作系统。
曾经使用OF作为计算机启动程序的几种计算机供应商包括:PowerPC架构的苹果系统,Sun Microsystems SPARC的工作站和IBM的POWER系统,还有ARM。
OF作为一种开放标准,所以如果设备支持这个标准,就能被计算机操作系统识别,比如Sun和苹果的操作系统都能识别并使用PCI网卡。
允许系统直接从PCI设备上加载与平台无关的驱动程序,提高兼容性。
OF有命令行终端提供访问,使用的Forth编程语言。
允许驱动程序被交互编写和测试。(因此苹果在大部分Power Mac上推出了诊断操作系统(diagnostic "operating system")。
Open Firmware被IEEI提出了个标准IEEE 1275-1994,但后来没有被Open Firmware Working Goup(OFWG)认可,所以作废了。
商用OF有几个发布了开源版本,包括Sun OpenBoot, Firmworks OpenFirmware和Codegen SmartFirmware。
源代码在OpenBIOS项目上可看:https://en.wikipedia.org/wiki/OpenBIOS
这是BSD license的。
OF定义了一个标准方式来描述系统的硬件设置,叫做devcie tree。这使操作系统能更好的理解主机的设置,减少用户设置和硬件轮询。
“device tree”用来定位和描述计算机内部和外部的连接设备,每个设备都被唯一指定一个地址,系统启动后使用此地址访问设备。
OF的Forth代码被编译成FCode的字节码,与电脑架构无关,既和指令集无关也和存储器级别无关。
PCI卡槽的设备卡可以包含一个程序,编译成FCode,然后就能在任一个Open Firmware system上运行。
所以OF提供了平台无关的启动自检,配置码和设备驱动。
FCode很紧凑,比如一个硬盘驱动仅需要2KB。
FCode遵循ANS Forth,使用了Open Firmware library的一个子集。
要访问OF的话,在PowerPC架构的苹果机上,在开机时,按下Command + Alt +F,就能进入OF操作界面。
其他类型的BIOS,可能是开机时按下F2,或者F10,具体哪个按键要根据计算机厂商的定义。
OF功能介绍:
OF是可以应用在不同处理器和总线上的一个启动固件。
OF是可移植的,从设计上没有绑定某系列处理器或者某个特殊扩展总线。所以能支持多种指令集和总线。
扩展型驱动:OF的核心功能是支持自识别的设备。
比如一个第三方外设制造商希望自己生产的插在扩展总线上的卡能够被系统识别和使用,在操作系统级别,只要驱动存在硬盘上,或者驱动直接安装到操作系统中。在固件级别,获取驱动就比较难。因为固件要在系统启动并能读取硬盘前就要可以操作。所以需要个驱动存放在板子的ROM里。OF使用的不是机器语言,而是机器无关的FCode语言: Forth编程语言。这是一个字节编码的解释性语言。FCode的驱动会被编译并加载到内存中执行。同时,FCode的程序还提供了开发和可扩展的描述功能,使用处理器和架构无关的格式(Device Tree)来描述硬件信息,各种特性包括设备名、模型、版本、设备类型、注册地点、中断等级、支持的特性和其他的对设备有意义的信息,这些信息后面会被OS所使用。
灵活命名方式:OF使用一个层级形式的device tree来表示设备信息的结构和符号。并使用当前bus的设置和机器的物理地址组合的方式命令,保证命名不冲突,这样就不需要需要管理命名的权限。
可维护性:OF的软件更新,不需要更换ROM或重新烧写Flash,而是通过自我打patch的方式,这些patch存放在同样的存储器里,是一些可配置变量。
Devcie Tree:描述系统的配置,是一个由节点组成的数据结构,每个设备节点包含作为属性的描述信息。
bus节点的子节点设备表示连接在这个设备上。
用户选项的存储:使用non-volatile memory来存储这些用户的设置,比如从哪个设备启动等。类似CMOS RAM。
可交互调试器:OF提供一个运行时调试接口,可以直接运行FCode来执行一些Debug功能。
客户程序接口(Client Interface):这个接口定义了从设备接口得到的消息,是如何通过良好定义的接口传给OS的。
OS加载并启动后,通过这个接口检查设备树,临时使用OF中的设备驱动等。这里须注意的是,OF可以直接加载OS,也可能加载并执行第二个boot程序,由它来加载OS。
OS启动后,就不在需要OF的功能了,只有OS初始化时需要。理论上,OS可以继续使用OF驱动,但OF的驱动一般时最简单的和最小size的优化,而OS需要的驱动时时为了性能和功能完整性的驱动。
嵌入式系统:OF最初是为了工作站级别的机器设计的。比如,Sun的所有机器。但现在的嵌入式机器也有使用强大的32位芯片的,并且也是用工业标准总线。所以OF也使用与一些嵌入式机器。
系统核心:OF的核心是一个很小的高效的Forth引擎,来执行字节码。为了速度和空间,使用本地机器码编写。
在硬件级别的开发和调试支持也很好,有断点、步进、跟踪、反汇编以及内存和I/O操作。
设备操作界面(device interface):支持设备的即插即用功能,设备的配置信息和驱动以FCode程序的形式存储在连接到扩展总线的外部设备中。设备驱动是平台和处理器无关的,包括检测和配置的方法基于总线,与处理器无关。
用户操作界面(user interface):OF有一套丰富的可扩展的命令,用于系统管理,生产测试,现场服务(Field Service)和开发时的系统bringup,调试也非常方便,使系统更快推向市场。
空间:一般一个全功能的Open Firmware实现,包含调试、网络协议、自检、板级驱动、键盘映射表、图形设备支持库、字体和在线帮助,通常需要128K到256K之间。
参考: