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");
pram.ref_account(env()->ram_session_cap());
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");
prm.detach(addr);
PDBG("Pram dataspace detached from Prm_session");
pram.free(ds);
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];
Genode::Arg_string::find_arg(args,
"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>
{
private:
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;
. . .
}
__________________________________________________________________________________________________________________
Pram_session_component::Pram_session_component(Genode::Rpc_entrypoint
*ds_ep,
Genode::Rpc_entrypoint *pram_session_ep,
Genode::Allocator
*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.
Regards,
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.genode.org/pipermail/users/attachments/20160311/81722d3a/attachment.html>
More information about the users
mailing list