I'm looking for existing, old operating systems which can run programs in 286 16-bit protected mode. (Please note that in this question I'm not interested in 16-bit programs for the 8086 and 80186, or running programs in real mode or virtual 8086 mode.)
I already know these:
- Windows 3.0 and 3.1 in standard mode can run GUI NE .exe programs designed for Windows 3.x. Later versions of Windows also support this for compatibility. Wine can also do it. As a cool feature, Windows 3.0 is able to run the same program in real mode as well, so that Windows 3.0 and its programs can run on a computer with an 8086 CPU, so a 286 CPU is not required.
- OS/2 1.x can run both GUI and text mode NE .exe programs designed for OS/2 1.x. Later versions of OS/2 also support this for compatibility.
- Some DOS extenders running under DOS can run both GUI and text mode NE .exe programs designed for that DOS extender.
- Some operating systems (such as Windows 3.x, and probably OS/2 1.x or later) can start running a DOS program in real mode or virtual 8086 mode, and they provide an API (such as VCPI or DPMI) for the program, using which the program can switch to 16-bit protected mode.
- Xenix can run 16-bit x.out programs designed for Xenix 16-bit. 32-bit support has been introduced in Xenix 2.2, and later versions of Xenix also support 16-bit programs for compatibility. AT&T Unix System V/386 Release 3 (SVR3) and Release 4 (SVR4) can also run these Xenix 16-bit programs, if the Xenix compatibility package is installed.
As far as I know, Unix systems other than Xenix in the 1980s, before they gained support for 386 and 32-bit protected mode, ran 16-bit programs (and also the operating system) in real mode rather than 16-bit protected mode. Please correct me if I'm wrong.
Is there anything else?
modify_ldtto create a 16-bit segment, and far jump to it. I tested and it works. You need theX86_16BITconfig option enabled in the kernel, but Ubuntu stock kernels have it enabled by default. I believe WINE uses this. Of course, I don't think any 16-bit binary formats are supported by the kernel, so you'd have to write your own loader.