For the purposes of ancient TCP/IP and NFS research, I wanted to run old SCO UNIX in a VM. I was able to run XENIX with TCP/IP earlier, but SCO’s NFS (provided, like the TCP/IP stack, by Lachman Associates Inc.) never supported XENIX.
A search of the basement yielded 5.25″ floppies of SCO UNIX 3.2.0f from June 1989 (30 years old!), which must be very close to the oldest SCO UNIX version. There was just one small problem. SCO UNIX kernels released before 1993 or so do not run on any post-Pentium processor, and also don’t run in emulators/hypervisors.
The gory details are in the old blog post mentioned above but the gist is that the SCO UNIX kernel (but not, for whatever reason, 386 XENIX) relies on more or less unspecified micro-architectural behavior of then-current 386/486 CPUs, and through instruction pipelining and/or TLB behavior manages to execute an instruction which is not mapped in the page tables, even though paging is enabled.
This misbehavior is not entirely trivial to patch, but I realized that it’s not that difficult to manually work around in the VirtualBox VM debugger.
Continue reading