andreww591
I hadn't included the R1000 emulator because originally they emulated it at the logic gate level and it literally took a week to boot. It looks like they now have a more traditional instruction-level emulator that is supposedly comparable to the real hardware in speed, so I guess I should try to install that.
I think a major reason that no AS/400 emulator exists is because people are afraid of IBM sending them a C&D, although I'm not sure if IBM would care all that much if somebody wrote an emulator for IMPI AS/400s. Those haven't been supported for well over 2 decades AFAIK.
I do know somebody is slowly working on S/32 and S/34 emulators, but they haven't shared either because both apparently are still somewhat flaky. Hopefully they release them at some point. The entire midrange/office computer category is very under-preserved. The only such machines represented in the OS museum currently are HP3000 and S/3.
I've never seen images anywhere for NonStop, VOS, or NIROS, nor do emulators exist for the original hardware they ran on. Later versions of NonStop and VOS run on x86, but I'm not sure if they run under virtualization.
Rather than just another name for Domain/OS, Domain/IX was actually a Unix compatibility layer that was an add-on product for pre-SR10 AEGIS versions, with SR10 merging it into the base OS (pre-SR10 had no built-in Unix compatibility).
AFAIK even though it's usually associated more with HP-UX, VUE actually originated at Apollo before HP bought them, although I'm not sure if they ever actually released it before the acquisition.
It sucks that there's no good way to port Linux directly to WASM UML-style, since WASM insists on implementing memory safety at the bytecode level with no way to bypass it. There is a very limited port, but it doesn't support paging. Not all the emulators would run on a full-featured WASM port if one existed, but that could be dealt with by just using user-mode QEMU to run whichever ones are x86-only.
All of those OSes you mentioned are included. BTRON isn't a single OS, but a small family of OSes based on a common specification (just like Unix is); the OS museum includes the demo 1B/V3 and Chokanji 4. The FOSS BTRON implementation you're thinking of is almost certainly B-free/EOTA, which is also included. EOTA never actually implemented BTRON proper before it got abandoned. It basically just ended up being like a Unix based on an ITRON kernel.
Documentation for some OSes is included, although I've focused more on user/administrator documentation over developer documentation. It would probably be a good idea to include developer documentation though.
I've thought about making individual images available for download, but many of them are dependent on particular emulator versions and/or the common launch scripts so it isn't quite that simple.
I'm not aware of any fully working TENEX images unfortunately. There are partial images, but last time I checked they weren't in a state that was even remotely usable.
I'm also planning to add earlier versions as well as the later forks at some point.
Nested virtualization for certain x86 OSes running in QEMU is supported, although you will have to enable it manually (VirtualBox has a checkbox for this in its settings). For VMs that support it, the QEMU launch scripts will automatically use KVM if available and fall back to TCG if nested virtualization isn't enabled.
And even though there weren't very many 286 protected-mode OSes there were still several of them, with the OS museum including:
1B/V3 (a Japanese OS with an object-oriented desktop and extensive compound document support, part of the TRON project) Microport SysV/AT Prologue TwinServer (an obscure French OS that originated on 8080/Z80) Multiple versions of OS/2 1.x QNX 2.21 QNX 4.0 IBM PC XENIX
1B and TwinServer are especially notable since they were maintained as 286 OSes long after x86-32 machines had made 286 machines completely obsolete; the last versions apparently being in 1997 for 1B and 2002 for TwinServer (although the last version of TwinServer has some limited support for 32-bit code, it can still run on a 286)
Of course, your custom kernel will still have to have some of its own code to support core platform/chipset devices, but LKL should pretty much cover just about all I/O devices (and you also get stuff like disk filesystems and a network stack along with the device drivers).
Also, it probably wouldn't work so well for typical monolithic kernels, but it should work decently on something that has user-mode driver support.
If you're going to rewrite significant parts of the kernel, you might as well do what I've been doing and try to write what amounts to a better Linux than Linux that tries to maintain compatibility, but moves beyond the rather limiting conventional Unix architecture. The conventional Unix architecture was fine on a something like a 70s/80s-era PDP-11/VAX, but in the modern world its limitations have been apparent for quite some time.
What I've been working on is an OS very similar to QNX Neutrino in terms of general architecture, but with a somewhat different IPC protocol layering that reduces the number of user-visible primitives and allows for more consistent management of security. Most of the functionality of the system will be implemented in user-level server processes that export their services through special filesystems, with the only special/irregular parts of the system being the microkernel, the process manager (which also contains the core VFS and memory filesystems since these will be tightly linked to the process model), and the base syscall library (vaguely akin to the vDSO under Linux). Literally everything else will just be a regular process. It's not a "Rust OS" as such, as there will still be some C (for instance, the microkernel, which was forked from an older version of seL4), although it will have a fair bit of Rust code.
IMO the issues with Linux are mostly due to a combination of poor/ad-hoc extensibility and the development model that's way too decentralized in some places but excessively centralized in others. The architecture I'm going with will allow for more experimentation, since adding functionality to it will typically just be a matter of adding a regular user program (or a plugin for a regular user program), and much of the system will be based around standardized filesystem-based RPC protocols (generic tooling for implementing RPC interfaces will of course be provided). Therefore it would be easier to maintain experimental functionality in a separate repository and merge it into the base system later on.
Currently it's still quite preliminary, and it only runs some hardcoded tests built into the process server, although despite that, some developers from a major company have taken interest in it recently because of the possibility of using it as a replacement for QNX both in embedded systems and development workstations. I'm working on the VFS layer and built-in special filesystems at the moment, and hopefully should be able to get user processes running pretty soon.
Redox has several of what I consider to be questionable design/implementation decisions. I explained a couple of them in a previous comment (the limited filesystem namespace and IPC models and the lack of real-time support). Some other things include the weak implementation of locking (it uses pure spinlocks instead of something like the adaptive queue-based locking that I'm using in the process server), a rather limited heap allocator that doesn't support growing/shrinking the heap or custom object sizes for slabs (the heap allocator I'm using is a derivative of the same one that Redox uses but it's been heavily enhanced with support for shrinking/growing the heap and custom slab sizes), and the rather boilerplatey implementation of some of the libraries (for example fork() is implemented as a library function that copies process context through a filesystem-based API, but rather than having object-oriented wrappers on top of the filesystem for the various state objects that it's manipulating, the fork() implementation directly invokes open(), read(), and write() a lot).
Outside the core IPC model, the namespace model is also more limited than that of QNX; QNX allows multiple servers of a given type mounted anywhere within a namespace, whereas Redox's scheme-based namespace model only allows a single server of a given type per namespace, mounted on a fixed top-level prefix.
At the moment I have a working microkernel and an incomplete process server with a partially-implemented VFS but no support for running regular user processes. Currently I am working on some of the first special filesystems built into the process server (specifically an early log/console device at the moment).
The kernel is a hard fork of seL4 (the biggest addition at the moment is a preliminary implementation of QNX-style arbitrary-length arbitrary-address message copying); I've forked it because seL4 is focused on lower-end static embedded systems, and full verification of just the kernel isn't really particularly useful for a dynamic OS when all of the servers are unverified. The process server is written in Rust, and it's likely most of the other low-level servers will be as well, although I'm not really writing a "Rust OS" as such. Many of the basic utilities will most likely be BSD-derived, and some of the higher-level desktop-related stuff may be written in various other languages (haven't completely decided there).
IMO most of the issues with typical Unix-like OSes are more due to specific outdated architectural features rather than the Unix API or shell environment. A lot of what could be done with a completely new OS could instead be done by designing a Unix-like OS for extensibility by reducing the core API down to a small set of file calls that act as an IPC transport layer and name service and then building everything on top of that, building object-oriented wrapper libraries on top of the filesystem, and reimplementing the traditional Unix APIs outside the core filesystem ones on top of the newer APIs. Existing applications could be ported to such a system incrementally rather than having to do everything all at once or relegate them to some kind of limited "penalty box" compatibility layer (and any binary compatibility layer for Linux or other conventional Unices would integrate better into such a system than into something completely new).