IRIX 到 Linux 的移植

作者:George Koharchik

Linux 是 POSIX(可移植操作系统接口)规范的超集。它运行在商用 PC 硬件、MIPS 系统、Sun 工作站、Macintosh 甚至 IBM 大型机上。它与 UNIX 非常相似,以至于许多 UNIX 代码只需少量更改即可移植过来。

高级概念研究工具 (ACRT) 是 ARPA 可重构模拟器计划 (ARSI) 的后代。它主要基于 IRIX,但其许多模块也有 NT 版本。ACRT 是一种车辆模拟器,可以重新配置为不同的车辆。雷神公司提供陆地车辆模拟器,目前包括 M1A1 和 M1A2 坦克、M2 装甲运兵车、M113、M577、HMMWV 和未来侦察车。“可重构性”是通过使用“Erector Set”® 型硬件、用于控制的软面板、用于手柄的串行线路输入以及一套通用的核心软件来实现的。

Erector Set 硬件看起来像是其同名产品的放大版。这允许将乘员座椅、控制装置和显示器放置在各种位置,以模拟车辆内部。

我们使用术语“软面板”来指代触摸屏激活的控制面板,它取代了实际车辆中的真实按钮和开关。这些控制面板的设计目的是将控制装置尽可能地靠近真实车辆。这最大限度地减少了车辆特定硬件的数量(目前只有手柄)。

手柄可以是车辆的实际乘员站硬件,也可以是具有简化内部布线的复制品。它们提供用于控制某些车辆功能的开关和模拟输出。这些输出的电压范围转换为 0 到 5 伏直流电,并通过 BG Systems Cereal Box 馈送。Cereal Box 充当模数转换器,并通过串行线路将值馈送到主机。最后,所有车辆使用的核心软件集使得开发新车辆或修改现有车辆特定模块变得更容易。

在启动时,系统在不同的主机上运行不同的软件模块。这些不同的模块包括地面运动(车辆如何移动)、武器模型(武器如何表现,炮弹射向何处)和供乘员交互的控制面板等。系统从单个主机启动,然后通过 UNIX rsh 命令在其他主机上启动进程管理器 (host_mgr)。这些 host_mgr 进程然后解析配置文件,以查看哪些内容在其本地主机上运行。

系统使用消息传递在不同模块之间移动信息。在同一主机上的模块之间,消息缓冲在内存映射文件中,作为共享内存的一种形式。在主机之间,使用 UDP 套接字传递信息。网关系统在国防交互式仿真 (DIS) 消息和内部车辆消息之间进行转换。这使得模拟器可以使用 DIS 协议与其他模拟器进行交互(参见图 1)。

Porting from IRIX to Linux

图 1

目标

A) 演示使用 Performer Linux (Mongoose) 的图像生成器

这个项目启动的原因是 SGI 发布了用于 Linux 的 Performer 可视化/模拟工具(此版本称为“Mongoose”)。由于我们模拟器的图像生成器(系统中绘制窗口外和传感器视图的部分)是基于 Performer 的,因此 Linux 移植工作的大部分已经为我们完成。剩下的工作是移植使用 Performer 的代码、所有车辆通用的库和工具(称为 Tiger 核心)以及足够的车辆代码,使其能够与其环境交互(移动、查看其他车辆并利用武器射击和爆炸等特殊效果)。

B) 尽可能进行双重编译以缩小代码库

为了更易于维护,我们决定最大限度地增加可以在 IRIX 或 Linux 下编译的代码量。这会将代码库缩小到更易于管理的大小。理论是,每个模块都将有一个包含源代码的目录,其下将有用于特定于体系结构的项目(编译的对象文件、库和可执行文件)的子目录。源代码中的 Makefile 使用 OSNAME 环境变量将任何 make 命令反弹到正确的子目录,具体取决于主机的体系结构(参见图 2)。

Porting from IRIX to Linux

图 2

C) 排列文件,使不同体系结构的机器使用相同的目录

