Re: Split Capabilities: Making Capabilities Scale Mark S. Miller (markm@caplet.com)
Thu, 06 Jul 2000 20:32:51 -0700

This has been a wonderful thread that I'm only now caught up on. (I'm just now emerging from the black hole that Jonathan is about to enter into -- moving. We've just relocated to beautiful La Honda.)

IMO, Norm & Jonathan have represented well the conventional capability view, and the view from capability OSes, so I'll focus on the view from capability languages & libraries, especially E & ELib.

At 09:30 AM 6/27/00 , Karp, Alan wrote:
>The problem is the number of capabilities I need to deal with. After all,
>my PC has over 60,000 files on it. In the most general case, I need a
>conventional capability for each operation, e.g., read, write, execute, for
>each file. Some applications, SAP comes to mind, have hundreds or thousands
>of methods, each of which I might want to control separately. The number of
>capabilities to be managed becomes a problem quite quickly.
>
>Wildcards are often used to reduce the number of capabilities needed, but
>this approach is dangerous and not general enough. What happens if I put a
>private file in a directory that has an outstanding wildcard capability
>granting read access to general users?

We need to distinguish between 1) using capabilities in a natural capability style vs 2) using capabilities to wrap legacy non-capability-oriented systems (like file systems) vs 3) the possible advantages of proposed new styles.

  1. When designing new abstraction to be implemented in E, and implementing them, I have also found, like Norm and Jonathan, that multi-faceted objects ( http://www.erights.org/elib/capability/ode/ode-objects.html#facets ) rarely have more than three facets. A facet corresponds to Norm's "forseen" restriction of the operations available on an object. The designer on an abstraction communicates a lot to his users by designing such forseen facets. He effectively says: "These are the kinds of authority distinctions over this object that I find coherent and expect to be useful." Although the E user is easily able to make thinning frontends for unforseen restrictions as Norm describes, rarely does she do so. Usually when frontends are created that subset the original authority in some interesting way, it does so by object abstraction -- also adding new semantics. An example http://www.erights.org/elib/capability/ode/ode-bearer.html is the CoveredCallOption as an authority-reducing frontend to the original stock.
  2. Let's use file systems as the canonical legacy problem. There are two approaches to bridging these worlds. For capability OSes, the attractive option would be to rebuild a file system equivalent out of capabilities. Ie, capabilities are underneath, and the legacy is rebuilt (or virtually rebuilt) to run on top. In E the layering is the other way around. An E vat is designed to run as an unprivileged user program on top of stock operating systems, including stock file systems. The file I/O accessible to an E process must be rationalized into capability terms not by rebuilding it, but by wrapping it.

The wrapping is actually two layers -- E wraps Java's wrapping of the operating system provided services. Java provides the "platform abstraction layer" -- providing an adequately common interface to the intersection of the semantics of these OSes. E provides the capability rationalization.

E's wrapping of the file system (

http://www.erights.org/elang/uri-exprs.html , 
http://www.erights.org/elang/text-file-io.html , 
http://www.erights.org/javadoc/org/erights/e/meta/java/io/package-summary.html
) does not pre-create a capability for each file accessible to the E process, much less each possible separate authority over each file. To do so would be madness. Instead, it creates such capabilities on demand. A "File" object representing a directory gives access to all files and directories in that directory, recursively. (But only to those accessible to this E process under this OS, and not including "." or "..".) Only two forseen restrictions are provided: "readOnly" and "transReadOnly". For a leaf file, the two are identical. For a directory, the first is one level while the latter is transitive. Of course, the E user is free to program up all sorts of other types of restrictions, such as those based on wildcards. But as designer of the forseen restrictions, I only felt that these two deserved to be included.

(Note the difficulty of formally distinguishing between an authority-restriction facet and anything else. For example, if directory A contains directory B, then B can be obtained from A and grants less authority than A. Would we say that B is a restriction of A's authority?)

3) This is where I hope split capabilities may make a real contribution. The examples you've been using for the scaling problems of capabilities aren't grabbing us, because capabilities used in the style we're using don't have these problems. Perhaps what has happened is that, precisely because of the problems you are concerned about, we have evolved a style that's co-adapted to these problems, and have missed opportunities that lie outside our style. I don't know, but it seems a fruitful direction to explore.

More later..

         Cheers,
         --MarkM