Core Concepts
Relevant source files
This page explains the fundamental concepts of the AXNS namespace system, providing an overview of key components and their relationships. For detailed implementation information, see Namespaces, Resources and ResWrapper, and The def_resource! Macro.
System Purpose
AXNS (Axiomatic Namespace System) provides a unified interface for managing system resources in a structured, namespace-based approach. Its core purpose is to enable:
- Resource isolation or sharing between different parts of a system
- Consistent access to resources through well-defined interfaces
- Proper resource lifecycle management including initialization and cleanup
- Flexibility across different deployment scenarios from shared unikernel environments to containerized systems
Sources: src/lib.rs(L1 - L15)
Key Components Overview
The following diagram illustrates the primary components of the AXNS system and their relationships:
Sources: src/res.rs(L11 - L15) src/res.rs(L53 - L56) src/res.rs(L107 - L119) src/ns.rs(L7 - L10)
Component Descriptions
Namespace
A Namespace is a collection of resources that can be managed as a unit. It serves as a container that holds references to various system resources and provides controlled access to them.
Key characteristics:
- Contains an array of
ResArcpointers (one for each defined resource) - Provides methods to access resources both immutably and mutably
- Can be created explicitly or accessed implicitly via the current namespace
- Manages the lifecycle of its contained resources
Sources: src/ns.rs(L7 - L10) src/ns.rs(L22 - L36)
Resource
A Resource represents system resource metadata including memory layout and lifecycle functions. Resources are defined statically and stored in a special program section called "axns_resources".
Key characteristics:
- Contains memory layout information
- Provides initialization and cleanup functions
- Stored in a special section of the compiled program
- Referenced by index in a namespace
Sources: src/res.rs(L11 - L15) src/res.rs(L36 - L44)
ResWrapper
ResWrapper<T> provides a type-safe interface to a specific resource. It acts as the primary API for interacting with resources across namespaces.
Key characteristics:
- References a static
Resourceinstance - Provides methods to access the resource in different namespaces
- Enables resource sharing between namespaces
- Allows resetting resources to their default values
Sources: src/res.rs(L53 - L56) src/res.rs(L58 - L105)
ResCurrent
ResCurrent<T> provides access to a resource in the "current" namespace, which might be a global namespace or a thread-local namespace depending on configuration.
Key characteristics:
- References a static
Resourceinstance - Contains a reference to the current namespace
- Implements
Dereffor convenient access to the resource
Sources: src/res.rs(L107 - L119) src/res.rs(L121 - L128)
Resource Access Flow
The following diagram shows how resources are accessed within the AXNS system:
flowchart TD
subgraph subGraph1["Resource Management"]
J["resource.reset(&mut ns)"]
L["Reset to initial value"]
K["resource.share_from(&mut dst, &src)"]
M["Clone ResArc pointer"]
end
subgraph subGraph0["Resource Access Methods"]
D["resource.get(&ns)"]
G["Read resource data"]
E["resource.get_mut(&mut ns)"]
H["Modify resource data"]
F["resource.current()"]
I["Get resource from current namespace"]
end
A["Client Code"]
B["Define Static Resource"]
C["Create Namespace"]
N["Feature enabled?"]
O["Thread-local namespace"]
P["Global namespace"]
A --> B
A --> C
B --> D
B --> E
B --> F
B --> J
B --> K
C --> D
C --> E
D --> G
E --> H
F --> I
I --> N
J --> L
K --> M
N --> O
N --> P
Sources: src/res.rs(L70 - L76) src/res.rs(L80 - L82) src/res.rs(L90 - L92) src/res.rs(L96 - L98) src/res.rs(L102 - L104) src/lib.rs(L54 - L59)
Resource Definition
Resources are defined using the def_resource! macro, which creates both a static Resource instance and a corresponding ResWrapper<T> accessor:
flowchart TD A["def_resource! macro"] B["Static Resource"] C["ResWrapper instance"] D["Memory layout"] E["Init function"] F["Drop function"] G["API to access resource in namespaces"] H["Client code"] I["Namespace"] J["ResArc to resource data"] A --> B A --> C B --> D B --> E B --> F C --> B C --> G C --> I H --> C I --> J
Sources: src/res.rs(L144 - L168)
Thread-Local vs. Global Namespace Behavior
AXNS supports both global and thread-local namespaces through a feature flag:
sequenceDiagram
participant ClientCode as Client Code
participant ResWrapper as ResWrapper
participant ResCurrent as ResCurrent
participant current_ns as current_ns()
participant ThreadLocal as Thread-Local
participant Global as Global
ClientCode ->> ResWrapper: resource.current()
ResWrapper ->> ResCurrent: create ResCurrent
ResCurrent ->> current_ns: crate::current_ns()
alt thread-local feature enabled
current_ns ->> ThreadLocal: CurrentNsImpl::new()
ThreadLocal -->> current_ns: Thread-local namespace
else thread-local feature disabled
current_ns ->> Global: global_ns()
Global -->> current_ns: Global namespace
end
current_ns -->> ResCurrent: Return CurrentNsImpl
ResCurrent -->> ResWrapper: Return ResCurrent<T>
ResWrapper -->> ClientCode: Resource access via deref
Sources: src/lib.rs(L16 - L59) src/res.rs(L70 - L76)
Key Operational Patterns
The AXNS system revolves around several key operational patterns:
- Resource Definition: Static resources are defined using the
def_resource!macro, which creates metadata and accessor objects. - Namespace Creation: Namespaces can be created explicitly (
Namespace::new()) or accessed implicitly via the current namespace. - Resource Access: Resources can be accessed in four main ways:
resource.get(&ns): Immutable access in a specific namespaceresource.get_mut(&mut ns): Mutable access in a specific namespace (if not shared)resource.current(): Access in the current namespace- Direct namespace access:
ns.get(res)andns.get_mut(res)
- Resource Sharing: Resources can be shared between namespaces using
resource.share_from(&mut dst, &src). - Resource Reset: Resources can be reset to their default values using
resource.reset(&mut ns).
Sources: src/res.rs(L58 - L105) src/ns.rs(L22 - L46)
Memory Management Model
AXNS implements careful memory management to ensure resources are properly initialized and cleaned up:
flowchart TD A["Namespace Creation"] B["Array of ResArc pointers"] C["Initialize ResArc"] D["Resource Access"] E["Get ResArc"] F["Share safely"] G["Resource Mutation"] H["Shared?"] I["Return None"] J["Return mutable reference"] K["Namespace Destruction"] L["Decrement ref count"] M["Call resource drop fn"] N["Deallocate memory"] A --> B B --> C D --> E E --> F G --> H H --> I H --> J K --> L L --> M M --> N
Sources: src/ns.rs(L22 - L36) src/ns.rs(L55 - L62)
Summary
The core concepts of AXNS revolve around:
- Resources - System objects with defined memory layouts and lifecycle functions
- Namespaces - Collections of resources that can be managed as units
- Wrappers - Type-safe interfaces for accessing resources in namespaces
- Current Namespace - A concept that provides easy access to resources without explicit namespace references
These components work together to provide a flexible, memory-safe system for managing resources in various deployment environments, from shared global resources to fully isolated per-thread resources.
Sources: src/lib.rs(L1 - L15) src/res.rs(L11 - L15) src/res.rs(L53 - L56) src/ns.rs(L7 - L10)