红联Linux门户
Linux帮助

Zaurus 引领嵌入式 Linux

发布时间:2006-11-18 11:16:06来源:红联作者:lgms2008
Sharp Zaurus 手持式系统是嵌入式 Linux® 系统的一个先锋,Peter Seebach 认为在一种技术早期出现时就为其贡献自己的力量是一个好主意。在这个 Linux 的魅力 系列文章中,Peter 将对 Zaurus SL-5600 进行一下拆解,从而更好地了解一下它的历史。

George Santayana 曾经说过,“那些忘记历史的人注定会重复历史”。但是在计算机设计业界中,这个警告似乎并没有受到重视。很多公司通常都会重复同样的错误和教训,并对以前的系统反复进行改进。

当 Sharp Zaurus 首次声明要 “运行 Linux” 时,Linux 社区一时间变得热闹非凡,既有爱好者的欢呼,又充斥了各种谣言。几年以后,现在仍然有一些运行 Linux 的手持设备不断从 Sharp 的工作中吸取灵感和思想,尽管基于 Linux 的 Zaurus 在美国市场上已经逐渐退出了。

本月的 Linux 的魅力 文章将来介绍一下 Sharp Zaurus SL-5600。这是第二个零售版本(第一个零售版本是 SL-5500,这是在 SL-5000D 开发版之后的一个版本),本文将介绍一下这个领域中当前努力的根源。

嵌入式 Linux 系统的设计加入了很多方面的考虑;Zaurus 是第一个解决这些考虑的系统。Linux 社区对此的最初反应非常狂热,但是这个设备在美国市场上并没有取得 Sharp 所期望的成功。

硬件设计

在设计嵌入式系统时,一个主要的驱动因素是 硬件的功能。Zaurus 使用了手持式计算机非常典型的硬件平台:

CPU 是 400MHz 的 Intel® XScale;Linux 称之为 ARM 处理器,因为 gcc 并没有试图与市场术语紧密吻合。
这个系统上安装了 64MB 的闪存和 32MB 的 RAM。5500 上有 32MB 的闪存和 64MB 的 RAM;结果是有些程序可以在 5500 上运行,但是无法在 5600 上运行。
另一方面,5600 可以很好地解决由于断电而引起的问题。
它有一个 320x240 的屏幕,这是嵌入式 PC 的典型设置。(以后这个模块升级到了 640x480 的屏幕,这看起来已经相当舒服了。)
它还有 CF(Compact Flash)和 SD(Secure Digital)插槽,可以支持非存储设备,例如 802.11b 无线 CF 卡或以太网适配器。
Zaurus 与大部分 PDA 一样,也有一些通用键,不过它还有一个很小的隐藏键盘。这个键盘是一个真正的卖点;相对于手写识别来说,即使是一个非常小的家盘也是非常大的改进。可以使用键盘,这种特性的确令人惊讶。
5000 和 5500 的硬件设计非常类似。后来的模块采用的是蛤壳设计,它提供了更大的键盘,其中屏幕可以翻上来构成一个传统的肖像格式的 PDA 屏幕,它具有一个输入笔 ---- 这与现在大部分 tablet PC 所采用的设计相同。

5600 相对于 5500 来说提供了一些改进,但是从 StrongARM 处理器到 XScale 处理器的变化并非十分平滑。新的模块对电池的寿命提供了很大的改进(方法非常简单,将电池扩充为 2 倍大小)。

5500 和 5600 之间的区别反映了 PDA 用户为 Sharp 提供的反馈。在大部分情况中,这些变化反映了 PDA 用户的通用考虑。例如,将用户数据存储到 flash 中是一个很好的解决方案,如果电池电力不足,PDA 用户就可能会面临同样的丢失数据的风险,这个方案可以很好地解决这个问题。另外,5600 的键盘也比 5500 的键盘更容易使用。

构建 PDA

Linux 开发人员对嵌入式系统的很多假设都不能在 PDA 上工作。PDA 用户希望能够运行新的应用程序、存储数据并以后再使用这些程序和数据。此外,从 3Com 引入第一个 Palm Pilot 以来,PDA 一直都在使用 GUI。9600 波特率的串口终端并不是典型的选择。

桌面 Linux 假设在 PDA 上也都不太适合。大部分 PDA 用户并不喜欢先登录到系统中,然后再显式地启动 X 服务器。另外,320x240 屏幕对于文本终端的用法来说并不足够。虚拟桌面、多个鼠标按钮以及典型桌面的其他特性对于一个具有输入笔的小屏幕来说也并不适合。