为了使跨平台配置尽可能相似,文件的排列方式是使不同体系结构的机器使用相同的目录。对于可以在编译时区分的差异,编译库(模块链接到该库)和可执行文件所在的目录是不同的。使用包含体系结构名称的 BIN 和 LIB 目录的环境变量可以对此有所帮助。例如,在 IRIX 系统上,二进制目录(存储在 $ARSI_BIN 中)可能是 /apps/projects/ACRT/bin/IRIX64。在 Linux 系统上,它可能是 /apps/projects/ACRT/bin/Linux。由于路径存储在相同的环境变量中,因此脚本和 Makefile 可以使用它,而无需考虑它们运行的系统类型(参见图 3)。运行时也可以使用环境变量,以允许代码做出在编译时无法做出的决策。通过在配置文件中嵌入环境变量,我们可以为不同的体系结构使用相同的配置文件。

Porting from IRIX to Linux

图 3

源文件的可移植性是包含文件和双重编译 IRIX/NT 的模块的一个问题。为了使 IRIX 使用这些文件,它们必须是 UNIX 格式(CR/LF 问题),而不是 DOS 格式。幸运的是,MS Studio 接受 UNIX 格式的文件,因此我们选择了这种格式。添加 Linux 并未改变这个等式,因为 Linux 可以处理 DOS 和 UNIX 格式。但是请注意,shell 脚本文件必须是 UNIX 格式。

D) 克服不兼容性

我们首先尝试使用 POSIX 功能。当这不适用时,我们选择了最大公约数。

E) 简化维护

为了使维护更简单,我们试图避免代码中曲折的 #ifdef 区域,注意在代码的每个分支中使用和设置的变量,并验证控制流在分支之间是否没有显着差异。在可能的情况下,#ifdef 代码被移动到单独的文件中,以最大限度地减少其对变量的影响范围。

最后,不同的编译器对不同的事物敏感。在一个编译器上未被注意到的条件可能会在另一个编译器上引起警告。调查并理解编译器的警告。它们可能会引导您找到错误(在这种情况下,在编译时修复比在运行时跟踪要容易得多)。警告可能会向您显示意图与实现不同的地方。警告也可能隐藏错误。在一页关于未使用变量的警告中挑出重要的消息比删除未使用的变量更难。

使用的软件和硬件

本节反映了我们在 2000 年 3 月所做的工作。有关最新的信息,请参阅“后记”部分。

A) Red Hat 6.1

KDE 工作站安装选项提供了您需要的大部分软件包。

B) Metrolink Motif

我们试验了 Lesstif。虽然它对于 Performer 运行良好,并且允许我们编译其他工具,但它没有正确处理更新我们的一些滚动窗口。开发人员控制台(用于跟踪消息的工具)有一个滚动窗口,即使没有鼠标交互,也应该随着消息流量更新。Lesstif 版本没有做到这一点,但 Motif 版本做到了。

C) Mesa 图形库

我们使用 Mesa 图形库作为 OpenGL 的仿制品。确保在安装 Mesa 后按照他们的说明制作小部件集。

D) Viper V770 显卡。

我们使用了 Diamond Viper V770 显卡以及硬件加速的 Mesa 驱动程序和库。在当时(2000 年 1 月),GeForce 256 卡在 Linux 下受到支持,但没有用于它的硬件加速 OpenGL 驱动程序。最近,XFree86 4.0 版本已发布,虽然 GeForce 卡可以使用硬件加速 OpenGL,但设置起来可能很棘手。

E) 用于硬件加速的 XFree86 驱动程序

我们在 1 月份使用了 XFree86 SVGA 服务器和 XFree86-rivaGL-3.3.3.1-49riva 驱动程序。用于 GeForce 卡的 OpenGL Linux 驱动程序可从 nVidia 获得(请参阅“资源”)。

F) SGI 的 Performer 软件包

按照他们的说明下载并安装(请参阅“资源”网页)。

G) ACRT 1.06 版本(我们的模拟器)

有关体系结构和操作的详细信息,请参阅“规范”。

工具“等效项”

SGI 通常提供比 Linux 更舒适的环境。他们也在努力将更多 IRIX 的工具和功能移植到 Linux。对于那些习惯了 SGI 环境并且刚接触 Linux 的人,以下是我们移植时使用的一些对应工具

A) Xdiff -> Mgdiff

