NetWare 可加载模块 (NLM) 是在 Novell NetWare 服务器上运行的程序。NLM 成为 NetWare 操作系统的一部分。您可以在服务器运行时加载和卸载 NLM。
“官方”的 NLM 编译器是
(顺便提一下,NetWare 5 也可以加载 32 位 DLL,可以使用 Microsoft Visual C++、Borland C++ 和其他 Windows 编译器构建。有关更多信息,请参见 http://developer.novell.com/ndk/dllcomp.htm)
本文档介绍了如何在 Linux(以及可能的其他 Unix 系统)下开始 NLM 开发。请注意,这个项目还处于非常早期的开发阶段,因此很多东西可能无法按您的预期工作。
本文档假设您熟悉 Novell NetWare,并且至少具备编写 NLM 的基本知识。有关编写 NLM 的更多信息,请参见 Novell 的开发者站点 http://developer.novell.com/。您还应该具有使用 Unix 和 C/C++ 编程以及 GNU CC 的经验。您可以在 http://www.linuxdoc.org/ 找到有关此主题的很多信息。
据我所知,目前使用 gcc 进行 C++ 开发是不可能的,除非有人至少移植 gcc 软件包中的 libstdc++ 和 libgcc 库。
其他可能非常有用的文档包括
版权所有 (c) 2000 Martin Hinner, < martin@hinner.info>, http://martin.hinner.info。
本 HOWTO 是自由文档;您可以根据自由软件基金会发布的 GNU 通用公共许可证条款对其进行再分发和/或修改;可以是许可证的第 2 版,或(由您选择)任何更高版本。
发布此文档是希望它有用,但不作任何担保;甚至不包含对适销性或特定用途适用性的暗示担保。有关更多详细信息,请参见 GNU 通用公共许可证。
您可以写信至 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA,以获取 GNU 通用公共许可证的副本。
您可以通过 martin@hinner.info 联系我。我欢迎任何建议和更正,但请在提问之前,先尝试在互联网上搜索。您还应该查看我的主页 (http://martin.hinner.info/),以获取任何更新或其他信息。请注意,我非常忙于我的其他项目(如 汽车诊断, 基于 ARM 的微处理器开发工具),并且我有一份全职工作(我在 SECONS Ltd. 和 Fintera Ltd. 工作)。
您需要安装和配置以下内容以进行 NLM 开发
您可能还想从我的 FTP 站点下载 nlm-examples 软件包:ftp://ftp.penguin.cz/pub/users/mhi/nlm/ 或 ftp://ftp.funet.fi/pub/mirrors/ftp.penguin.cz/pub/users/mhi/nlm/。
让我们从 NetWare 服务器开始。您可以使用 NetWare 版本 3.X、4.X 或 5.X。可以从 Novell Inc. 订购 NetWare 5(或 5.1)三个用户“演示”版本,只需几美元。不要被“演示”这个词迷惑,它是功能齐全的 NetWare,只是它限制为三个用户。顺便说一下,此许可证可以在线升级到五个用户,无需任何费用。您也可以尝试向您当地的 Novell 合作伙伴索取演示 CD(它们可能是免费的)。
您需要重新编译内核,启用“IPX 协议”和“NCP 文件系统支持”选项。如果您正在使用 NDS,请不要忘记对“NDS 身份验证支持”选择“是”。然后,您必须配置 IPX 协议并挂载您的 NetWare 服务器卷。确保您已安装 ncpfs 软件包!我使用这个脚本
#!/bin/sh ipx_interface delall ipx_interface add -p eth0 802.2 120 # Frame Ethernet_802.2, ipx net num 120 insmod ncpfs # I have NCPfs compiled as module ncpmount -U admin -S elf -P XYZ /nw # mount all ELF's volumes as /nw
有关配置 IPX 和 NCPFS 的更多信息,请参见 IPX-HOWTO。
我认为所有现代 Intel x86 Linux 都包含 gcc,它可以生成 ELF32/i386 目标文件。如果您使用的是较旧的 Linux 发行版,它可能使用 a.out 格式而不是 ELF。如果您的 Linux 没有使用 ELF,请获取并安装较新的 gcc。
nlmconv(1) 实用程序将目标文件链接到 NLM 格式。它是 GNU binutils 的标准部分,但不幸的是,它不包含在当前的发行版(RedHat、SuSE、Debian...)中。从 ftp.gnu.org 获取 binutils 源代码并编译它们,或者直接使用我的 nlm-kit 软件包中预编译的 nlmconv。
我的 nlm-kit 软件包可从 ftp://ftp.penguin.cz/pub/users/mhi/nlm/ 获取。它包含 NLM 开发所需的文件。解压它并运行 "make all"
和 "make install"
。它将创建目录 /usr/nwsdk/
并安装所有导入文件、目标文件和 nlmimp(1) 实用程序。
获取 NDK 很简单
您需要 NDK 中的这些文件(所有文件都可以在 http://developer.novell.com/ndk/clib.htm 在线获取
遗憾的是,上面提到的所有文件都是 InstallShield Win32 可执行文件。您必须找到一台 Windows 机器来解压它们,然后将包含文件复制到 /usr/nwsdk/include/
,并将文档/示例复制到您想要的任何位置。Novell 许可证不允许我使用 nlm-kit 分发包含文件或文档。
由于 NDK 包含文件在 Linux 下无法工作,因此您需要在 nlm-kit-X.Y/ 目录中键入 "make install-include" 来手动修补它们。
您可以直接访问 NetWare 服务器控制台(键盘和显示器),使用 rconsole.exe(来自 dosemu),或使用 telnetd.nlm/Xconsole(您需要 X 服务器才能使用)。
像往常一样,我们将从著名的 “Hello world” 程序开始。hello.nlm 的源代码在 nlm-samples 软件包中提供。您可以从 ftp://ftp.penguin.cz/pub/users/mhi/nlm/ 下载它。
#define N_PLAT_NLM /* Define dest. platform */ #include <nwconio.h> /* ConsolePrintf */ int main (int argc, char **argv) { int i; ConsolePrintf ("\rHello world!\n\n"); /* print on system console */ ConsolePrintf("Arguments:\n"); /* all arguments */ for (i=0;i<argc;i++) ConsolePrintf("argv[%u]=\"%s\"\n",i, argv[i]); return 0; /* exit NLM */ }
# # hello.def - NLM Header definition file for nlmconv(1) # Copyright (c) 2000 Martin Hinner <martin@hinner.info> # # define startup object files INPUT hello.o INPUT /usr/nwsdk/lib/prelude.o # clib startup code # all imported functions and import lists IMPORT @/usr/nwsdk/imports/clib.imp # Functions in CLIB.NLM IMPORT @/usr/nwsdk/imports/threads.imp # Functions in THREADS.NLM # NLM header... OUTPUT hello.nlm # output file TYPE 0 # Ordinary NLM VERSION 1,0,0 # Version 1.0 COPYRIGHT "Copyright (c) 2000 Martin Hinner <martin@hinner.info>" # (c) ... DESCRIPTION "Simple 'Hello world' NLM module." # title of nlm SCREENNAME "System Console" # Default screen name MODULE CLIB,THREADS # req'd modules
# makefile for "hello world" NLM CC = gcc CFLAGS = -Wall -O2 -g -I/usr/nwsdk/include/ -nostdinc -fno-builtin -fpack-struct hello.nlm: hello.o hello.def nlmconv --output-target=nlm32-i386 -T hello.def hello.o: hello.c $(CC) $(CFLAGS) -c hello.c
您必须将这些参数传递给 gcc
将 hello.nlm 复制到您的 NetWare 服务器上的 SYS:\SYSTEM 目录。然后,在系统控制台上,键入 “load hello.nlm”。如果一切顺利,您应该看到 NLM 版本信息、版权消息和 “Hello world”。
NLM 头文件包含 nlmconv(1) 的信息。每行包含一个选项或指令;“#” 之后的所有内容都是注释。本章介绍了所有选项和指令。
本章尚未完成,抱歉。
语法:
AUTOUNLOAD
语法:
CHECK <检查过程名称>
此指令指定当使用 UNLOAD 服务器控制台命令卸载 NLM 时要执行的函数。如果此函数返回零,则可以卸载 NLM,否则 NLM 尚未准备好卸载。
示例:
CHECK CheckUnload
语法:
CODESTART <映射文件代码起始偏移量>
映射文件起始偏移量可以是十进制或 Xhex。
语法:
COPYRIGHT ["版权字符串"]
版权字符串在加载 NLM 时显示在服务器控制台屏幕上。如果未使用此选项,则不显示版权信息。
示例:
COPYRIGHT "Copyright (c) 1998 ABC Inc."
语法:
CUSTOM <自定义数据文件路径>
语法:
DATASTART <映射文件数据起始偏移量>
映射文件数据起始偏移量可以是十进制或 Xhex。
语法:
DATE <月, 日, 年>
语法:
DEBUG
此指令告诉 nlmconv(1) 在 NLM 文件中包含调试信息。
示例:
DEBUG
语法:
DESCRIPTION "NLM 描述字符串"
语法:
EXIT <退出过程名称>
语法:
EXPORT <符号列表>
EXPORT @<符号列表文件>
语法:
FLAG_OFF <十进制数字>
语法:
FLAG_ON <十进制数字>
语法:
HELP <帮助文件路径>
语法:
IMPORT <符号列表>
IMPORT @<符号列表文件>
语法:
INPUT <目标文件> [, <目标文件> [, ...] ]
INPUT @<目标列表文件>
此指令列出要链接的输入 ELF (.o) 目标文件。您也可以在列表文件中列出目标文件,每个目标文件占一行。
示例:
INPUT @objectfiles.txt INPUT main.o INPUT /usr/nwsdk/lib/prelude.o
语法:
MAP [映射文件名]
语法:
MESSAGES <消息文件路径>
语法:
MODULE <自动加载 NLM 列表>
语法:
MULTIPLE
语法:
NAMELEN <十进制数字>
默认值为 31。零表示无限制。
语法:
OS_DOMAIN
语法:
OUTPUT <目标文件名>
语法:
PATH [搜索路径;...]
用于以下 CUSTOM、HELP、INPUT、MESSAGES、SHARELIB、STAMPEDDATA 和 XDCDATA。
语法:
PSEUDOPREEMPTION
语法:
REENTRANT
语法:
SCREENNAME "初始屏幕名称 (CLIB)"
语法:
SHARELIB <共享库路径>
语法:
STACK <堆栈大小>
语法:
STACKSIZE <堆栈大小>
语法:
STAMPEDDATA "戳记" <数据文件路径>
戳记最多 8 个字符。
语法:
START <启动过程名称>
默认值为 _Prelude。
语法:
SYNCHRONIZE
语法:
THREADNAME "初始进程名称 (CLIB)"
语法:
TYPE <版本>
此指令指定要生成的 NLM 文件的格式(NLM、LAN、DSK、NAM)。有效值是
示例:
TYPE 0
语法:
VERSION <主版本号>, <次版本号> [, <修订号>]
版本信息在 NLM 加载时显示在服务器系统控制台上。主版本号和次版本号可以是 0 - 99。修订号可以是 0 - 26 (“a” - “z”),并且是可选的。版本指令是必需的。
示例:
VERSION 1,5
语法:
XDCDATA <XDC 数据文件路径>
消息文件包含(正如您所猜测的)由 NLM 生成的文本消息。您可以使用 DOS 程序 MSGLIB.EXE 和 MSGMAKE.EXE 创建它。我不知道任何类似的 Unix 实用程序。抱歉,您将不得不使用 dosemu 或 DOS 机器 :-(
帮助文件包含用于 NWSNUT 用户界面库的帮助。没有已知的 Linux 实用程序用于创建帮助文件。您必须使用 DOS 程序 HELPLIB.EXE,该程序可从 Novell 开发者站点获得。
XDC 文件由 NetWare 5(或 SMP NetWare 4.x)使用,并存储有关对称多处理 (SMP) 的信息。您可能不需要它们。至少现在不需要 :-) 同样,没有 Unix 实用程序用于创建 XDC 文件,您将不得不使用 MPKXDC.EXE 程序(也可在 Novell 开发者站点上获得)。
(待办)
(待办)
程序 nlmimp(1) 是我的 nlm-kit 软件包的一部分。 (待办)