A multi-tasking operating system for the x86 32-bit PC architecture

Bug List
Contact us

Overview of XOS

This page provides a general description of XOS with emphasis on the changes in the current major version (version 4).

XOS is a general purpose protected mode operating system for the x86 32-bit PC architecture (also referred to as IA-32). XOS was originally written when the only available x86 32-bit PCs had a 16MHz 80386 CPU and, at most, 1MB of RAM, and was designed to be usable in that environment. To keep it small and fast, the kernel was written in assembler, although most of the associated user mode programs were written in C. The available execution environment has changed quite a bit since then and XOS has been expanded and we have added new features such as additional CPU power and memory have become available. It still has a strong focus on efficiency and has NOT grown uncontrollably as have most other systems.

The current version of XOS can be run in as little as 2MB (yes, that's MB) of RAM, although performance, especially with modern large disks, is much better with at least 10MB. XOS does use a disk cache and, with large disks, this should be on the order of 10 to 20MB. XOS will use up to 4GB (minus the hardware space). XOS does not support general virtual memory, mainly because it has never been needed for the applications where XOS has been used. It supports "virtual allocation", which is mainly used to allocate stack space automatically.

Most XOS programs are small. Even the ported OpenWatcom C compiler loads in about 750KB. Real graphics mode applications run in a few MB.

XOS provides a flexible method for loading extensions to the kernel which are known as LKEs (Loadable Kernel Extensions). This includes device drivers but is not limited to that. Most device drivers are implemented as LKEs. A mechanism is provided for loading LKEs into a temporary RAM-disk at boot time using the bootstrap before switching to protected mode. This allows even the drivers for the boot disk to be loaded as LKEs.

XOS provides a flexible system for allocating memory, allowing multiple discontiguous blocks of allocated memory.

XOS provides an advanced signal (as the term is used with Unix) capability which provides multiple priority levels. It is patterned after a multi-level hardware interrupt system and queues signals until all higher priority signals have been delivered and dismissed.

XOS supports multiple execution threads in a process, both "heavy weight" preemptively scheduled threads and "light weight" non-preemptively scheduled threads (sometimes called fibers).

XOS supports both blocking and non-blocking IO for most devices. The only exceptions are the console display (which is CPU bound) and the sound (HDA) device which uses a different continuous stream API.

Version 4.5.0 is basically a development release. We have taken so long to get a "final" version ready that we decided to release what we have, even though it is not really complete. We hope to have a more complete version ready in a few months.

There are a number of major changes in this version:

Version 4.5.0 of XOS is NOT binary compatible with previous versions. This is mainly due to the change to a flat memory model and to a small number of other API changes.

The internal structure of XOS has been significantly changed, mainly to allow writing kernel level code in C. This is a major departure from the previous XOS philosophy. It is now felt that with current generation C compilers and current CPU speeds, there is no need to worry that much about the efficiency of the kernel code. In the current version about 10 to 15% of the kernel code (both resident and LKE) has been rewritten in C. The eventual goal is to rewrite virtually all of the kernel level code in C.

Only the flat memory model is supported. The previous version of XOS provided extensive support for segmented memory, supporting both 16-bit and 32-bit segments. Over time it has become obvious that this is not very useful. Other than supporting a few very old DPMI programs, there is no demand at all for support of 16-bit segments. There is also virtually no need to use multiple 32-bit segments. Given that almost all other systems do not support any kind of segmentation (including the 64-bit x86 architecture), this change was inevitable.

DOS compatibility is NOT supported. There is limited support for execution in V86 mode, which is currently only used to call VESA BIOS real mode functions for graphic display modes. Given that there is almost no demand for the support of DOS programs, this change was also inevitable. There are still enough hooks in place that support for DOS compatibility could be put back in without too much work if necessary.

DOS style single character disk names are not supported. Such single character names can still be assigned with the assign command but are not supported as a specical case as in prevous versions.

There have been some signficant changes in the API for searching directories. This was done mainly to simplify the kernel code by removing some features that were never fully implemented.

A VGALib style graphics library is included, which can be used to create programs using a graphical user interface. This includes support for PCL3GUI "win-printers". The intent is eventually to use this library to implement a graphics server that will implement a GUI desktop.

USB 2.0 is supported. There are low level drivers for the EHCI, UHCI, and OHCI controllers. There are high level drivers for mass storage devices (bulk transfer only protocol), keyboards, and mice, and there is a general purpose bulk transfer/interrupt driver that has been used with a LabJack and other custom devices. XOS can be booted and run from a USB disk.

The HDA sound interface is supported.

Multiple pre-emptively scheduled execution threads per process are supported.

Floppy and optical disks are not supported. This is only due to lack of the resources needed to update the drivers to support the new internal structure of this version. We hope that this can be added soon.

Environment strings are not supported. Again, this is due to a lack of resources. None of our current projects require environment strings (there is a simple kluge in the command shell to provide a command search list), but this will be corrected soon.

IP networking is not supported. This is a major embarrassment and is also due to lack of resources to update the drivers. Finishing this is currently a very high priority as it is needed for a planned project.

Shared memory is not supported. No current projects need this, so it has not been implemented in the current version. The hooks for supporting it are still there and it will probably be added reasonably soon.

Serial ports (COM ports) are not supported. The previous version had extensive support for several types of serial ports but, so far, we have not needed this in the current version. The basic class level support is still there, but none of the low level drivers have been updated. This will be done if we ever need a serial port again.

Serial and PS2 mice are not supported in this version. It would be fairly simple to update this but we don't see much reason to do that. USB mice are supported.

This version (4.5.0) represents a major rewrite of the previous version. It adds many new capabilities and drops a few features (mainly DOS compatibility and support of multiple segments). There are also a couple of major unfinished areas (support for IP networking and for floppy and optical disks). These should be available in a future version soon.

Home | Legal | Download | Install | FAQ | Bug List | Contact Us