在网上搜索一下这个。我的记忆是它需要 Motif,而 Lesstif 行不通。

B) dbx -> gdb

您的基本命令行调试器。

C) cvd -> xxgdb

SGI Casevision 调试器为整套工具提供了一个不错的图形界面。虽然没有 Linux 等效于 Casevision 的工具,但 dbx 的 xxgdb 前端提供了类似的调试环境。还有一个名为“DDD”(数据显示调试器)的工具可用,我们没有使用它,因为我们已经熟悉 xxgdb。

D) gr_osview -> xosview

SGI 的系统监控和状态工具 gr_osviewxosview 包含更多内容,但 xosview 在查看处理器和内存状态、系统负载等方面的能力方面是相似的。

E) 编辑器、shell 等

Emacs、vi、edit、tcsh、bash 等都与您期望的非常相似(我想 shell 的黑暗角落可能存在一些差异,但我们的系统没有使用足够多的 shell 来遇到这些差异)。

F) xwsh -> xterm

我只能在这里说“等效”,但前提是 xwsh 的“-hold”选项(即使在其中运行的命令使用“-e”结束后仍会导致窗口持续存在)不适用于 xterm。

G) PCNFS -> SAMBA

原始系统通过 NFS 共享文件(需要 NT 的附加软件包)。在这项工作中,我们通过 NFS 在 Linux 和 IRIX 之间共享文件,并使用 SAMBA 与 NT 系统共享文件。

H) Lint

lint 调试工具作为 IRIX 的一部分捆绑在一起,但未与 Linux 捆绑在一起,尽管商业版本的 lint 可用于 Linux。还有一个名为 LCLint 的软件包,对于我们的工作(移植遗留代码)来说似乎有点过分。出于我们的目的,我们使用了 gcc 及其选项来进行更好的调试和错误检测

gcc -ansi -Wall -Wstrict-prototypes
        -Wmissing-prototypes \
        -fsyntax_only -pedantic -O2

Larch C Lint 可用于 Linux,并且具有比此更好的调试功能(如果您想付出额外的努力,请参阅“资源”)。

I) ICS 的 Builder Xcessory (BX PRO)

IRIX 4 版本(可能还有更新版本)的 ICS 的 BX GUI 构建器生成的 C 代码可以在 Linux 上编译。旧版本生成的代码需要进行调整。还有一个 Linux 版本的 BX 可用(请参阅“资源”)。

J) Virtual Prototypes 的 VAPS

VAPS 是一种控制面板构建工具。目前还没有 Linux 版本,但 VAPS 确实有一个 NT 版本。因此,我的小组将 IRIX VAPS 面板移植到 NT,但那是另一个故事了。

具体细节

A) 脚本和 Shell 环境

看起来 Linux(或 tcsh shell)在您 “rsh” 到另一台主机时会重置进程限制。这使我无法获得核心文件。为了解决这个问题,我在我的 .tcshrc 文件中添加了几行

limit coredumpsize 1000000 kbytes <----
source ~/environment
setenv PATH ${PATH}:.

此处引用的环境文件是模拟器的环境变量集合,在 shell 启动时设置。[由于列表 1 的长度,此处无法打印,但可在我们的 FTP 站点下载:ftp.linuxjournal.com/pub/lj/listings/issue82。]

使用 uname 的结果,我们可以透明地将环境变量指向特定于体系结构的二进制文件目录。然后,脚本、Makefile 和程序可以使用这些环境变量,而无需各自检查体系结构类型。当我们将 Linux 添加到组合中时,我们必须添加一些额外的变量

* $ARSI_SERIAL_PORT_ONE, $ARSI_SERIAL_PORT_TWO

串行端口设备的名称在 IRIX 和 Linux 之间有所不同。IRIX /dev/ttyd[N] 大致对应于 Linux /dev/ttyS[N-1]

* $ARSI_CTDB_FILE_SUFFIX
二进制数据文件的后缀在 big-endian (SGI MIPS) 和 little-endian (Intel X86) 系统之间有所不同。

B)Makefile

Makefile 是系统中在此移植中受到最多打击的部分。IRIX Makefile 从包含源代码的目录移动到 IRIX64 子目录,并添加 VPATH 以指向回它们。

