1.2.2 嵌入式操作系统与通用操作系统的区别

嵌入式操作系统与通用操作系统的区别体现在以下三个方面。

1.地址空间上的区别

一般情况下,通用操作系统,充分利用了CPU提供的内存管理机制(MMU单元),实现了一个用户进程(应用程序)独立拥有一个地址空间的功能,比如,在32位CPU的硬件环境中,每个进程都有自己独立的4GB地址空间。这样每个进程之间相互独立,互不影响,即一个进程的崩溃,不会影响另外的进程,一个进程地址空间内的数据,不能被另外的进程引用。嵌入式操作系统在多数情况下不会采用这种内存模型,而是操作系统和应用程序共用一个地址空间,比如,在32位硬件环境中,操作系统和应用程序共享4GB的地址空间,不同应用程序之间可以直接引用数据。这类似于通用操作系统上的线程模型,即一个通用操作系统上的进程,可以拥有多个线程,这些线程之间共享进程的地址空间。

这样的内存模型实现起来非常简单,且效率很高,因为不存在进程之间的切换(只存在线程切换),而且不同的应用程序之间可以很方便地共享数据,对于嵌入式应用来说,是十分合适的。但这种模型的最大缺点就是无法实现应用之间的保护,一个应用程序的崩溃,可能直接影响到其他应用程序,甚至操作系统本身。但在嵌入式开发中,这个问题却不是问题,因为在嵌入式开发中,整个产品(包括应用代码和操作系统核心)都是由产品制造商开发完成的,很少需要用户编写程序,因此整个系统是可信的。而通用操作系统之所以实现应用之间的地址空间独立,一个立足点就是应用程序的不可信任性。因为在一个系统上,可能运行了许多不同厂家开发的软件,这些软件良莠不齐,无法信任,所以采用这种保护模型是十分恰当的。

2.内存管理上的区别

通用的计算机操作系统为了扩充应用程序可使用的内存数量,一般实现了虚拟内存功能,即通过CPU提供的MMU机制,把磁盘上的部分空间当做内存使用(详细信息请参考本书第5章)。这样做的好处是可以让应用程序获得比实际物理内存大得多的内存空间,而且还可以把磁盘文件映射到应用程序的内存空间,这样应用程序对磁盘文件的访问,就与访问普通物理内存一样了。

但在嵌入式操作系统中,一般情况下不会实现虚拟内存功能,这是因为:

(1)一般情况下,嵌入式系统没有本地存储介质,或者即使有,数量也很有限,不具备实现虚拟内存功能的基础(即强大的本地存储功能);

(2)虚拟内存的实现,是在牺牲效率的基础上完成的,一旦应用程序访问的内存内容不在实际的物理内存中,就会引发一系列的操作系统动作,比如引发一个异常、转移到核心模式、引发文件系统读取操作等一系列动作,这样会大大降低应用程序的执行效率,使得应用程序的执行时间无法预测,这在嵌入式系统开发中是无法容忍的。

因此,权衡利弊,嵌入式操作系统首选是,不采用虚拟内存管理机制,这也是嵌入式操作系统与通用的操作系统之间的一个较大区别。

3.应用方式上的区别

通用的操作系统在使用之前必须先进行安装,安装包括检测并配置计算机硬件、安装并配置硬件驱动程序、配置用户使用环境等过程,这个过程完成之后,才可以正常使用操作系统。但嵌入式操作系统则不存在安装的概念,虽然驱动硬件、管理设备驱动程序也是嵌入式操作系统的主要工作,但与普通计算机不同,嵌入式系统的硬件都是事先配置好的,其驱动程序、配置参数等往往与嵌入式操作系统连接在一起,因此,嵌入式操作系统不必自动检测硬件,因而也无需存在安装的过程。

除了上述特点与区别外,嵌入式操作系统还有一些其他自身特点,在此不再详述,有兴趣的读者可参阅相关资料。