41eaff2cc6
This is an interim fix for issue #112. This patch extends the 'Capability_allocator' class with the ability to register the global ID of a Genode capability so that the ID gets associated with a process-local kernel capability. Whenever a Genode capability gets unmarshalled from an IPC message, the capability-allocator is asked, with the global ID as key, whether the kernel-cap already exists. This significantly reduces the waste of kernel-capability slots. To circumvent problems of having one and the same ID for different kernel objects, the following problems had to be solved: * Replace pseudo IDs with unique ones from core's badge allocator * When freeing a session object, free the global ID _after_ unmapping the kernel object, otherwise the global ID might get re-used in some process and the registry will find a valid but wrong capability for the ID Because core aggregates all capabilities of all different processes, its capability registry needs much more memory compared to a regular process. By parametrizing capability allocators differently for core and non-core processes, the global memory overhead for capability registries is kept at a reasonable level.
23 lines
546 B
C++
23 lines
546 B
C++
/*
|
|
* \brief Core implementation of the PD session extension
|
|
* \author Stefan Kalkowski
|
|
* \date 2011-04-14
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2011-2012 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU General Public License version 2.
|
|
*/
|
|
|
|
/* Genode includes */
|
|
#include <base/native_types.h>
|
|
|
|
/* Core includes */
|
|
#include <pd_session_component.h>
|
|
|
|
|
|
Genode::Native_capability Genode::Pd_session_component::task_cap() {
|
|
return Native_capability(_pd.native_task(), _pd.badge()); }
|