Makefile 中的 VPATH(“视图路径”)类似于 -I 指令,它告诉编译器在哪里查找包含文件。VPATH 告诉 make 在哪里查找源文件——在我们的例子中,向上一个级别。移动 Makefile 的另一个后果是,您可能必须在 Makefile 中某些常规 shell 命令(cp、lint 等)在源文件上工作之前更改目录。

我们建议对于需要使用 VPATH 的 IRIX Makefile 使用 SGI 的 smake。我们已经开始使用 GNU Make,希望将其与 NT 集成。但是,MS Studio 改为使用 Nmake,因此这种好处从未实现。Smake 理解 VPATH 和常见的 IRIX Makefile 宏。我们唯一可以报告的异常是 clean 选项中发生的一个异常。如果 make clean 选项设置如下

clean:
    -rm -f *.o $(TARGET) *.a *~*

并且 rm 找不到任何要删除的内容,smake 有时会(错误地)以关于“exit badly formed number”的错误退出。我们不知道它为什么会这样做,但是添加显式的 “exit” 语句可以解决问题

clean:
    -rm -f *.o $(TARGET) *.a *~* ; exit 0
IRIX 有一个方便的功能,允许您指定要运行的备用 make 程序。程序的名称放在 Makefile 的第一行,紧跟 “#!”(很像脚本文件命名它们的解释器的方式)。因此,使 IRIX Makefile 的第一行
#! smake
将导致默认的 make 程序调用 smake 来处理 Makefile。

IRIX Makefile 和 GNU Makefile 之间跟踪依赖关系的方式也不同。IRIX Makefile 生成一个 Make.depend 文件,其中列出了所有源文件的所有依赖项。在 Red Hat 6.1 附带的 GNU make 版本中,依赖项保存在每个源文件的单独文件中。例如,如果您有一个文件 ground_motion.c,则会有一个对应的依赖项文件 ground_motion.d。这些可以使用 .d.c 规则自动生成。(有关详细信息以及如何将 .d 扩展名组合到 Make.depend 文件中,请参阅 GNU Make 文档。)

编译器选项在 IRIX 和 GNU 编译器之间也不同。以下是我们所做的更改

对于 IRIX:使用 GNU:目的:--------- -------- --------fullwarn -Wall -额外的警告,错误检查-MDupdate -MD -更新依赖项-xansi -ansi -支持 ANSI C

现在使用编译器的 -g 选项进行调试非常重要。即使未指定 -g 选项,IRIX 调试器仍然可以为您提供信息。对于 GNU,您确实需要包含 -g。在 Linux 方面,如果您正在做一些使用 BSD 函数(如 strncasecmp)的事情,则可能需要 -D_BSD_SOURCE。

编译器选项的允许排序不同。IRIX 似乎喜欢库放在最后,gcc 似乎不在乎。

最方便的 Makefile 宏之一 $$(@F) 仅在 GNU make 下部分可用。Make 允许您使用 $(@F) 提取目标的文件名。IRIX make 和 smake 允许您在 Makefile 的依赖项行上使用 $$(@F)。GNU make 仅允许在操作子句中使用它,但它确实允许您使用模式匹配宏来获得相同的效果(比较列表 2 和 3 中的 IRIX 和 Linux Makefile,可以在 ftp.linuxjournal.com/pub/lj/listings/issue82 中查看)。

Linux 中还有一些额外的库目录,它们包含可能需要添加到 Makefile 的文件

  • X 库位于 /usr/X11R6/lib 中

  • X 头文件位于 /usr/X11R6/include 中

  • OpenGL 位于 /usr/include/GL, /usr/X11R6/GL 中

如果您的编译和链接步骤是分开的,请确保 CFLAGS 具有 -c。否则,GNU 默认尝试在一个步骤中完成。如果您在编译时收到“storage size not known”错误,请尝试从命令行中删除 -ansi 说明符。

您可以为 IRIX 和 Linux 使用相同的 Makefile,使用 xmkmf 在 IRIX 和 Linux 中生成特定于体系结构的 Makefile。

