MarkM asks, "to what degree could [the capability mafia] consolidate our interests in the KeyKOS-lineage OSes (KeyKOS, CapROS, EROS, Coyotos) into efforts to improve seL4 as needed so we're not losing any of the *significant* differential value of the KeyKOS line?". It's a great question, and since I continue to work on a Coyotos derivative rather than seL4, I have lots of thoughts. Let's explore them.
My summary description of seL4 is that Gerwin read the Coyotos Microkernel Spec and made two primary changes: removal of any persistence features, and not abstracting the concept of address space. There are some differences to the system as a whole, such as the license (GPLv2-only instead of GPLv2+) and the quality of the tools. I find (Coyotos) mkimage tool for building the initial configuration of the system infinitely more powerful and comprehensible than CAmkES, but nothing prevents us from replicating the mkimage program in seL4. I also find CMake to be entirely magic beyond my comprehension, where Coyotos uses the much friendlier GNU make.
On removal of persistence features: I know that this matters to some people. Coyotos is designed as a disk operating system, in the manner of OS/400 and IBMi, where RAM is just a cache for all of your objects. seL4, on the other hand, lets you control exactly what is in RAM. I don't have a preference for one style or another, and I think modern systems like Midori went with the "no paging" style to great effect. I have heard through Andrew Warkentin that trying to do orthogonal persistence on top of seL4 is a non-starter, but I haven't explored it myself.
On not abstracting address spaces: Coyotos had both Guarded Page Tables (GPTs), which are manipulated by programs to build address spaces, and Mappings, which are platform-specific and silently built as-needed. seL4 only has the platform-specific object and a platform-specific API to build them. Again, this might not be a bad thing. You still need to figure out some way to represent address spaces on-disk, but having to "own" the mappings means you have better control over the performance of running a program that has gone tepid.
In terms of memory management, I think of the Untyped mechanism more like the Coyotos Range cap than a SpaceBank. Untyped allows you to turn a page of RAM into some kernel object: an Endpoint, a Thread Control Block (Coyotos: Process), a Page. Would we have much trouble building a SpaceBank on top of this mechanism?
I'm not sure if you could build a Factory (Coyotos: Constructor) that can verify confinement on top of seL4. Might be fun to try.
Given that none of these differences are that material, why am I not currently building on seL4? Some of the reason comes down to familiarity, but I have a deeper problem with the KeyKOS family that I want to explore, and there'd be a lot of toes getting stepped on if I tried to do this in seL4. It's really unpleasant to be told "No" when you're doing exploratory work, and seL4 also happens to be a moving target.
Anyway! I'm not the only person to recognise this problem, here's a talk given by Matthew Brecknell from Kry10 describing the seL4 objects that must be set up to build a "Data Diode" allowing data to travel in one direction. The time code is 20 minutes, 16 seconds.
Under this family of systems, there's a level of trust you require in order to call any component. You trust the component not to crash and discard its reply capability, or equivalently, to just never send the reply. In order to receive a message, you need to be waiting on that endpoint when the response arrives; your process can't be doing anything else. So in order to communicate with a component without becoming subject to it, you need a mechanism like the one described in the talk: you'll add your request to a buffer, and then trigger an asynchronous notification, letting the receiver know that you've got a request for it. You can then carry on with other requests.
This set-up works well enough for systems like Kry10 that are globally configured: there are a known set of components that are going to be wired up. But I am a soy-dev aspiring E programmer, and I want to create and discard objects at will! In that case, this sort of construction doesn't really scale. If you have N components, you could end up with N squared connections between them, each with a send buffer for each communication direction, maybe doubled again if you want to share capabilities (who doesn't?).
To put the problem in perspective, people used to regularly hit the open file limit on posix systems, and there are plenty of examples where people have more sockets open than would fit on a single ip address. If you had one object per port, with the minimum possible buffer sizes, for 65,536 open ports, then you require 65,536 * 4k * 4 = 1GiB of space just for IPC buffers!
No. The primary responsibility of the kernel is to enable safe IPC between mutually-suspicious components. So, I'm exploring mechanisms to do just that. It has been taking its sweet time, I'm terribly sorry. I've worked 50-60 hour weeks on cloud telephony systems for over 5 years and not had a lot of capacity, and I find C to be slow-going. Nevertheless, this is why seL4 is not for me (yet).