userspace 0.2.2

userspace library
Documentation

Userspace

Version License Rust Architecture Status

๐Ÿ“‹ Overview

Userspace is a Rust implementation of a standard library for userspace applications, designed to work without depending on the Rust standard library (no_std). It provides safe abstractions for low-level operations, architecture-specific functionality, memory management, and executable file format handling.

Key Features

  • ๐Ÿ”’ Memory Safety: Leverage Rust's ownership model for secure systems programming
  • ๐Ÿงฉ Modular Architecture: Well-defined components with clear interfaces
  • ๐Ÿ”„ Cross-Platform: Architecture abstractions for portability (currently x86_64)
  • ๐Ÿ“ฆ No Standard Library: Works in no_std environments
  • ๐Ÿ“„ ELF Support: Parse, map, and launch ELF64 images according to the GABI
  • ๐Ÿ”— ELF Interpreters: Load PT_INTERP dynamic linkers and prepare Linux startup state
  • ๐Ÿง  Memory Management: Stack manipulation and memory allocation utilities

๐Ÿ” Project Structure

userspace/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ file/         # File format handling
โ”‚   โ”œโ”€โ”€ macros/       # Utility macros
โ”‚   โ”œโ”€โ”€ memory/       # Memory management
โ”‚   โ”‚   โ”œโ”€โ”€ alloc/    # Allocation functionality
โ”‚   โ”‚   โ”œโ”€โ”€ page/     # Page management
โ”‚   โ”‚   โ””โ”€โ”€ stack/    # Stack handling
โ”‚   โ”œโ”€โ”€ target/       # Architecture abstractions
โ”‚   โ”‚   โ”œโ”€โ”€ architecture/   # CPU architecture specifics
โ”‚   โ”‚   โ””โ”€โ”€ operating_system/  # OS abstractions
โ”‚   โ”œโ”€โ”€ traits/       # Common interfaces
โ”‚   โ”œโ”€โ”€ types/        # Library-specific types
โ”‚   โ”œโ”€โ”€ entry.rs      # Binary entry point
โ”‚   โ”œโ”€โ”€ library.rs    # Main library definition
โ”‚   โ”œโ”€โ”€ panic.rs      # Panic handler
โ”‚   โ””โ”€โ”€ result.rs     # Error handling
โ”œโ”€โ”€ Cargo.toml        # Project configuration
โ””โ”€โ”€ build.rs         # Build script

๐Ÿš€ Getting Started

Prerequisites

  • Rust 2024 Edition or newer
  • Cargo and Rustup

Usage

rustup toolchain install nightly
cargo new usespace_sample
cd userspace_sample
rustup override set nightly

With standard library

Add this to your Cargo.toml:

[dependencies]
userspace = { version="*", features=["with_std"] }
Usage Example
use userspace;

fn main() {
    userspace::info!("Hello, world!\n");
    userspace::file::print(file!());
}

๐Ÿ› ๏ธ Architecture

Userspace is designed with a layered architecture:

  1. Core Layer: Basic types, traits and utilities
  2. Target Layer: Architecture and OS abstractions
  3. Memory Layer: Stack, pages, and allocation
  4. File Layer: File format parsing and manipulation

Each layer builds upon the previous ones, providing increasingly higher-level abstractions while maintaining safety and performance.

Memory Management

The memory subsystem provides:

  • Safe stack traversal and argument extraction
  • Page allocation primitives
  • Basic heap allocation in no_std environments

ELF Loading

The ELF loader currently targets Linux x86_64 and follows the GABI program-header view:

  • Maps PT_LOAD segments with their file and memory sizes.
  • Applies load bias to ET_DYN/PIE images.
  • Preserves segment permissions from p_flags.
  • Detects PT_INTERP and transfers control to the system dynamic linker.
  • Executes static ET_EXEC and relocation-free ET_DYN images directly, while requiring an interpreter for relocation/dependency-bearing dynamic images.
  • Builds the initial interpreter stack and updates the core auxiliary-vector entries.

The current loader uses a fixed 0x100000 link address for the userspace executable. ET_EXEC images linked into that range are intentionally rejected by MAP_FIXED_NOREPLACE; conventional ET_EXEC images near 0x400000 do not collide with the loader. The rebuilt initial stack is a 16 MiB writable mapping preceded by a PROT_NONE guard page. argv, envp, AT_EXECFN, fresh AT_RANDOM, AT_PLATFORM, and AT_BASE_PLATFORM data are copied into the new stack; AT_SYSINFO_EHDR remains a pointer to the existing vDSO mapping. Required loader auxv entries are synthesized when absent, and newly created image mappings are rolled back when segment loading or permission application fails.

See tests/elf_fixtures/build.sh for reproducible static, PIE, dynamic, large-BSS, and address-collision ELF fixtures. Run sh tests/host/run.sh for host-side macro-layout, auxv, and loader regression tests.

Architecture Abstraction

The target subsystem abstracts architecture details:

  • Pointer types and operations
  • Register access patterns
  • CPU-specific features
  • OS-specific functionality

Currently focused on x86_64, but designed to be extensible to other architectures.

๐Ÿงช Experimental Features

Userspace uses several experimental Rust features:

#![feature(generic_const_exprs)]
#![feature(generic_const_items)]

These enable advanced type-level programming required for zero-cost abstractions across architectures.

๐Ÿ“š Documentation

For more detailed documentation:

cargo doc --open

๐Ÿค Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -am 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

๐Ÿ“œ License

This project is licensed under the terms found in the LICENSE file.

๐Ÿ”ฎ Future Work

  • Expand the fixed initial stack and add a growth policy
  • Transactional mapping ownership and rollback
  • Complete auxiliary-vector semantic classification and regeneration
  • Validate source stack ranges before copying pointed data
  • Support for additional architectures (ARM, RISC-V)
  • Enhanced file system abstractions
  • Networking capabilities
  • Threading and concurrency primitives
  • Comprehensive test suite