现在让我们将注意力从 Makefile 转移到 C 源代码。作为一般规则,SGI 编译器比 GNU 编译器更宽容。期望您的代码必须更接近标准才能通过 GNU 编译器。

以下是我们在移植到 Linux 时从 IRIX 代码修改的项目。

1. Bstring.h、bcopy 和 bzero 不是 POSIX。我们用它们的 POSIX 对等项替换了它们

bstring.h -> string.h
bcopy(a, b, nbytes) -> memcpy (b, a, nbytes)
bzero(a, nbytes) -> memset(a, 0, nbytes)

GNU 在 string.h 而不是 bstring.h 中确实有这些,因此这不是绝对必要的(尽管如果您不这样做,您需要有条件地包含 “bstring.h”)。请注意,IRIX 将 “select” 保留在 bstring.h 中,而 Linux 将其放在 unistd.h 中。

2. 以下是一些生成警告的内容。由于 GNU 编译器比 IRIX 更健谈,因此我们修复了这些问题

  • Main 应该返回 int。

  • 注意未初始化的变量。

  • 防御性地使用括号。

  • printf/scanf 中的格式说明符:参数与变量类型不匹配 -scanf 使用错误的类型可能会给您带来麻烦

  • sprintf(astring, "") -> astring[0] = 0;

  • 2D 数组初始化器需要大括号才能符合 ansi -int a[2][2] = { {1, 2}, {3, 4} };

3. POSIX 中没有 “recalloc”

  • 用 realloc 替换 recalloc,并使用 memset 将额外的内存清零。

4. 添加 NULL 时区作为 gettimeofday 的第二个参数
  • gettimeofday 不是 POSIX,但 SGI、Linux 和 NT 都接受它,并将时区作为第二个参数。

5. 将 sginap 更改为 POSIX usleep
  • sginap (百分之一秒) -> usleep (百分之一秒 * 10000)。

6. Linux “select” 递减 timeval 结构
  • 一些其他 UNIX 系统的文档说他们将来可能会修改 timeval:对于 Linux,未来已来临

  • 不要在连续调用 “select” 时使用相同的 timeval 结构,而不刷新它。

7. 为 Linux 添加 __ANSI_C__ parseargs.h
  • Parseargs 是一个参数解析库,最后由 Brad Appelton 在 1991 年维护。它支持多个平台,并尝试找出每个系统上可用的内容(有点像 GNU configure 实用程序的原始前身)。

8. 涉及字体管理器(fmclient.h 和 fmfonthandle 类型的变量)的代码被注释掉了——我不确定这是否是 IrisGL 的遗留物。

9. Ulocks.h 被注释掉了。可能是另一个 IrisGL 遗留物?

10. 涉及 sproc(SGI 的轻量级进程模型)的代码已迁移到 POSIX 线程 (pthreads)

  • 在 Linux 编译中使用 -D_REENTRANT。

  • 在链接步骤中添加库 -Lpthread。

  • 如果在 X 应用程序中使用线程,请使用 XInitThreads()。

  • 从 LinuxThreads 页面获取 gdb 的补丁。

  • 请注意,LinuxThreads 库将其自己的用途用于 SIGUSR1 和 SIGUSR2。如果您的应用程序使用这些信号,您可能需要查看其他机制。在最坏的情况下,使用 Linux clone 函数。

11. 用于手柄和触摸屏的串行端口处理迁移到 POSIX 接口。

  • 有关概述,请参阅 man termios。

12. IRIX 有一个高速 malloc 库 -lmalloc。
  • Linux 上没有高速 malloc 库(据我所知),因此 lmalloc 被删除。

13. Fabs、fsqrtf、fmod 不在 math.h 中,但在库中。
  • Fabs 是 POSIX,fsqrtf 不是

  • 我们建议简单地使用 sqrt

  • fmodf

  • 使用 -D_BSD_SOURCE 来访问 M_PI 等。

14. fabsf -> Linux 中的 fabs。

15. fsin -> Linux 中的 sin。

16. fcos -> Linux 中的 cos。

17. fceil -> ceil & 以 double 类型进行数学运算。

18. 标头文件中的套接字级别差异

  • IRIX unistd.h 中的 ioctl,Linux 在 sys/ioctl.h 中。

  • IRIX sys/sockio.h 中的 SIOCGIFCONF。

