Initially, Novell published a development toolkit for NLM programming including kernel API documentation and a
C compiler (
Watcom), but third-party support for the NLM executable function was very limited. In early NetWare versions (prior to v4.x), all processes were executed in the
kernel address space, without specific memory protection. It was therefore possible for
bugs in NLMs to overwrite the kernel's or other NLM's address space and ultimately crash the server — in the mainframe-derived Novell terminology, this was known as an ABEND or
ABnormal END. Moreover, NetWare used a non-preemptive, or
cooperative, multitasking model, meaning that an NLM was required to yield to the kernel regularly. An NLM executing an
infinite loop, for example, could therefore not be stopped. In NetWare v4.x, Novell introduced a limited form of memory protection, which was extended to
Protected Address Spaces in NetWare v5.x. Through these mechanisms, properly-coded NLMs can be loaded into their own address space, and mis-behaving NLMs can be prevented from compromising the kernel integrity. ==Compilers==