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>
94 lines
4.4 KiB
TOML
94 lines
4.4 KiB
TOML
# =============================================================================
|
|
# renaser :: kernel — el corazon bare-metal que late en el espacio unico
|
|
# -----------------------------------------------------------------------------
|
|
# Este paquete esta EXCLUIDO del espacio de trabajo (ver el Cargo.toml raiz):
|
|
# es codigo puramente bare-metal y solo se compila como dependencia de
|
|
# artefacto de `boot`, que le impone el target `x86_64-unknown-none`. Por eso
|
|
# fija sus versiones de forma explicita, sin herencia del workspace.
|
|
# =============================================================================
|
|
|
|
[package]
|
|
name = "kernel"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
license = "MPL-2.0"
|
|
authors = ["JL Soltech <gerencia@jlsoltech.com>"]
|
|
description = "renaser :: kernel asincrono SASOS — entrada, framebuffer y reactor"
|
|
|
|
# El kernel es un binario freestanding: sin arnes de pruebas ni de benchmarks.
|
|
[[bin]]
|
|
name = "kernel"
|
|
path = "src/main.rs"
|
|
test = false
|
|
bench = false
|
|
doctest = false
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Perfiles. El kernel esta EXCLUIDO del workspace; los `[profile]` del raiz
|
|
# no le alcanzan, asi que se declaran aqui. En bare-metal, las verificaciones
|
|
# UB de la stdlib —`unchecked_mul::precondition_check`, etc.— inyectan un
|
|
# panico cuyo propio camino de propagacion suele escribir en regiones que el
|
|
# cargador no mapeo: un colapso DENTRO de la red de seguridad del colapso,
|
|
# imposible de diagnosticar. Desactivar `debug-assertions` y `overflow-checks`
|
|
# las saca del binario sin cambiar la semantica del codigo correcto.
|
|
# -----------------------------------------------------------------------------
|
|
[profile.dev]
|
|
panic = "abort"
|
|
debug-assertions = false
|
|
overflow-checks = false
|
|
|
|
[profile.release]
|
|
panic = "abort"
|
|
debug-assertions = false
|
|
overflow-checks = false
|
|
opt-level = "s"
|
|
lto = true
|
|
codegen-units = 1
|
|
|
|
[dependencies]
|
|
# --- Fase 1-2 :: arranque, framebuffer e interrupciones ---
|
|
bootloader_api = "0.11"
|
|
x86_64 = "0.15"
|
|
embedded-graphics = "0.8"
|
|
|
|
# --- Fase 3 :: heap dinamico, reactor asincrono y texto vectorial ---
|
|
linked_list_allocator = "0.10"
|
|
spin = "0.9"
|
|
crossbeam-queue = { version = "0.3", default-features = false, features = ["alloc"] }
|
|
futures-util = { version = "0.3", default-features = false, features = ["alloc"] }
|
|
# `hashbrown` ACTIVA el modo `no_std` de fontdue; sin el recae en `std`.
|
|
fontdue = { version = "0.9", default-features = false, features = ["hashbrown"] }
|
|
|
|
# --- Fase 4 :: interprete WebAssembly del userspace aislado ---
|
|
# `wasmi` bare-metal: sin `std`, sin `wat`, sin `simd` (el target no tiene SSE).
|
|
wasmi = { version = "1.0", default-features = false, features = ["hash-collections"] }
|
|
|
|
# --- Fase 6 :: drivers de hardware — el disco virtio-blk sobre el bus PCI ---
|
|
# `virtio-drivers` bare-metal: el kernel implementa su `trait Hal` para el DMA.
|
|
virtio-drivers = { version = "0.13", default-features = false, features = ["alloc"] }
|
|
|
|
# --- Fase 6.1c / 7b :: el grafo de objetos direccionado por contenido ---
|
|
# El formato del grafo —tipos, (de)serializacion postcard, hash BLAKE3, trazado
|
|
# de registros del log— vive en la crate `formato`, un nucleo `no_std`
|
|
# COMPARTIDO con `boot` (que lo usa para sembrar la imagen de disco). El kernel
|
|
# ya no declara `serde`/`postcard`/`blake3` por su cuenta: los hereda —con las
|
|
# mismas features, BLAKE3 escalar puro incluido— a traves de `formato`. Una
|
|
# sola verdad del formato de disco, imposible de divergir entre los dos lados.
|
|
formato = { path = "../formato" }
|
|
|
|
# --- Fase 20 :: Akasha Over Ether ---
|
|
# El protocolo nativo de red de renaser: mensajes `MensajeAkasha` serializados
|
|
# con `postcard`, sobre Ethernet crudo. Mismo patron que `formato`: nucleo
|
|
# `no_std` compartido, no miembro del workspace anfitrion. El kernel y boot lo
|
|
# enlazan, y cualquier app o daemon que quiera hablar AoE en el futuro tomara
|
|
# la misma crate — una sola verdad del protocolo.
|
|
akasha = { path = "../akasha" }
|
|
|
|
# --- Fase 8 (preparación) :: el compositor ---
|
|
# `mirada-layout` es el motor de teselado del compositor de brahman —
|
|
# geometría pura (rectángulos, foco, Z-order), `no_std`, sin smithay ni
|
|
# Wayland. Vive en el monorepo brahman, en su PROPIO workspace; renaser
|
|
# lo enlaza por `path` cruzando la frontera. La feature `serde` queda
|
|
# APAGADA: el kernel computa el layout en memoria, no lo serializa.
|
|
mirada-layout = { path = "../../crates/modules/mirada/mirada-layout" }
|