Exterminate All Operating System Abstractions (1996) [pdf]
cs.berkeley.edu
cs.berkeley.edu
I like the idea, and am experimenting with it in my own OS. In the mainstream world, we see this paper's goals partially appearing with the people who give a network card directly to a server process in Linux.
If they said which architecture there were thinking about, I missed it. On x86 without IOMMU I can't think of any card I would trust. IOMMU implementation is so spotty I'm not sure I'd trust it either. There is a great deal to be said for keeping the device access locked away in the kernel where you know which features of the card you will use, and if it has a mode that lets it scribble elsewhere in memory, so aren't using it.
What is the trade-off between that, and the added complexity in understanding all the different ways you can program something?
IMO, developers want a simple and standardized model to build applications on operating systems so they don't have to care about the internals.
This article represents a marginalized view by the larger industry as a whole.
They obviously don't mean that every CRUD app should build its own OS, since that would be absurd.
You can still have a standardized model for writing software. The argument is against baking this standardized model into the kernel, where it will stick around for decades, unable to be changed.
Every standard or abstraction can be unbundled into multiple standards or abstractions. But at the end of the day, what wins is something that's simplest to the operator
The OS absolutely needs to define standard usage APIs so we don't end up in the situation where everybody rolls their own. Yes, giving applications bare-metal access is good. But that's a minority of applications in a minority of usage cases. Give people a good simple API for the average case, and THEN let them take exclusive low-level control when they need it.
I'm just waiting for the rest to be re-discovered by mainstream so we can get on with it and build a secure platform with significant developer support.
SCOMP Final Report (see p17 of PDF or p9 of document on I/O) http://www.dtic.mil/cgi-bin/GetTRDoc?Location=U2&doc=GetTRDo...
The authors of this paper do mention VM/370 in their "Related Work" section (page 5). They say their approach is similar, except that they "export" hardware resources rather than emulating them, which is more efficient.
My first thought was that it seems like we have this these days with VMs, although that can still be fairly complicated to set up due to the way that VMs reliably partition hardware resources. Skimming a bit further I see this is in some ways the opposite of what they have in mind, which is to even be able to save registers in a different "process".
I tend to think that operating systems don't provide enough isolation rather than too much. I don't care too much about how they go about implementing that. I can see the appeal of a more flexible OS implementation, but I don't agree about what the OS should ultimately provide.
I wouldn't mind seeing default-available VMs that are treated more like applications in terms of resource availability and scheduling. It seems like this would at least partly address many of the concerns within a monolithic kernel design.
Can anyone recommend other good papers on exokernels? I feel like I'm not really getting it yet.
MirageOS is another project following in the same tradition, but again things have moved on and it's a unikernel which has aspects like an exokernel (choose your own abstractions), but also aspects that are radically different (no userspace and everything linked into a single image).
[1] https://www.cl.cam.ac.uk/research/srg/netos/papers/2003-xens...
I think the ground shift between 1996 and now is the democratization of kernel code. These mysterious "kernel architects" referenced in the paper who handed down a system from on high are now any decent C programmer with an itch to scratch. If you don't like the Linux/*BSD/whatever abstractions given to you, then make your own. If people like it and it doesn't offend an influential developer it can even be widely deployed.
Certainly some shortcuts like DDE, rump kernels and emerging flavors of libOS are now coming around, but it's still an uphill battle.
[citation needed] - outside of academic environments. I suppose the embedded environment might count as building your own micro-operating system (only one task? don't bother with a scheduler etc).
Another example is sheer amount of dead, search results I get for OS projects on sites that track them. Almost all are before 2010 with most closer to the late 90's. I'm not sure why this is but there's just hardly anyone doing it anymore. Maybe it's because they google it and see how hard it is with all the dead projects. ;)
> It is important to note that we favor abstractions but they should be implemented outside the operating system so that applications can select among a myriad of implementations or if necessary roll their own
For example, if my software doesn't like the OS's abstractions for networking, let me go find one that I do like and use it instead.
The foundation of computing is based off abstraction - using layers and interfaces to hide complexity, so developers can focus on higher-order problems.
This article argues against abstractions citing security, performance and cost. But time and again it has been shown that most costly component in software is human time - and simplifying the underlying architecture is worth the trade-offs
For highly scalable systems, the perf trade-off is just a matter of spinning up more VMs.
The higher-order benefit is you can expect your operating system and VM to behave the same, no matter what
Certainly you can call that minimal representation an abstraction as well, but I'm not sure it's helpful in this context, since it seems clear enough what they're arguing against.
The issue comes when you try to define "safe multiplexing". Take for instance a spinning disk drive. If we took this at face value, every application would know about things like sectors and seek times. Presumably this would permit some sort of domain-specific optimisation (that, say, a database engine might use). Perhaps we posit that programs that don't need such specialisation use a library for disk access. So far so good.
Now what is it the OS is trying to multiplex? No longer abstract, high-level concepts like "write this data to this file", which it can safely mess about with because it knows what they mean; no, it has to multiplex read head seeks. It cannot have any awareness of the meaning of these seeks (that was the point of the exercise!) so it can't really be more intelligent than a "dumb multiplexer". So your finely tuned database application has its clever read head optimizations all shot to hell whenever literally anything else touches the disk.
In order for an OS to multiplex hardware resources efficiently, it needs to have some idea of what the applications are trying to accomplish, so it stands the best chance of giving it to them.
For what it's worth, I also find the paper rather hot headed and light on concrete examples.
Even more interesting, they let applications share file systems by taking a bytecode-based representation of FS metadata from userspace, and using that to enforce correct usage of the actual disk blocks. This lets applications control where on the disk to allocate, when to read which blocks, etc. without losing any of the security and cooperation of a typical file system.
http://www.cse.psu.edu/~trj1/cse543-f06/papers/vax_vmm.pdf
You can ignore the security kernel and MLS stuff while imagining something simpler there. However, the design and assurance strategies for that one have yet to be topped by modern virtualization products.
Here's a modern approach to secure I/O with a nice list of others in Related Work:
http://repository.cmu.edu/cgi/viewcontent.cgi?article=1328&c...
Have fun with those.
Most OSes don't do anything like this. They allow applications to be written in raw machine code. The applications run as if they had full control over the CPU hardware. The OS then multiplexes the CPU by saving and restoring the program counter (and, typically, the rest of the registers and CPU state as well, though the exokernel design in this paper doesn't even do that). The idea is to (as much as possible) provide the same interface as the underlying hardware provides, then do a little extra work to make sure different applications aren't stepping on each other's toes.
...but only when used correctly. Abstraction is a means to an end, not the end itself. Unfortunately, years of CS education seem to have taught most people that it's the other way around, causing massive increases in design complexity that are only justified by dogmatic adherence to "more abstraction is better". Some programming language communities are more disposed to this effect than others (e.g. Java.)
Correct application of abstraction is not common in mainstream software, and rather difficult to describe, but the simplicity and clarity is unmistakable when one encounters it. The occasional articles on HN about seemingly impossibly tiny programs are good examples.
This article is a bit "X considered harmful" reactionary but I see their point - often, software today is on the side of far too much abstraction.
Abstractions only create design complexity when they are applied incorrectly. Abstractions should scale horizontally across a layer of the software stack (VMs, Storage - NFS, APIs, etc). If you're create a single-use abstraction, it's not really an abstraction but a complexity
But this is a trade-off. The real benefit comes in simplifying the programming model and not forcing developers to read through manuals figuring out how to flip a bit on a hard drive. Instead, they can leverage open-source and libraries that rely on that standardization to deliver most of the value (with a small perf hit)