In the summer of 2020, I started the very ambitious project of developing an educational operating system.
Anecdotally, I got a little sidetracked along the way as I realized that I didn’t like the hardware target for this OS. I had originally chosen a typical RISC-V based board, which included the not so education-friendly CLINT and PLIC (respectively, a timer device and a programmable interrupt controller). This led me to develop a collection of educational I/O devices, called LupIO, which I published last June! But anyway…
One of the main problems, in my opinion, with almost all previous attempts at creating educational OSes is that their authors don’t impose strict bounds to their project. Take the emblematic Minix for instance. If the first version of Minix was the educational OS, it seems like all the successive versions brought it towards being a professional, complex OS rather than an educational one. I’ve seen firsthand the same pattern multiple times in academia. Someone starts an OS for educational purposes, then realize they could use it for research too, and they start adding an endless stream of features which quickly make their OS not suitable for education anymore.
In order to avoid repeating the same pattern, I wanted to restrict my OS to a certain specification from the ground up. In the world of OSes, the first standard that seemed to carry some weight was POSIX.
The POSIX standard
In the early 1970s, pioneering engineers at AT&T Bell Labs began developing a small operating system that they called Unix. Initially written entirely in assembly language, it was rewritten a couple of years later in a new high-level language, especially developed for the occasion by the same group of engineers, called C. This programming language switch enabled Unix to be easily portable to new computer hardware, which reinforced its already growing popularity.
Because AT&T was not yet authorized to sell Unix directly as a product, Unix started to be licensed to outside parties from the late 1970s. Throughout the 1980s, many academic and commercial variants of Unix were harshly competing: amongst the strongest competitors (with their own Unix variants) were UC Berkeley (BSD), Microsoft (Xenix), IBM (AIX) and Sun Microsystems (Solaris).
The big issue for application developers was that all these variants were not quite compatible. The variants each had slightly different interfaces (different headers, different system calls, etc.) which forced developers to have to manually port their applications. This is because of this portability issue that, starting from the mid-1980s, a new standard began to be specified: POSIX (Portable Operating System Interface).
The goal was to specify a certain interface between OS and applications, which all POSIX-compliant OSes would provide. If an application used only POSIX services, then its source code would be guaranteed to be compatible with all POSIX-compatible OSes at no extra development cost.
The first version of this new standard was released by IEEE in 1998, under the name IEEE Std 1003.1-1988. This first version focused strictly on core services: process creation and control, signals, file and directory operations, pipes, C library, etc.
Originally, POSIX was divided into multiple standards. In addition to POSIX.1, which we just presented, the other parts were published all through the 1990s: POSIX.1b in 1993 (real-time extensions), POSIX.1c in 1995 (thread extensions), and POSIX.2 in 1992 (shell and utilities). But after 1997, all the POSIX standards were gathered under a single umbrella for simplicity. Multiple versions of the standard have been published since then: POSIX.1-2001, POSIX.1-2008, and POSIX.1-2017.
Because I would like my educational OS to be a small and simple as possible, I decided to go for the very first version of POSIX. So I started looking online to find the document, but after many many hours of searching the Internet, this document was nowhere to be found. The closest I could find was another document called “1003.1-1988 - IEEE Standards Interpretations for IEEE Standard Portable Operating System Interface for Computer Environments”, which only contained specific clarifications about the 1988 standard.
It took me a while to discover that the POSIX-1.1988 had been adopted by the US federal government for its own use, and that the federal government has filed its own version of the standard under the name “FIPS 151-1” (Federal Information Processing Standards Publication 151-1).
Searching for this name online quickly brought me to what I was desperately looking for!
The standard POSIX-1.1998 and its successor POSIX-1.1990 are both available online:
My educational OS project still has a very long way to go but at least, I can follow one of the first OS-related standards ever published, more than 30 years ago!