在 PC 机上开发应用程序的用户都会有这样的感觉, PC 机有完善的操作系统并提供应用程序接口( API ),开发好的应用程序可以直接在操作系统上运行。虽然嵌入式系统的应用程序完全可以在裸板上运行,但为了使系统具有任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理和中断处理的能力,提供多任务处理,更好的分配系统资源的功能,用户就需要针对自己的硬件平台和实际应用选择适当的嵌入式操作系统( Embedded Operating System ,以下简称 EOS )。
uClinux 是一个完全符合 GNU/GPL 公约的操作系统,完全开放代码,现在由 Lineo 公司支持维护。 uClinux 的发音是 “ you-see-linux ” , 它的名字来自于希腊字母 “ mu ” 和英文大写字母 “ C ” 的结合。 “ mu ” 代表 “ 微小 ” 之意,字母 “ C ” 代表 “ 控制器 ” ,所以从字面上就可以看出它的含义,即 “ 微控制领域中的 Linux 系统 ” 。
为了降低硬件成本及运行功耗,有一类 CPU 在设计中取消了内存管理单元( Memory Management Unit ,以下简称 MMU )功能模块。最初,运行于这类没有 MMU 的 CPU 之上的都是一些很简单的单任务操作系统,或者更简单的控制程序,甚至根本就没有操作系统而直接运行应用程序。在这种情况下,系统无法运行复杂的应用程序,或者效率很低,而且,所有的应用程序需要重写,并要求程序员十分了解硬件特性。这些都阻碍了应用于这类 CPU 之上的嵌入式产品开发的速度。
然而,随着 uClinux 的诞生,这一切都改变了。
uClinux 从 Linux 2.0/2.4 内核派生而来,沿袭了主流 Linux 的绝大部分特性。它是专门针对没有MMU 的 CPU ,并且为嵌入式系统做了许多小型化的工作。适用于没有虚拟内存或内存管理单元( MMU )的处理器,例如 ARM7TDMI 。它通常用于具有很少内存或 Flash 的嵌入式系统。 uClinux是为了支持没有 MMU 的处理器而对标准 Linux 作出的修正。它保留了操作系统的所有特性,为硬件平台更好的运行各种程序提供了保证。在 GNU 通用公共许可证( GNU GPL )的保证下,运行uClinux 操作系统的用户可以使用几乎所有的 Linux API 函数,不会因为没有 MMU 而受到影响。由于 uClinux 在标准的 Linux 基础上进行了适当的裁剪和优化, 形成了一个高度优化的、代码紧凑的嵌入式 Linux ,虽然它的体积很小, uClinux 仍然保留了 Linux 的大多数的优点:稳定、良好的移植性、优秀的网络功能、完备的对各种文件系统的支持、以及标准丰富的 API 等。图 7.1 为 uClinux 的基本架构。
Boot Loader :负责 Linux 内核的启动,它用于初始化系统资源,包括 SDRAM 。这部分代码用于建立 Linux 内核运行环境和从 Flash 中装载初始化 ramdisk 。
内核初始化: Linux 内核的入口点是 start_kernel ()函数。它初始化内核的其他部分,包括捕获, IRQ 通道,调度,设备驱动,标定延迟循环,最重要的是能够 fork “ init ” 进程,以启动整个多任务环境。
系统调用函数 / 捕获函数:在执行完 “ init ” 程序后,内核对程序流不再有直接的控制权,此后,它的作用仅仅是处理异步事件 ( 例如硬件中断 ) 和为系统调用提供进程。
设备驱动:设备驱动占据了 Linux 内核很大部分。同其他操作系统一样,设备驱动为它们所控制的硬件设备和操作系统提供接口。
文件系统: Linux 最重要的特性之一就是对多种文件系统的支持。这种特性使得 Linux 很容易地同其他操作系统共存。文件系统的概念使得用户能够查看存储设备上的文件和路径而无须考虑实际物理设备的文件系统类型。 Linux 透明的支持许多不同的文件系统,将各种安装的文件和文件系统以一个完整的虚拟文件系统的形式呈现给用户。
下面介绍一些和 uClinux 相关的知识。
1 、 MMU (内存管理单元) 和 VM (虚拟内存)
许多嵌入式微处理器都由于没有 MMU 而不支持虚拟内存。没有内存管理单元所带来的好处是简化了芯片设计,降低了产品成本。由于大多数的嵌入式设备没有磁盘或者只有很有限的内存空间,所以无需复杂的内存管理机制。但是由于没有 MMU 的管理,操作系统对内存空间是没有保护的, 所有程序访问的地址都是实际物理地址。但从嵌入式系统一般都是实现某种特定功能的角度考虑, 对于内存管理的要求完全可以由程序开发人员考虑。
2 、实时性的支持
uClinux 本身并不支持实时性,目前存在两种不同的方案提供 uClinux 对实时性的支持,它们分别是 RTLinux(RTL) 和 RTAI(Real Time Application Interface) 。有了这两种方案, uClinux 可以应用到对实时性要求较高的场合。
3、 平台支持
开发 uClinux 的工具链:
开发 uClinux 通常用标准的 GNU 工具链。经过修改的工具链支持一些高级特性,比如XIP(Execute-In-Place) 技术,共享库支持等。
uClinux 所适用的微控制器:
uClinux 适用于摩托罗拉的 ColdFire/Dragonball , ARM 系列 ( 例如 Atmel, TI, Samsung 等生产的芯片 ) , Intel i960, Sparc ( 例如无 MMU 的 LEON), NEC v850 ,甚至是开放的可综合 ( 到 CLPD 内 ) 的CPU 核,比如 OPENcore 。
4、与标准 Linux 的兼容性
uClinux 除了不能实现 fork() 而是使用 vfork() 外,其余 uClinux 的 API 函数与标准 Linux 的完全相同。这并不是意味着 uClinux 不能实现多进程,实际上 uClinux 多进程管理是通过 vfork() 来实现的,或者是子进程代替父进程执行,直到子进程调用 exit() 函数退出,或者是子进程调用 exec() 函数执行一个新的进程。大多数标准的 Linux 应用程序在从 Linux 操作系统移植到 uClinux 系统时,几乎不用做什么大的改动,就可以完全达到对一个嵌入式应用程序的要求 ( 例如合理的资源使用 ) 。
uClibc 对 libc( 可用于标准 Linux 的函数库 ) 做了修改为 uClinux 提供了更为精简的应用程序库。
5 、 网络的支持
uClinux 带有一个完整的 TCP/IP 协议,同时它还支持许多其他网络协议。 uClinux 对于嵌入式系统来说是一个网络完备的操作系统。
6、应用领域
uClinux 广泛应用于嵌入式系统中,例如 VPN 路由器 / 防火墙,家用操作终端,协议转换器, IP电话,工业控制器, Internet 摄像机, PDA 设备等。