Ok, sorry for the hijack.
I get a little involved when big-picture issues are discussed.
Back to the original question:
Crazed123 wrote:Now my question is: how can we best fill in "Everything is a $ABSTRACTION" to achieve not merely a uniform interface, but true extensiblity.
You won't like my answer, but I don't think "everything is a ..." is a good design philosophy for anything. It tends to end up shoe-horning at least a few concepts into a form that is unnatural for them. This is the same reason I don't believe in the superiority of "pure functional languages" like Haskell or "pure OO" languages like Smalltalk. We are trying to model life, and life is not that simple.
However, I think you can break "everything" into just a few categories of things, and aim for "everything in the ... category is a ...". The important thing is to remember
why you need the abstraction in the first place. What problem are you trying to solve? You may find that the problems are different in different parts of your system.
I'll tell you what abstractions I think make sense in different parts of an OS... YMMV. First, I would distinguish between passive and active parts of the OS: Passive being resources like files, devices, and memory; active being running processes or maybe even bus-mastering devices. For passive resources, I think that "everything is a file" is a fine choice -- it has worked well for decades, and to a certain extent it makes sense to the user too (to see how it has been used to very good effect, look at how Mac OS X users install most software... Drag what is (apparently) a single file to the Applications folder).
For active agents in the system, I think "everything is a process" and "all communication is by messages" are good design philosophies.
I have to admit I'm quite stymied by all this "portals" stuff you keep talking about. Maybe you could provide a link to a good summary of the concept?
In the ideal case, we can even implement every kernel operation but one in terms of that $ABSTRACTION (portals have this property, but see above for their other problems) without breaking the uniform interface.
Correct me if I'm wrong, but from this and the questions you've asked in other threads, it sounds like you're trying to design an exokernel -- is that right? If so, you should give up on having any sort of uniform, clean, highly-abstracted interface to your kernel. Exokernels deal in low-level grotty details, and tend to manage each type of resource (network packets, disk blocks, memory pages, CPU time slices) in a completely different way. It's really out of necessity, because an exokernel is just a hardware multiplexer, and has to avoid too many privilege & address space transitions... because they aren't single-address-space systems! Ok, I'll stop now.
From there, manipulating $ABSTRACTION would allow customization and whole or partial remodeling of the OS, as well as bringing any benefits that come with $ABSTRACTION itself (like distributed 9P2000 for file I/O).
Once upon a time we had a huge 12-page thread about having such flexibility as a design goal. To summarize my position, I think it's just about unachievable, and not worth the effort, at least in the general case. But some things (like distribution ala Plan 9 or QNX) are certainly nice to have. Others, like being able to plug in different schedulers without re-compiling the kernel, I am less convinced of the need for.
My view on a lot of software design, not just OSes, used to be based on a kind of quest for something that looked "nice" and "clean" and "regular", and then I realized that we always design software to solve a problem in some context, and both the problem and context come from life which is "not nice", "very dirty", and "irregular". Since I accepted this reality, I've actually been a lot happier and more successful at design.
Before anyone complains about this post being too "abstract", remember that $ABSTRACTION is in the title of the thread.