19. fcntl FNONBLK --> IRIX 和 Linux 的 POSIX O_NONBLOCK。

20. sigsend -> IRIX 和 Linux 的 kill

21. Linux 中有一个 sysconf shell 命令

  • 我们的空间数据库尝试获取 RAM 大小以了解它可以负担多少内存。

  • 在 Linux 中,请改用 /proc/meminfo 的内容。

22. 非 POSIX IRIX flock_t 与 Linux struct flock

  • 在 Linux 上使用 “struct flock”。

23. Linux mmap 不会自动增长。
  • 自动增长是标准的可选部分(IRIX 实现了它,但 Linux 没有)。

  • 在 mmap 之前用零填充文件到正确的大小。

24. prctl PR_TERMCHILD 变为 PR_SET_DEATHSIG。

25. POSIX 信号处理与我们使用的 BSD 信号处理不同。

  • 迁移到 POSIX;有关详细信息,请参阅 man sigaction。

26. IRIX oserror Ý POSIX errno。

27. Linux 多进程控制没有 sysmp 命令。

28. 2.3 (Mongoose) 中没有 Performer arenas

  • 所有 performer 都在一个进程中。

  • Arena 指针将为 NULL。

  • pfMalloc 和公司从堆栈中分配内存。

29. xtouchmouse(一种触摸屏驱动程序,可将触摸屏数据转换为 X 鼠标事件)有效,但无法在 KDE 根窗口上进行按钮按下操作,只能在常规窗口上进行。

  • 根窗口上不匹配的按钮按下和释放会导致窗口管理器挂起——感谢 John Mellby 解决了这个问题

  • 我们选择不使用内置的触摸屏驱动程序支持,以便我们可以在该级别与 IRIX 系统互操作。有一次,当我们集成 Future Scout 与在没有编译器的 SCO PC 上运行的 FBCB2 时,我们能够将 SCO 的显示发送到监视器,并将该监视器的触摸屏插入 IRIX 系统。xtouchmouse 的触摸屏输入生成了 X 事件,这些事件被发送到 SCO 系统,使我们能够与之交互。

30. 触摸屏校准程序,用于计算从触摸屏设备坐标到 X 坐标的映射,已从 IrisGL 转换为 OpenGL。
  • 如果您仍然有 IrisGL 代码,请尝试 SGI 的 toogl 程序来帮助进行转换。如果您想抑制窗口边框,您可能必须转换为 Motif。

31. 用 X 窗口系统替换 Iris GL 窗口管理。以下是一些 SGI 编译器只是让我们逃脱惩罚的事情,或者是不同版本 Motif 的功能
  • 为了使用 glwMDrawingAreaWidgetClass(而不是 glwDrawingAreaWidgetClass),您需要包含一个定义 __GLX_MOTIF 的库,以确保包含 Motif 库,或者如果不需要 Motif 功能,只需使用 glwDrawingAreaWidgetClass。“M” 表示 Motif,并且具有 Motif 的 XmPrimitive 小部件类的附加功能。

  • 在 XtPopup 中,您不能将 NULL 用于第二个参数。请改用 XtGrabNone。此参数指定应约束 X 事件的方式。

  • 使用 X 工具包 Intrinsics 方法而不是 X Lib 方法来设置窗口,以便创建无边框窗口。无边框窗口需要使用资源来让窗口管理器知道它不需要管理边框。使用 X Lib 方法无法访问这些资源。

  • 删除 IrisGL device.h。

  • 在 Makefile 中使用 -lMesaGLw 而不是 -lGLw 作为库。此库具有 OpenGL 绘图区域小部件。

  • 请注意,当前的(截至 2000 年 2 月)alpha TNT2 驱动程序中似乎存在一个错误,该错误导致 glColorMask 无法工作。如果您现在正在处理这个问题,我建议切换到更新的 XFree86 4 版本和最新驱动程序。

32. 最后,如果您确实需要有条件地编译某些内容,则有一个自动定义的符号用于 #ifdef(无需 -D)
#ifdef __linux__
    Linux specific stuff