Zaurus 使用的是 Qtopia 桌面环境,而不是 X 服务器。您也可以在这种硬件上启动 X 服务器(毕竟,这个机器所拥有的内存和处理器的处理能力比 SPARC 工作站 SLC 所拥有的内存和处理器的处理能力更高),但是小足印和小显示器并不适合 X 工作站的假设。

Zaurus 为 PDA 提供的应用程序只是 PDA 上的一个弱小单元。这还只是非常年轻的一组应用程序,功能尚不像 Palm 平台上的应用程序一样完备。

调整 Linux

让 Linux 在 PDA 上工作的一个挑战是确定何时使用普通的 Linux 方法来实现某些功能,何时不使用这些普通的方法。结果不总会像用户所希望的一样。例如,确定何时(或是否)需要密码就是一个挑战。大部分用户在 PDA 上都不希望使用密码提示。

Zaurus 从一开始就彻底抛弃了安全性方面的考虑。GUI 以 root 用户身份运行,但是即使不以 root 用户身份运行,也不需要输入 root 密码, su 命令就可以实现这种功能。

Zaurus 是基于 BusyBox(0.60.4 版本)的。这个最优秀的工具让很多程序可以链接成一个可执行程序;不过这种组织有点奇怪。BusyBox 内嵌了对 gzip 的支持,但是它也单独提供了 zcat 工具。不过这是一个非常合理的决定,因为这样可以节省相当多的空间。

启动

rc.d 系统被完整地保留了下来,尽管 init 级别的定义与桌面 Linux 系统中的定义可能并不完全相同:

清单 1. SUSE Linux 和 Zaurus 上的运行级别

引用:
SUSE:
# runlevel 0 is System halt (Do not use this for initdefault!)
# runlevel 1 is Single user mode
# runlevel 2 is Local multiuser without remote network (e.g. NFS)
# runlevel 3 is Full multiuser with network
# runlevel 4 is Not used
# runlevel 5 is Full multiuser with network and xdm
# runlevel 6 is System reboot (Do not use this for initdefault!)

Zaurus:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - JavaVM(Intent) developer mode
# 5 - JavaVM(Intent)
# 6 - reboot (Do NOT set initdefault to this)
文章评论

