Trying to understand how capabilities are implemented
Albin Otterhäll
albin at a12l.xyz
Mon Sep 4 19:01:25 CEST 2023
Hi Martin!
Sorry for the late reply, toke some time to get a mail client up and
running with my mail provider. Didn't want to send a reply using their
web client.
On 8/21/23 11:24, Martin Stein wrote:
> On 19.08.23 03:35, Albin Otterhäll wrote:
>> 1. The RPC object A is created inside the protection domain 1, which
>> result in the object identity A being created by the kernel.
>>
>> 2. A has a name, which is a natural number.
>> Q1: Is the RPC object's name the value of a class variable of type
>> int?
>
> In short: Yes, you can consider it a simple integer that is known to
> both the kernel and the affected user-land program. The name references
> this object only within this one program (respectively protection domain).
>
> Just in case you're interested in some code background:
>
> In header [1] you can find the classes Rpc_object and Rpc_entrypoint - a
> thread that is used for handling RPCs on RPC objects. An RPC object
> initially comes without a capability (the objects name), but a
> capability is created and returned when linking the object via
> Rpc_entrypoint::manage to an entrypoint. At this point the object
> becomes ready to be called from outside the program.
>
> As you can see in header [2], Capability has no members but inherits
> from Untyped_capability, AKA Native_capability, which contains a pointer
> _data. Now, this is where it becomes platform-specific. However, a very
> simple case is the "base-hw" kernel. There, the _data pointer itself (as
> long value) is used as local name of the object [4]. This long value is
> the name that is registered in the domain's cap space inside the kernel
> for that particular RPC object.
Thanks for the code references and the explanation!
>> 3. Protection domain 1 has a capability space insied the kernel.
>> Q2: Is the protection domain seperate from the capability space in
>> the kernel, and they're "connected" with some map somewhere?
>
> In general, this is very kernel-specific. However, I know the internals
> only for the "base-hw" kernel. In this kernel, the cap space is not
> separate from its protection domain. Each domain object [5] contains a
> tree _cap_tree of all RPC object names known to this domain (see [6] for
> more details).
Okey! Didn't know that it could be different between the different
kernels. Thought that they were abstracted out, but apparently not. :)
>> Q3: Is the capability space a map between natural numbers and some
>> form of address to the object identity? I.e. the map work similar to a
>> set of OO references, there the keys are variable names; and the
>> values are the memory addresses of object identities.
>
> Again very kernel-specific and, again, my knowledge about "base-hw": In
> this kernel your depiction is very accurate. Each RPC object name is an
> Object_identity_reference in the kernel and contains a pointer
> Object_identity *_identity.
Thanks for confirming!
>> Q4: If the answer to Q3 is yes, does that mean that delegagion is
>> some form of mechanism to share the adress of the object identity with
>> other protection domains?
>
> If I understand you correctly, yes and no. To the user it looks like
> sharing an address in OO but you might better think of it as sharing the
> _ability_ to access the object. In contrast to address sharing,
> delegation creates a new local name/reference for the object identity in
> the target domain/cap space. In my domain the object might be referenced
> by the name "3" while in a domain I have delegated to, the object might
> be referenced by the name "987". However, even if delegation would
> result in the same name "3", the link between this name and the object
> is unique to the target domain as is that between my "3" and the object.
> This is well illustrated by § 3.1 Figure 3 in the book.
Is there a semantic difference between "sharing an address" and "sharing
the ability to access the object"? I've looked at
base/include/base/rpc_server.h and base/include/base/capability.h, but I
couldn't see any parts about delegation (I don't have any experience
with C++, so it's possible I've missed something obvious).
> I hope that was helpful!?
It was very helpful!
Thank you!
--
Albin Otterhäll
More information about the users
mailing list