Yet another question. Associated with "Re: Shared library"
Christian Helmuth
christian.helmuth at ...1...
Thu Mar 11 09:12:51 CET 2010
Hello,
On Wed, Mar 10, 2010 at 11:31:56PM +1030, Peter Nguyen wrote:
> So I've had a go at trying to implement a simpler case of having shared memory
> between two processes via adding code to the hello tutorial. I have done the
> following things:
>
> - I added a dataspace capability variable in the session server (which contains
> the dispatch function) called net_buffer, and in the constructor, I allocate 4
> bytes to the dataspace like so:
>
> net_buffer = Genode::env()->ram_session()->alloc(4);
Pretty similar to what I had in mind, just some notes:
* The RAM-session allocation granularity is page size, i.e. 4096
bytes. So, your allocation of 4 bytes will be rounded up to 4096.
* We prefer to implement server-specific implementation parts in a
sub class of the server. This keeps the public headers clean. So, I
suggest to move your code into Hello::Session_component.
> - In the session class, I added an extra virtual function declaration
> (get_cap()) to return the net_buffer variable.
>
> - In the session client, I have an implementation of the get_cap function. In
> this function, I pass an opcode relating to returning the dataspace capability.
>
> - In the component header, I have an implementation of get_cap() where i return
> net_buffer.
Fine.
> - The server source code is currently unchanged.
Didn't you adapt the dispatch method for get_cap() by adding a new
case?
> - I added code to the client source code to obtain the dataspace capability like
> so:
>
> Dataspace_capability ds_cap = h.get_cap();
> void *ptr = Genode::env()->rm_session()->attach(ds_cap);
>
> And at the moment, I am able to write to ptr eg. an integer, and the value
> prints fine, for instance. In reference to what was said previously ie.
What do you mean by "the value prints fine"?
> "Both - client and server - attach the dataspace to their virtual memory and,
> thereafter, share access to the same RAM pages."
>
> How is the server meant to obtain the dataspace capability?
>From what you wrote before I expected both components - Hello::Session_client and
Hello::Session_component - to have obtained the dataspace capability.
The server-side component allocated a RAM region and passed the
capability to the client on call of get_cap().
> Also, I'm assuming what I've done above is correct in terms of
> having shared memory between the server and client. So if i've done
> something, I would love to know what I need to do to fix it.
So... it does not work? The only point I see is: Add a new case to
dispatch for get_cap() using your enum (e.g., GET_CAP) and call the
get_cap() method in the Session_component like the following
os << get_cap();
HTH
--
Christian Helmuth
Genode Labs
http://www.genode-labs.com/ · http://genode.org/
Genode Labs GmbH · Amtsgericht Dresden · HRB 28424 · Sitz Dresden
Geschäftsführer: Dr.-Ing. Norman Feske, Christian Helmuth
More information about the users
mailing list