And now for something completely different...
A long time ago ('96 to be exact), in a high school far, far away, our hero was taking a computer science which was an academically acceptable waste of a period.
The class was being 'taught' C++ by a math teacher who didn't really know anything about computers and probably would have failed the intro to computer class (which mercifully, I never had to take).
One day, he briefly breathed on the topic of operating systems and a girl in the front asked, "What's the ultimate operating system?"
This teacher was unfortunately of the school that thinking while teaching is wrong, so he hems and haws about how it depends on what you're doing. Half credit for that, I suppose.
So the girl says, "Well, I mean with all that in consideration, what would you consider the best general purpose operating system?"
So he goes off with "Well, what do you mean by general?"
So the girl says, "For everyday use by a wide range of people."
So he says, "Well then, I'd say that Windows 3.11 is the ultimate operating system."
This was especially funny. Partly since Windows 3.11 wasn't an operating system at all (although it happened to be what the lab computers booted into at the time). Mostly because the concept of Windows 3.11 being the ultimate operating system was so obviously false to us.
So, we decided that we ought to give that girl a real answer to her question. We decided that we should make an operating system and since it would probably suck in one way or another, we'd make sure that it was at least ultimate in name. So we called it "Ultimate".
I have a few notes on what I want Ultimate to be. I want it to be expandable. By expandable, I intend for the default boot mode to be not unlike DOS, where it's usable for a single task and a single user. This would probably be best characterized as an exokernel. It's not really an operating system at all, rather it's a set of routines which different applications can run.
On this setup, you can then load a multitasking suite which would consist of somewhat sophisticated memory management and process scheduling. At this point, the system will run multiple tasks for a single user.
In order to set up multiple users, you'd ideally load login programs.
This is all pretty straightforward stuff. It sounds almost like a microkernel, except a microkernel typically depends on everything else loaded in. Ideally, I'd want the kernel to be able to stand alone and load programs into memory (including, as in DOS, to be able to load over itself).
More to the point, I'd want everything else to depend on that small framework and grow out of it. Instead of it being a bunch of daemons that talk to each other, I'd want this to build layer on layer on layer. That way things don't necessarily need to talk to each other if you're careful about defining entry points to services.
Enough about the system end, let me explain what I want the user to see.
The user (presumably connecting to a fully loaded system) logs in and has a shell (graphical or CLI, I care not). The reality is that the system they have logged into is a virtual system. This goes beyond chroot to making the entire system a bunch of airtight compartments. Anything done between different users involves using local sockets and communicating over the network.
When a user runs a program, there is an implicit call to an execution environment. Linux does this to an extent with misc binary formats which were able to call up a JVM and load a java program into it. This obviously would need to be definable.
Part of me believes that it might not be a bad idea to treat everything as a binary file (for example, running a JPEG calls up an image viewer), but that also feels dangerously close to one of the more dangerous security holes in Windows. Of course, if it's single user and it's on a virtual system, I'm inclined to say that it's their data. They can cat /dev/null over it all if they'd like and I won't care one whit.
But then again, I'd like to not make it trivial for someone else to ruin someone else's day.
The important part would be that I could decide to run an old Macintosh game (we'll say Bolo. I'm fond of that one) and an execution environment is called up and the game is called in the context of that environment...whether or not the underlying architecture is a 68k or a PPC. This means absolute emulation. At the very worst, you could run the necessary operating system with an execution environment similar to that of VMWare or Bochs, and load the program into that.
I also believe that with some creative allocation of resources, this could be done for a large number of users somewhat reasonably.
This makes security a very interesting thing to implement. After all, the user's login program could run in a defined execution environment, thus making all the OS services that are normally called in the process of a program go through that execution environment.
In fact, this would probably be the right way to compartmentalize the system.
There is one other bit, but I'll wait for comments on this first.