A.2. 设计

A.2.1. 对音频硬件的支持

市场上存在大量的音频硬件,每种声卡都有其特定的配置。有关如何设置特定声卡的详细信息,我们可以参考来自Linux 文档项目的 Sound-HOWTO。 然而,从更广义的意义上讲,我们可以将声卡视为任何其他新的硬件。 要向 GNU/Linux 系统添加新硬件,我们需要配置内核以识别它,并配置/dev根磁盘上的文件以访问它。

A.2.1.1. 内核对音频的支持

为了支持声卡,必须构建一个新的内核。 非常重要的是,音频硬件支持应配置为内置,因为袖珍 Linux 未设置为处理内核模块。

A.2.1.2. 根磁盘对音频的支持

搜索devices.txt关键字“sound”将会列出相当多的可能的音频设备,但通常只有/dev/dsp/dev/mixer需要从 PC 获取声音。 这两个文件分别控制数字音频输出和混音器控制。

A.2.2. 为程序创建空间

为 mp3blaster 程序创建更多空间的可能最简单的方法是挂载一个额外的存储设备。 有几个挂载点的选择。 到目前为止/usr, /home/opt都是空目录,它们中的任何一个都可以用来挂载软盘、CD-ROM 或额外的压缩 ramdisk 镜像。/usr目录是放置应用程序的逻辑选择,但是媒体的选择呢? Mp3blaster 和其所需的库太大,无法容纳在 1.44M 软盘上,并且刻录 CD-ROM 似乎是一个繁琐的工作,只为了一个小程序。 因此,鉴于这些限制,最好的选择是将程序放在压缩软盘上。

A.2.2.1. 挂载额外的压缩软盘

挂载 CD 和未压缩的软盘很容易,但是如何将压缩镜像从软盘加载到 ramdisk 中呢? 这必须手动完成,因为自动挂载压缩软盘仅适用于根磁盘。 并且使用 mount /dev/fd0 将不起作用,因为软盘上没有文件系统,只有 gzip 文件的内容。 实际的文件系统包含在 gzip 文件中。 那么我们如何挂载隐藏在 gzip 文件下面的文件系统呢? 通过检查用于创建熟悉的压缩根磁盘软盘的步骤,可以解决这个难题。

  1. 创建一个 ramdisk,挂载它并填充文件。

  2. 卸载 ramdisk 设备。

  3. 使用 dd 将 ramdisk 的内容转储到镜像文件。

  4. 使用 gzip 压缩镜像文件。

  5. 使用 dd 将压缩镜像文件写入软盘。

如果这就是压缩镜像从 ramdisk 到压缩软盘的路径,那么从压缩软盘到 ramdisk 应该就像反向运行这些步骤一样简单。

  1. 使用 dd 从软盘读取压缩镜像文件。

  2. 使用 gunzip 解压缩镜像文件。

  3. 使用 dd 将镜像文件的内容转储到 ramdisk 中。

  4. 挂载 ramdisk 设备。

  5. 文件可用。

我们可以通过使用管道组合 ddgunzip 来切断中间的镜像文件,像这样:dd if=/dev/fd0 | gunzip -cq > /dev/ram1。现在压缩的软盘直接进入 ramdisk,并在运行时解压缩。

A.2.2.2. 根磁盘对额外 ramdisk 的支持

我们已经有内核对 ramdisk 的支持,因为我们正在使用压缩的根磁盘,但我们需要在/dev中创建更多的 ramdisk。 通常,内核在/dev/ram0/dev/ram7支持八个 ramdisk,其中ram0用于根磁盘。Linux 源代码文档中包含的devices.txt文件将有助于将设备与其主设备号和次设备号进行匹配。

A.2.3. 访问音频文件

我们将在示例中使用的示例 mp3 文件足够小,可以放在未压缩的软盘上,因此无需刻录 CD。 但是,严肃的音乐爱好者可能希望能够挂载一个装满音乐的自定义 CD-ROM,并且该选项将需要对额外硬件的支持。

A.2.3.1. CD-ROM 硬件支持

大多数现代 CD-ROM 驱动器将使用像/dev/hdc/dev/hdd这样的 IDE 设备。为了支持这些 CD-ROM 驱动器,我们必须在内核中配置 IDE 支持,并在根磁盘上创建适当的设备文件。

A.2.3.2. CD-ROM 文件系统支持

CD-ROM 的文件系统与硬盘和软盘不同。 大多数 CD 刻录应用程序使用一个名为 ISO-9660 的文件系统,并且具有支持 Joliet 或 Rockridge 扩展的能力。 我们必须在内核中包含对这些文件系统的支持,才能挂载 CD-ROM。

A.2.4. 其他所需文件

我们希望 mp3blaster 的所有必需库和其他支持文件都作为压缩/usr镜像的一部分提供,以便 mp3blaster 可以正确运行。 熟悉的 ldd 命令可用于确定 mp3blaster 需要哪些库。 任何额外的库都可以放在/usr/lib中。 即使某些库可能出现在开发系统的/lib中,它们仍然可以放在袖珍 Linux 系统的/usr/lib中。 动态链接器ld-linux.so足够智能,可以在加载库时同时查找这两个位置。

因为 mp3blaster 使用 curses(或 ncurses)屏幕控制库,所以我们还需要一个额外的文件。 curses 库需要知道它控制的终端的特性,并且它从 terminfo 数据库中获取该信息。 terminfo 数据库由/usr/share/terminfo目录下的所有文件组成,并且与我们可用的磁盘空间相比非常大。 但是,由于袖珍 Linux 仅支持 PC 控制台,因此我们只有一个终端类型需要担心,因此只需要一个文件。 我们需要的 terminfo 数据库部分是文件/usr/share/terminfo/l/linux,因为我们正在使用“Linux”终端。 有关 curses 主题的更多信息,请参阅 John Strang 的名为“Programming with Curses”的书籍,该书可从O'Reilly publishing获得。

A.2.5. 任务总结

在声卡、ramdisk、CD-ROM 和 terminfo 之间,有很多需要跟踪的东西。 因此,让我们花一点时间来组织和总结使袖珍点唱机成为现实所必需的任务。