Custom implementation of core services

David Werner wernerd at ...389...
Fri Mar 11 15:21:07 CET 2016

Hi Stefan,

thank you for your answer!

> Are you sure that in the scenario, where the child is created directly
> by init, your service's PRAM and PRM interfaces are used at all? When
> you route the child's RM and RAM session requests to your component that
> does not mean they are used to create the child. For this purpose the
> routes of init itself are decisive. Only RM and RAM sessions opened by
> the child itself are routed according to the child's policy.

i didn't express myself correctly with the part about starting another 
component as a child of init. Sorry for that.

What I meant is that when I start a component (created with 
core-services as environment) next to my server which executes a main 
method like this:

int main (void)

Proxy::Prm_connection prm;
     PDBG("Prm_connection established -> Prm_session created");

     Proxy::Pram_connection pram;
     PDBG("Pram_connection established -> Pram_session created");

     PDBG("Own ram_session is now ref_account of the pram_session");

  env()->ram_session()->transfer_quota(pram.ram_cap(), 32*1024);
     PDBG("Quota transfered");

     Ram_dataspace_capability ds = pram.alloc(4096);
     PDBG("Dataspace allocated");

     void *addr = prm.attach(ds);
     PDBG("Dataspace attached to Prm_session");

     PDBG("Pram dataspace detached from Prm_session");;
     PDBG("Dataspace freed");


no problem occurs.

Here are some parts of my code. Could you take a look at it ? I will try 
your advice with the kernel debug.

Pram_session_component *_create_session(const char *args)            
from Pram_root
                 Genode::size_t ram_quota = 
Genode::Arg_string::find_arg(args, "ram_quota").ulong_value(0);

                 enum { MAX_LABEL_LEN = 64 };
                 char label[MAX_LABEL_LEN];
"label").string(label, ~0UL, "");

                 unsigned long phys_start     = 
Genode::Arg_string::find_arg(args, "size").ulong_value(~0UL);
                 unsigned long phys_size        = 
Genode::Arg_string::find_arg(args, "start").ulong_value(~0UL);

                 PDBG("Creating Pram_session_component...");
                 return new (md_alloc()) Pram_session_component(_ds_ep, 
ep(), md_alloc(), ram_quota,
  (char *)label, phys_start, phys_size);


class Pram_session_component : public Genode::Rpc_object<Pram_session>

             using Ds_slab = 
Genode::Synced_allocator<Genode::Tslab<Pdataspace_component, 4096> >;

             Genode::Rpc_entrypoint *_ds_ep;
             Genode::Rpc_entrypoint *_pram_session_ep;

             Genode::Allocator_guard _md_alloc;
             Ds_slab _ds_alloc;

             Genode::Ram_connection _ram;

             const char* _label;
             unsigned long _phys_start;
             unsigned long _phys_size;

             . . .



  Genode::Rpc_entrypoint *pram_session_ep,
*md_alloc, Genode::size_t ram_quota,
                                                 const char *label, 
unsigned long phys_start, unsigned long phys_size)
: _ds_ep(ds_ep), _pram_session_ep(pram_session_ep),
     _md_alloc(md_alloc, ram_quota), _ds_alloc(&_md_alloc),
     _ram(label, phys_start, phys_size), _label(label),
     _phys_start(phys_start), _phys_size(phys_size) { }

Thank you in advance.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the users mailing list