#else
    IRIX specific stuff
#endif /* __linux__ */
我们模拟器处理的大部分数据都不是问题。许多配置文件都是 ASCII 格式,只需要进行少量调整(例如环境变量)即可同时在 IRIX、Linux 和 NT 上使用。对于 Mongoose,加载器为我完成了字节交换,因此我在 big-endian SGI 还是 little-endian Intel 机器上并不重要——相同的视觉模型都可以工作。

在少数情况下,endianness 成为了问题。我们使用美国陆军地形工程中心生成的 Compact Terrain Database (CTDB) 文件。我们使用的数据库文件是二进制文件。幸运的是,它们有 big-endian 和 little-endian 版本,具有不同的后缀。我们可以通过将后缀存储在运行时评估的环境变量中来告诉系统使用哪个。

一旦我们编译了所有内容,运行时出现了一些意外。GNU 编译器的运行时错误帮助我们找到了在释放内存后访问内存的情况。IRIX 有时会让您访问内存,即使您已释放它(请参阅 IRIX mallopt 函数以了解其内存分配器的不同设置)。Linux 中有一个 mallopt 函数,尽管手册页没有列出它。您必须使用 GNU “info” 页面来了解它。GNU C 库的另一个可用于跟踪内存错误的功能是 mcheck。它也在 info 页面中详细说明。

第二件事是串行端口设备文件在 IRIX 和 Linux 之间具有不同的名称

IRIX: Linux: ---- ------/dev/ttyd1 /dev/ttyS0 串行端口一/dev/ttyd2 /dev/ttyS1 串行端口二... ...

手柄校准程序根据体系结构决定,并查找 $ARSI_GRIP_CALIBRATE_PORT 的值作为可选覆盖。

曾经有一个案例,我们在一个函数中从局部变量得到了不同的结果。我们有一个字符串紧挨着一个长整型数组。代码中包含一个错误,导致字符串溢出。在 IRIX 系统上,代码运行良好。但在 Linux 系统上,则不然。经过进一步调查,我们发现字符串溢出覆盖了长整型数组中的字节。在 big-endian 系统中,这些字节恰好是零(使得系统看起来工作正常),而在 little-endian 系统中,它们是非零的,导致字符串看起来被损坏。(吉姆·金因发现这个问题而获得赞誉。)

最后,Mongoose 2.3 自带的 Flight loader 中存在一个错误。MultiGen-Paradigm 表示将在下一个版本中修复该错误。(感谢凯伦·戴维森追踪到这个问题。)

状态

目前,您可以在 Paradigm 的 Atlantis 数据库中驾驶、射击武器并与 DIS 实体互动(感谢约翰·鲍尔斯和洛瑞·希勒帮助处理 CTDB 文件)。该系统可以与在 Windows NT 下的另一台主机上运行的 VAPS 面板通信(感谢 Kay Chao、Kathy Jones 和 Vince Golubic)。

之后

自从这项工作完成以来(2000 年第一季度),已经发生了很大的变化。ACRT 现在可以使用更新的高级体系结构 (HLA),它是 DIS 的继任者。SGI 继续为 Linux 世界做出贡献,包括发布 OpenGL 的参考实现。新版本的 Mongoose 已经发布,我们现在正在试用它。当您读到这篇文章时,2.4 版本应该已经发布,统一了 IRIX 和 Linux 发行版。nVidia 已经推出了新的显卡和 Linux 驱动程序。期待已久的 XFree86 4 版本已经发布,可以直接渲染 OpenGL。(之前的版本在必须先渲染到 X,然后再渲染到屏幕时,性能会受到影响。)Motif 现在在 Linux 系统上是免费的。

我们用于软面板的 VAPS 工具的 Linux 版本预计将于 2001 年第一季度发布。

资源

乔治·科哈奇克 哀悼 Lisp 机器的逝去,并在雷神公司工作。可以通过 g-koharchik@raytheon.com 与他联系。

布莱恩·罗伯茨 于 1995 年加入雷神系统公司,成为可视化和模拟技术团队的全职成员。他的主要职责包括为可重构视觉模拟的设计和开发新软件。他现在在德州仪器公司工作。

加载 Disqus 评论