Files
vasilito cee25393d8 fix: boot process improvements — dependency cycle, INIT_NOTIFY, probing loop, and log spam fixes
- Fix P15-8-init-cycle-detection.patch: replace visiting+error with seen+silent-skip
  to eliminate 11 false-positive 'dependency cycle detected' errors on shared deps
- Fix P0-daemon-fix-init-notify-unwrap.patch: remove eprintln! for missing
  INIT_NOTIFY (expected for oneshot_async services, ~7 daemons affected)
- Fix driver-manager hotplug loop: add PERMANENTLY_SKIPPED static set shared
  between hotplug handler and DriverConfig::probe() to stop infinite re-probing
  of Fatal/NotSupported/deferred-exhausted device+driver pairs (e.g. ided)
- Fix driver-manager log_timeline: suppress repeated EPIPE/ENOENT errors with
  AtomicI32 dedup and AtomicBool one-shot guards for boot timeline JSON
- Add driver-manager SIGTERM handler, ACPI bus registration, --status mode,
  driver reap loop, graceful shutdown, and reduced deferred retries (30→3)
2026-05-17 12:34:02 +03:00

5.1 KiB

RECIPES/CORE — ESSENTIAL SYSTEM COMPONENTS

Kernel, bootloader, C library, init system, and base drivers. Everything needed to boot Redox.

STRUCTURE

recipes/core/
├── kernel/          # Redox microkernel (~20-40k LoC Rust)
│   └── source/      # Kernel source (fetched from gitlab.redox-os.org)
├── bootloader/      # UEFI bootloader (x86_64-uefi, aarch64-uefi)
│   └── source/mk/   # Per-arch bootloader build rules
├── relibc/          # POSIX C library written in Rust
│   └── source/      # relibc source (headers, platform, syscalls)
├── base/            # Core userland + all drivers
│   └── source/      # Base repo (audiod, ipcd, ptyd, drivers, netstack, ramfs)
│       └── drivers/ # ALL drivers (userspace daemons)
│           ├── graphics/  # vesad, virtio-gpud, ihdgd (Intel experimental)
│           ├── net/       # e1000d, rtl8168d, rtl8139d, ixgbed
│           ├── storage/   # ided, ahcid, nvmed, usbscsid
│           ├── audio/     # ac97d, ihdad, sb16d
│           ├── usb/       # usbhidd (USB HID)
│           ├── virtio/    # virtio-blkd, virtio-netd, virtio-gpud
│           └── pci/       # pcid, pcid-spawner (PCI enumeration)
├── installer/       # redox_installer (creates filesystem images)
├── redoxfs/         # RedoxFS (default filesystem)
├── init/            # Init system (TOML-based service manager)
├── ion/             # Ion shell (default)
├── userutils/       # Core user management
├── uutils/          # Coreutils (Rust port)
└── netutils/        # Basic network utilities

WHERE TO LOOK

Task Location
Fix kernel crash kernel/source/src/ — syscall handling, context switching, memory mgmt
Add a syscall kernel/source/src/scheme/ — scheme registration, then libredox binding
Fix a driver base/source/drivers/<driver>/src/
Fix POSIX compat relibc/source/src/header/ — add missing POSIX headers/functions
Add bootloader support bootloader/source/mk/<arch>-unknown-uefi.mk
Fix PCI enumeration base/source/drivers/pci/pcid-spawner/
Fix display output base/source/drivers/graphics/ — vesad, virtio-gpud
Fix networking base/source/drivers/net/ + base/source/netstack/

KERNEL SCHEME ARCHITECTURE

Kernel provides minimal schemes: debug, event, memory, pipe, irq, time, sys, proc, serio. All other schemes are userspace daemons registering via File::create(":myscheme").

Driver access pattern:
  1. iopl() syscall → port I/O privilege
  2. Open /scheme/memory/physical → mmap hardware registers
  3. Open /scheme/irq/{num} → receive interrupts as messages
  4. Register scheme → handle requests from user programs

DRIVER MODEL

  • ALL drivers are userspace daemons (except serio for PS/2)
  • Access hardware via: scheme:memory, scheme:irq, iopl syscall
  • Register as scheme: daemon name becomes /scheme/<name>
  • PCI devices discovered via pcid daemon → spawns drivers

HISTORICAL POSIX GAPS IN RELIBC (Wayland-facing)

Missing API Location to implement
signalfd/signalfd4 relibc/source/src/header/signal/ + active local/patches/relibc/P3-signalfd*.patch carriers — current support is recipe-applied, not plain-source convergence
timerfd_create/settime/gettime relibc/source/src/header/sys_timerfd/ + active local/patches/relibc/P3-timerfd-relative.patch carrier — current support is recipe-applied
eventfd relibc/source/src/header/sys_eventfd/ + active local/patches/relibc/P3-eventfd-mod.patch carrier — current support is recipe-applied
F_DUPFD_CLOEXEC relibc/source/src/header/fcntl/ + local/patches/relibc/redox.patch — support language should remain evidence-qualified
MSG_CMSG_CLOEXEC, MSG_NOSIGNAL relibc/source/src/header/sys_socket/ — support language should remain evidence-qualified
open_memstream relibc/source/src/header/stdio/ + local/patches/relibc/P3-open-memstream.patch carrier — current support is patch-carried

The current relibc work is therefore no longer just “add the missing Wayland APIs.” The higher-value remaining work is completeness depth, downstream cleanup, and runtime validation.

ANTI-PATTERNS

  • DO NOT add drivers to kernel — all drivers must be userspace
  • DO NOT modify syscall ABI — use libredox/relibc wrappers
  • DO NOT use unwrap() in drivers — handle errors properly with Result

CASCADE REBUILDS

Core packages (relibc, kernel, base) are at the bottom of the dependency tree. When any of them changes, all dependent packages must be rebuilt:

./local/scripts/rebuild-cascade.sh relibc    # Rebuilds relibc + all downstream
./local/scripts/rebuild-cascade.sh kernel     # Rebuilds kernel + all downstream
./local/scripts/rebuild-cascade.sh base       # Rebuilds base + all downstream

relibc in particular has the widest cascade: any change to its headers or ABI affects every C package in the tree (bison, m4, flex, ncurses, and transitively everything that depends on those).