共有 1 条评论

  1. lgms2008 于 2006-11-18 11:17:22发表:

    在这两个系统上缺省的 init 级别都是 5,但是其意义却是不同的。实际上,在 Zaurus 上,级别 3、4 和 5 从我的眼光来开并没有什么不同。有意思的是,/etc/inetd.conf 把其他系统服务都禁用了,只剩下要启动 inetd。在早期的版本中,情况更为糟糕:它启动了一个 ftp 服务器,在一个不太常见的端口上进行监听。当然,这并不需要 root 的密码,因此可以看作是一个安全漏洞。

    然而,inittab/rc.d 子系统并没有干太多事情;系统启动 GUI,然后 GUI 可以执行实际的工作。

    与文本终端的 Linux 系统不同,Zaurus 会显示一些消息保速用户耐心等待。需要使用 2 分钟来引导,这在 PDA 上有些太长而不好接受了。 这与 Palm PDA 相比这样很难接受,我自己的 Palm PDA 重新启动需要大约 10 秒钟。

    rc.d 目录中包含了几个常见的启动脚本,这些脚本的名字都是顾名思义的:

    清单 2. rc5.d 目录中的文件

    引用:
    $ ls rc5.d
    S04sd S06pcmcia S15inet S23portmap S41atd S48usb _S02syslog


    sd 和 pcmcia 脚本分别为 SD 和 CF 插槽提供了接口。(CF 插槽大部分就是小一点的 PCMCIA 插槽。)syslog 脚本运行的时机相当早,并且会循环使用日志文件。

    如果您只看这个目录中的内容,可能就会忽略了 inittab 中的一些设置,它们可以完成了一点系统初始化的工作:

    清单 3. ininttab 项

    引用:
    si::sysinit:/etc/rc.d/rc.sysinit
    s0:24:respawn:/sbin/getty 9600 ttyS0
    pd:3:respawn:/etc/sync/serialctl
    # Specify program to run on tty1
    1:2:respawn:/sbin/getty 9600 tty1
    ln:345:respawn:survive -l 6 /sbin/launch
    #qt:5:respawn:/sbin/qt
    # collie sp.
    sy::respawn:/sbin/shsync


    在缺省的运行级别 5 中,有些是不会运行的 ---- 不过看一下选项都有哪些是很有趣的。launch 程序会解释有关文件系统布局的内容。launch 程序从一个配置文件(根据字符串)开始运行,这个文件是 /usr/sharp/etc/launch.conf;/usr/sharp 是一个指向 /home/sharp 的链接 ---- 当然,这是由于您可以修改东西的地方就只能是在 /home 中。

    文件系统布局

    Zaurus 上的文件系统有点奇怪。CF 卡会被自动挂载到 /mnt/usr.rom/cf 上,而 SD/MMC 卡则会被自动挂载到 /mnt/usr.rom/sd 上。令人惊讶的是,/etc 是一个到 /home/etc 的链接。只有在您意识到备份只需要备份 /home 目录就可以时,这才显得非常有意义;这样 /etc 也就备份了。

    / 和 /home 文件系统都被存储到闪存上,它被划分成了两个分区。/ 文件系统几乎都已经满了,这对于扩展软件是一个限制 ---- 不过有很多文件都不需要放到这儿。

    根文件系统有一些魔力;其中包含的文件所占用的空间要比根文件系统本身的空间更大!这是通过使用 JFFS2(Journaling Flash File System version 2)实现的,它会对所存储的数据进行压缩;这 21,544 个存储块可以容纳大约 60,000 个文件块。

    似乎删除一些文件可以释放一些空间。例如 bash。bash 包含了很多东西,但是它并没有节省空间的模式;一个 548KB 程序对于非常拥挤的根文件系统来说并不是什么好事。

    更为有趣的是,/root 目录中包含了一些关键的 tar 文件,在恢复系统时需要使用这些文件。这些 tar 文件都没有进行压缩;对这些文件进行压缩就可以释放一些空间(不过能节省的空间并没有您想象的那样多,因为 JFFS2 会自动对这些文件进行压缩。)

    帐号管理

    与那些完全忽略帐号、全部使用 root 用户身份运行程序的系统不同,Zaurus 系统则会以 root 用户身份运行一部分程序(包括 GUI 本身),而以另外一个用户 zaurus 的身份来运行大部分程序。当然,在不为 root 用户使用密码时,这样做能够确保影响最小。

    Zaurus 上并不能真正支持用户的登录和登出;您不能指定自己希望使用哪个用户的身份来运行程序。当然,在 PDA 上并没有太多理由来这样做。另外,能将 user/admin 分离开来是个不错的想法,在实际的 Linux 机器上就是这样使用的,这样 Zaurus 就可以运行服务了。如果您觉得这听起来似乎没什么用处,那么显然是没有这样的经历:把 PDA 忘在家里了,它碰巧正在插着电源,而您却没有办法可以获得自己的地址本。如果它运行了一个 ssh 服务器就好了!

    添加用户的功能并不支持,有些用户报告说在使用过程中出现文件系统崩溃的情况;例如,在运行 adduser 程序时,将 root 所有的文件设置成新用户所有。

    结束语和展望

    早期的 Zaurus 暗中有一些尚未完成的特性;有很多问题需要修正,这需要更多的开发时间,或者需要对设计权衡进行更多讨论。

    尽管 Sharp 对于修正 ROM 的开发是有限的,但是有一些第三方的公司已经开发了很多插入式替换方案。其中的一个项目是 Opie(Open Palmtop Integrated Environment;请参阅 参考资料),它可以支持其他非 Zaurus 硬件(例如 HP iPaq 手持设备)已经有很长时间了。

    在下一篇 Linux 的魅力 的文章中,我们将更详细地了解 Opie 目前已经发展到了什么程度(以 Familiar 项目的形式;请参阅 参考资料)。这个项目中已经开展的开发工作从用户使用 Zaurus 这种旧系统的经验中汲取了很多灵感。这是 Linux 所实现的最好功能;它提供了一个开放的环境,人们可以从中学习经验,而不用从头开始闭门造车。

    我们记住了历史,这样就不会重复历史了。如果您正在从事自己的手持式项目的工作,那么就请记住 Zaurus SL-5600 是非常值得仿效的一个实现,也是一个值得在此基础上进行改进的实现。

    [ 本帖最后由 lgms2008 于 2006-11-18 11:22 编辑 ]