42fee6fcbc
Tres mensajes y un EtherType propio bastan para extender el grafo de
objetos —direccionado por contenido, ya BLAKE3— a otras maquinas
renaser que escuchen en la misma red de capa-2. Sin TCP, sin IP,
sin DNS.
Crate nueva 'akasha/' (no_std compartido, gemela de 'formato',
excluida del workspace):
- MensajeAkasha enum con SolicitarObjeto(id), ProveedorObjeto(id,
payload), AnunciarRaiz(id).
- Codec: postcard (mismo que ya usa el grafo en disco).
- EtherType: 0x88B5. MAX_PAYLOAD_AKASHA = 1486 (MTU sin fragmentar).
- Helpers componer_frame(src, dst, msg) y analizar_frame(bytes) que
distinguen EtherType ajeno, frame truncado y payload basura.
- 6 pruebas unitarias en verde.
Modulo nuevo 'kernel/src/akasha.rs' con tres oficios:
1. Demuxer (drenar_y_demultiplexar): drena la cola RX del dispositivo
virtio-net y demultiplexa: frames AoE con payload valido los
procesa el respondedor; el resto va a una cola del userspace que
'sys_net_recibir' ahora lee. Frames 0x88B5 con payload
no-postcard (saludo de pregon) se cuentan y tambien viajan al
userspace.
2. Atencion de mensajes (procesar):
- SolicitarObjeto(id): consulta almacen::recuperar; si tenemos el
objeto, respondemos ProveedorObjeto unicast con objeto.serializar()
y re-hashing de defensa en profundidad.
- ProveedorObjeto(id, payload): verifica blake3(payload)==id antes
de absorber con almacen::almacenar.
- AnunciarRaiz(id): si ignoramos el nodo, le solicitamos al emisor.
3. Faro periodico (difundir_raiz cada 5 s): broadcast del hash del
manifiesto actual. Cadencia medida contra reloj::milisegundos(),
no contra los awaits — el interprete wasmi de los apps degrada
la cadencia de EsperaFrame::await a varios cientos de ms, asi
que se mide contra el reloj monotono y los oficios per-fotograma
se enganchan al tic del compositor (cuyo latido es fiable).
Contadores ResumenAkasha (rx/tx por variante, descartados, cola del
usuario) listos para un futuro indicador AoE en la barra de tareas.
Cambios complementarios:
- sys_net_recibir lee de akasha::pop_usuario, no de
drivers::red::recibir_en (que queda #[allow(dead_code)] como
primitiva del driver para diagnostico).
- tarea_red queda corta: envia un ARP al gateway y termina. El
demuxer y el faro viven en el tic del compositor.
Verificacion:
- 'cargo test -p akasha' → 6 pruebas en verde.
- QEMU headless 60 s con -object filter-dump → 14 frames: 11
AnunciarRaiz (Δ promedio 5.86 s sobre 5.00 s de target), 2 ARP
y el pregon hello. Cada AnunciarRaiz lleva el hash del manifiesto
'2f3deadfcc7dae25..' en 33 bytes postcard sobre 47 bytes de frame.
- COM1 vuelca 'akasha :: ANUNCIO emitido :: raiz=2f3deadfcc7dae25..'
en cada disparo.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
103 lines
5.5 KiB
TOML
103 lines
5.5 KiB
TOML
# =============================================================================
|
|
# renaser :: manifiesto raíz del espacio de trabajo
|
|
# -----------------------------------------------------------------------------
|
|
# Un único espacio de direccionamiento, una única verdad de versiones.
|
|
# Las dependencias se declaran aqui una sola vez y persisten, coherentes,
|
|
# a traves de todos los miembros del sistema.
|
|
# =============================================================================
|
|
|
|
[workspace]
|
|
resolver = "2"
|
|
# Solo `boot` es miembro del espacio de trabajo: corre en el anfitrion. El
|
|
# kernel queda EXCLUIDO a proposito —es bare-metal puro y jamas debe compilarse
|
|
# para el anfitrion— y se construye unica y exclusivamente como dependencia de
|
|
# artefacto de `boot`, que le fija el target `x86_64-unknown-none`.
|
|
members = ["boot"]
|
|
# El kernel (bare-metal) y las apps WASM (target wasm32) se compilan aparte,
|
|
# cada cual con su propio target; quedan fuera del espacio de trabajo.
|
|
# `formato` —el formato del grafo en disco— y `akasha` —el protocolo Akasha
|
|
# Over Ether (Fase 20)— tambien se excluyen: son nucleos `no_std` que enlaza
|
|
# el kernel bare-metal, asi que se compilan como dependencia de cada lado
|
|
# (kernel y boot) y no como miembros del workspace anfitrion.
|
|
exclude = ["kernel", "apps", "formato", "akasha"]
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Metadatos compartidos: cada miembro hereda esta identidad con `*.workspace`.
|
|
# -----------------------------------------------------------------------------
|
|
[workspace.package]
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
license = "MPL-2.0"
|
|
authors = ["JL Soltech <gerencia@jlsoltech.com>"]
|
|
description = "renaser :: kernel asincrono SASOS basado en aislamiento por software"
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Dependencias del ecosistema. Reutilizamos infraestructura madura en lugar
|
|
# de reinventar boilerplate. `default-features = false` se aplica con bisturi,
|
|
# unicamente alli donde las features por defecto arrastrarian `std`.
|
|
# -----------------------------------------------------------------------------
|
|
[workspace.dependencies]
|
|
# Constructor de la imagen de disco UEFI/BIOS. Es una herramienta de ANFITRION
|
|
# (usa std), la consume el miembro `boot` y NO debe enlazarse jamas en el kernel.
|
|
bootloader = "0.11"
|
|
|
|
# API `#![no_std]` que el kernel SI consume: expone `entry_point!`, `BootInfo`
|
|
# y la descripcion del framebuffer GOP. Su version debe acompasar a `bootloader`.
|
|
bootloader_api = "0.11"
|
|
|
|
# Abstraccion de la CPU x86_64: registros de control, GDT, IDT e instrucciones
|
|
# privilegiadas sin ensamblador inline. Es `#![no_std]` de nacimiento; su
|
|
# feature `instructions` (activa por defecto) nos da `hlt` y el control de IRQ.
|
|
x86_64 = "0.15"
|
|
|
|
# Rasterizacion de primitivas vectoriales sobre el framebuffer. `#![no_std]`,
|
|
# sin heap: en la Fase 1 solo aporta el rasgo `DrawTarget` del lienzo.
|
|
embedded-graphics = "0.8"
|
|
|
|
# Rasterizador de tipografias. REQUIERE `alloc`, de modo que solo se teje en el
|
|
# kernel una vez exista el asignador (Fase 2). `default-features = false`
|
|
# silencia su feature `std`. Se declara ya para congelar la version.
|
|
# `hashbrown` es lo que ACTIVA el modo `no_std` de fontdue; sin el, la crate
|
|
# recae en `std::collections` y no compila para bare-metal. `simd` queda fuera:
|
|
# nuestro target no tiene SSE.
|
|
fontdue = { version = "0.9", default-features = false, features = ["hashbrown"] }
|
|
|
|
# --- Fase 3 :: heap dinamico y reactor asincrono ---
|
|
# Asignador del heap del kernel — algoritmo probado, configurado `no_std`.
|
|
linked_list_allocator = "0.10"
|
|
# Exclusion mutua sin sistema operativo: `Mutex` e inicializacion unica `Once`.
|
|
spin = "0.9"
|
|
# Cola lock-free, segura frente a interrupciones, para el canal de scancodes.
|
|
crossbeam-queue = { version = "0.3", default-features = false, features = ["alloc"] }
|
|
# Combinadores `Future`/`Stream` y `AtomicWaker`. Sin ejecutor ni I/O: solo
|
|
# las piezas que renaser teje en su propio reactor.
|
|
futures-util = { version = "0.3", default-features = false, features = ["alloc"] }
|
|
|
|
# --- Fase 4 :: interprete WebAssembly para el userspace aislado ---
|
|
# `wasmi` en modo bare-metal: sin `std`, sin `wat`, sin `simd` (el target no
|
|
# tiene SSE). `hash-collections` le da mapas basados en hashbrown, `no_std`.
|
|
wasmi = { version = "1.0", default-features = false, features = ["hash-collections"] }
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Perfiles de compilacion. Cargo exige que los perfiles vivan en la RAIZ del
|
|
# espacio de trabajo. `panic = "abort"` es obligatorio: sin sistema operativo
|
|
# subyacente no hay desenrollado de pila (`unwinding`) posible.
|
|
# -----------------------------------------------------------------------------
|
|
[profile.dev]
|
|
panic = "abort"
|
|
# En bare-metal, las verificaciones UB de la stdlib —el `precondition_check`
|
|
# de `unchecked_mul`, p.ej.— inyectan un panico cuyo propio camino de
|
|
# propagacion termina escribiendo en regiones que el cargador no mapeo: un
|
|
# colapso DENTRO de la red de seguridad del propio colapso, imposible de
|
|
# diagnosticar. Desactivar las aserciones de depuracion y las comprobaciones
|
|
# de overflow las elimina del binario sin cambiar la semantica del codigo
|
|
# correcto. Es practica habitual de los kernels y el de renaser no es excepcion.
|
|
debug-assertions = false
|
|
overflow-checks = false
|
|
|
|
[profile.release]
|
|
panic = "abort"
|
|
opt-level = "s" # codigo compacto: cada byte cuenta en bare-metal
|
|
lto = true # el optimizador cruza fronteras de crate
|
|
codegen-units = 1 # una sola unidad => maxima oportunidad de optimizacion
|