Overview
Relevant source files
AXNS (Resource Namespace System) is a Rust library providing a unified interface for managing and controlling access to system resources across different deployment scenarios. It enables configurable resource sharing and isolation between processes and threads in various operating system environments, from unikernels with shared resources to monolithic kernels or containerized environments requiring isolation.
For more detailed information about specific components, see Core Concepts and Thread-Local Features.
Purpose and Scope
AXNS addresses several key requirements for flexible resource management:
- Unified Resource Access: Providing a consistent interface to system resources
- Configurable Isolation: Supporting varying degrees of resource sharing between threads
- Deployment Flexibility: Working effectively in different system architectures
- Memory Safety: Ensuring proper resource initialization and cleanup
- Type Safety: Providing strongly-typed access to resources
The system manages resources such as virtual address spaces, working directories, file descriptors, and other system facilities that might need to be shared or isolated.
Sources: README.md(L5 - L14)
Core Architecture
AXNS follows a modular design with several key architectural patterns:
flowchart TD subgraph subGraph2["Access Patterns"] F["Global Namespace"] G["Shared resources"] H["Thread-local Namespaces"] I["Isolated resources"] end subgraph subGraph1["Namespace Management Layer"] C["Namespace"] D["ResArc references"] E["Resource instances"] end subgraph subGraph0["Resource Definition Layer"] A["def_resource! macro"] B["Static Resource"] end J["Unikernel Mode"] K["Process/Container Mode"] A --> B B --> E C --> D D --> E F --> G G --> J H --> I I --> K
The architecture consists of these primary components:
Component | Description | Role |
---|---|---|
Namespace | Container for resources | Stores and provides access to system resources |
Resource | Resource type metadata | Defines memory layout and lifecycle functions |
ResWrapper | Static resource handle | Provides the public API for resource access |
ResArc | Reference-counted pointer | Manages resource lifecycle and memory |
def_resource! | Resource definition macro | Simplifies creation of new resource types |
Sources: src/lib.rs(L10 - L14)
Component Relationships
classDiagram class Namespace { +ptr: NonNull~ResArc~ +new() Namespace +get(Resource) &ResArc +get_mut(Resource) &mut ResArc } class Resource { +layout: Layout +init: fn pointer +drop: fn pointer +index() usize } class ResWrapper~T~ { +res: &'static Resource +current() ResCurrent~T~ +get(Namespace) &T +get_mut(Namespace) &mut T +share_from(dst, src) +reset(Namespace) } class ResArc~T~ { +ptr: NonNull~ResInner~ +as_ref() &T +get_mut() Option~&mut T~ } class CurrentNs { <<trait>> +new() Self +as_ref() &Namespace } Namespace "1" --> "*" ResArc : contains ResArc "*" --> Resource : references ResWrapper "1" --> Resource : describes ResWrapper ..> "1" Namespace : accesses through CurrentNs ..> "1" Namespace : provides context
Sources: src/lib.rs(L10 - L14) src/lib.rs(L32 - L59)
Resource Access Flow
Accessing resources in AXNS follows this pattern:
sequenceDiagram participant ApplicationCode as "Application Code" participant ResWrapperT as "ResWrapper<T>" participant Namespace as "Namespace" participant ResArcT as "ResArc<T>" ApplicationCode ->> ResWrapperT: Define with def_resource! ApplicationCode ->> Namespace: Create namespace ApplicationCode ->> ResWrapperT: resource.get(&namespace) ResWrapperT ->> Namespace: namespace.get(resource) Namespace ->> ResArcT: Get ResArc ResArcT -->> ApplicationCode: Return reference to T ApplicationCode ->> ResWrapperT: resource.get_mut(&mut namespace) ResWrapperT ->> Namespace: namespace.get_mut(resource) Namespace ->> ResArcT: Get mutable ResArc ResArcT -->> ApplicationCode: Return mutable reference to T ApplicationCode ->> ResWrapperT: resource.current() ResWrapperT ->> Namespace: Get current_ns() Note over Namespace: Uses thread-local or global NS Namespace -->> ApplicationCode: Access through current namespace
Sources: src/lib.rs(L16 - L59)
Thread-Local Feature
AXNS provides an optional thread-local feature for fine-grained resource isolation:
stateDiagram-v2 state UseThreadLocalNS { [*] --> CheckTLS CheckTLS --> InitializeNew : First access CheckTLS --> UseExisting : Subsequent access } state AccessResources { [*] --> GetResource GetResource --> ModifyResource : get_mut() GetResource --> ShareResource : share_from() GetResource --> ResetResource : reset() } [*] --> FeatureCheck FeatureCheck --> UseGlobalNS : thread-local OFF FeatureCheck --> UseThreadLocalNS : thread-local ON UseGlobalNS --> AccessResources UseThreadLocalNS --> AccessResources
This feature is controlled by the thread-local
feature flag in Cargo.toml:
[features]
thread-local = ["dep:extern-trait"]
When enabled, AXNS uses the CurrentNs
trait to provide thread-local namespaces. When disabled, all access goes through the global namespace.
Sources: src/lib.rs(L32 - L59) Cargo.toml(L14 - L15)
Deployment Scenarios
AXNS supports various deployment models by adjusting namespace isolation:
flowchart TD subgraph subGraph0["Deployment Models"] A["Unikernel"] D["Single Global Namespace"] B["Monolithic Kernel"] E["Per-Process Namespaces"] C["Container Environment"] F["Grouped Namespaces"] end G["Shared Resources"] H["Process-Isolated Resources"] I["Container-Isolated Resources"] A --> D B --> E C --> F D --> G E --> H F --> I
- Unikernel Mode: A single global namespace shared by all threads (default)
- Monolithic Kernel Mode: Each process has its own namespace, with threads in the same process sharing resources
- Container Mode: System resources grouped into namespaces that are shared between specific processes
Sources: README.md(L5 - L14)
Summary
AXNS provides a flexible, efficient system for managing resource namespaces across different operating system environments. Its architecture balances the need for shared resources with isolation requirements, providing a consistent API regardless of the deployment scenario. The system's design ensures proper resource lifecycle management through reference counting, while the optional thread-local feature provides additional isolation when needed.
For practical guidance on using AXNS, see Usage Guide.
Sources: src/lib.rs(L1 - L59) README.md(L1 - L14)