Everything is a $ABSTRACTION and Microkernel Hell
Posted: Thu Sep 20, 2007 11:14 am
We've all seen it in our systems at times. Maybe our process model got too complicated, or we didn't know how to make capabilities revocable. Or perhaps we couldn't figure out how to move kernel-level objects between processes via our elegant portal IPC (OK, that one's mine.).
Eventually, we who try to create elegant systems too often run into Microkernel Hell (not necessarily confined to microkernels, but most common among them): the point at which enhancing the elegance of one part of the system reduces it somewhere else, but we still have to make a choice.
I, for example, would argue that the first-ever instance of Microkernel Hell was the core mechanism of microkernels: message passing.
The most elegant solution is usually to make the OS a little larger and a little less extensible in one place so as to provide a powerful abstraction capable of expressing nearly anything.
For Windoze, that abstraction was COM objects. But COM objects require far too much on the user-land's part and offer no uniform interfaces. For Unix and later Plan 9, it was file I/O. But file I/O cannot properly represent control flow, only data flow. For Amiga, it was Arexx commands. But Arexx ports relied on the absence of memory protection. For Pebble and Kea, it was portals. But portals require butt-ugly interfaces to pass kernel-level data (like memory pages or capabilities) between protection domains and end up not really resembling function calls or system calls at all.
Now my question is: how can we best fill in "Everything is a $ABSTRACTION" to achieve not merely a uniform interface, but true extensiblity. 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.
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).
Eventually, we who try to create elegant systems too often run into Microkernel Hell (not necessarily confined to microkernels, but most common among them): the point at which enhancing the elegance of one part of the system reduces it somewhere else, but we still have to make a choice.
I, for example, would argue that the first-ever instance of Microkernel Hell was the core mechanism of microkernels: message passing.
The most elegant solution is usually to make the OS a little larger and a little less extensible in one place so as to provide a powerful abstraction capable of expressing nearly anything.
For Windoze, that abstraction was COM objects. But COM objects require far too much on the user-land's part and offer no uniform interfaces. For Unix and later Plan 9, it was file I/O. But file I/O cannot properly represent control flow, only data flow. For Amiga, it was Arexx commands. But Arexx ports relied on the absence of memory protection. For Pebble and Kea, it was portals. But portals require butt-ugly interfaces to pass kernel-level data (like memory pages or capabilities) between protection domains and end up not really resembling function calls or system calls at all.
Now my question is: how can we best fill in "Everything is a $ABSTRACTION" to achieve not merely a uniform interface, but true extensiblity. 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.
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).