Hi, I'm now trying to port my L4Env-based program to Genode. It is a
runtime environment to run OS/2 programs on a L4 family microkernel
(Inspired by OS/2 Warp, PowerPC edition/IBM Workplace OS). Currently,
the working version (actually, some proof-of-concept) is running under
L4Env, but I plan to port it to Genode and L4Re (and maybe, to WinNT
native/ReactOS in the future).
For porting purposes, I need to have some region-mapper functionality,
like 1) reserve a virtual memory region in the region map, so that it
will avoid attaching dataspaces over this region, unless an explicit
attachment address is specified; 2) lookup an address in the region
mapper, i.e., determine, is this address free, reserved, or some
dataspace is attached here, and if so, at which address/offset and which
size.
For implementing the memory management functions, this is needed to
reserve a virtual memory block, for subsequent committing
pages/attaching dataspaces in that region, step by step.
As I looked at the Genode::Region_map interface, I don't see such
functions in that class. Though, I found some memory-range allocation
routines in the Genode::Range_allocator class, but I'm not sure if this
is what I need. Is there some functionality related to reserving
regions/looking up addresses implemented elsewhere, or I need to
implement such functionality myself?
Also, a required feature is multiple memory areas support in the region
mapper. I need at least, two memory areas, a private one, and a shared
one. A private area start at the beginning of the address space. It is
private to any user-mode program. A shared area starts at some higher
address, and it is common for all usermode programs (using my runtime
environment). So, it is a global shared memory started at the same
address, and each shared memory region is mapped at the same address in
all client address spaces. It is used for shared memory IPC, as well as
for loading DLL's. DLL's are shared between different usermode programs,
unlike Windows DLL's or Unix SO's.
So, I need to allocate memory ranges in specific (private or shared)
areas. This could be implemented via my own memory manager with its own
accounting. But maybe, there is an already implemented functionality,
like this? L4Env region mapper has support for multiple memory areas, as
well as a possibility to lookup an address, or to attach a pointer to a
user-defined structure, to an address. So, I can attach my own data
related to that address/region. Is there a functionality like this
implemented in Genode?
I also know, that there is a support for managed dataspaces, or nested
region maps, which could be useful here (at least, for implementing a
shared memory area), but I also know, that nested region maps are not
supported on all platforms (like Genode/Linux). So, it would be,
possibly, better to avoid using them, unless really needed.
WBR,
valery