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>
117 lines
6.1 KiB
Markdown
117 lines
6.1 KiB
Markdown
# renaser — guía operativa
|
||
|
||
**renaser** es un kernel asíncrono de *Espacio de Direccionamiento Único*
|
||
(SASOS) en Rust `#![no_std]`, bare-metal x86_64. Rompe con POSIX: interfaz
|
||
visual nativa desde el arranque, aislamiento **por software** (no por MMU),
|
||
el texto como caso particular del dibujo.
|
||
|
||
Documentos hermanos: `ARCHITECTURE.md` (arquitectura), `ROADMAP.md` (fases y
|
||
plan), `CHANGELOG.md` (registro técnico de cambios), `DIARIO.md` (crónica en
|
||
lenguaje llano), `README.md` (presentación).
|
||
|
||
## Construir y ejecutar
|
||
|
||
Desde la raíz del repositorio:
|
||
|
||
| Comando | Efecto |
|
||
|---|---|
|
||
| `cargo run` | compila el kernel, forja la imagen UEFI y abre QEMU |
|
||
| `cargo build` | compila el kernel + la imagen, sin lanzar QEMU |
|
||
| `cargo kernel` | alias: compila solo el kernel para `x86_64-unknown-none` |
|
||
|
||
Verificación headless (sin ventana): añadir
|
||
`-- -display none -monitor unix:/tmp/q.sock,server,nowait` y capturar con
|
||
`screendump` por el socket del monitor.
|
||
|
||
Reconstruir una app WASM del userspace tras tocarla. Los `.wasm` viven en
|
||
`kernel/assets/` —de ahí los lee `boot` al sembrar la imagen (Fase 7b)—; el
|
||
modulo `hello_wasm` se copia como `app.wasm`, el resto conserva su nombre:
|
||
|
||
```sh
|
||
cd apps/<app> # hello_wasm, discola, glotona, cronista, memoriosa, pulso, tonada, bitacora, pregon
|
||
cargo build --target wasm32-unknown-unknown --release
|
||
cp target/wasm32-unknown-unknown/release/<app>.wasm ../../kernel/assets/<app>.wasm
|
||
# (hello_wasm es la excepcion: su destino es kernel/assets/app.wasm)
|
||
```
|
||
|
||
## Estructura del espacio de trabajo
|
||
|
||
- `boot/` — orquestador de **anfitrión**: construye la imagen de disco UEFI con
|
||
la crate `bootloader` 0.11 y lanza QEMU. Es el **único miembro** del workspace.
|
||
- `kernel/` — el kernel **bare-metal**. Está **excluido** del workspace y se
|
||
compila solo como dependencia de artefacto de `boot` (target
|
||
`x86_64-unknown-none`). NUNCA debe ser miembro del workspace ni compilarse
|
||
para el anfitrión: lo haría fallar por un `_start` duplicado.
|
||
- `apps/` — aplicaciones del userspace, módulos `.wasm`
|
||
(target `wasm32-unknown-unknown`). Workspaces propios, excluidos.
|
||
|
||
Módulos del kernel (`kernel/src/`): `main`, `grafico`, `consola`, `compositor`,
|
||
`baliza`, `sync`, `gdt`, `interrupts`, `pic`, `drivers/`, `almacen`,
|
||
`manifiesto`, `memory/`, `async_system/`, `texto`, `wasm/`. El detalle de cada
|
||
uno está en `ARCHITECTURE.md`.
|
||
|
||
## Toolchain
|
||
|
||
Nightly, fijado en `rust-toolchain.toml`. Targets `x86_64-unknown-none` y
|
||
`wasm32-unknown-unknown`. Componentes `rust-src` y `llvm-tools` (los exige el
|
||
build script de la crate `bootloader`). Entorno verificado: Artix Linux,
|
||
QEMU 11, OVMF en `/usr/share/edk2/x64/OVMF.4m.fd` (sin módulo KVM → TCG).
|
||
|
||
## Convenciones
|
||
|
||
- **Idioma:** comentarios E identificadores en español.
|
||
- **`unsafe`:** confinado en células mínimas, envuelto de inmediato en una
|
||
abstracción segura. `#![deny(unsafe_op_in_unsafe_fn)]`. Cada bloque `unsafe`
|
||
lleva un comentario `SEGURIDAD:` que justifica su corrección.
|
||
- **Framebuffer / MMIO:** siempre `core::ptr::write_volatile`; jamás asignación
|
||
indexada directa (el optimizador la elidiría).
|
||
- **`no_std` estricto:** solo `core::*` y `alloc::*` (heap vivo desde la Fase 3).
|
||
Prohibido cualquier ruta de `std::*`.
|
||
- **Alineación:** 16 bytes para estructuras genéricas; 4096 bytes (página) para
|
||
buffers de memoria y regiones de asignador.
|
||
- Código densamente comentado; se cuida la coherencia de estilo entre módulos.
|
||
|
||
## Estado
|
||
|
||
Fases 1 a 5, 6.0, 6.1, 6.2, la Fase 7 COMPLETA —el userspace nace del grafo de
|
||
objetos—, la Fase 8 COMPLETA —el compositor teselante e interactivo: teselado
|
||
con `mirada-layout` (8a), ciclado de layout (8b), foco y enrutamiento selectivo
|
||
del teclado (8c), promoción y reordenación de ventanas (8d)—, la Fase 9
|
||
COMPLETA —orden-Z y ventanas flotantes: composición con solapamiento (`Alt+F`)—
|
||
la Fase 10 COMPLETA —alta y baja de aplicaciones en vivo (`Alt+N` / `Alt+Q`)—,
|
||
la Fase 11 COMPLETA —el reloj del sistema como capacidad de host
|
||
(`sys_tiempo_mono`) + la app `pulso`—, la Fase 12 COMPLETA —la bocina del PC
|
||
como capacidad de host (`sys_tono`) + la app `tonada`—, la Fase 13 COMPLETA
|
||
—ratón PS/2, puntero, clic-para-enfocar y arrastre de ventanas flotantes—,
|
||
infraestructura `memory::mmio` (mapeador propio de regiones MMIO en la tabla
|
||
L4), la Fase 14 COMPLETA —nombres en cada ventana y barra de tareas con
|
||
clic-para-enfocar—, la Fase 15 COMPLETA —la voz del sistema: acorde al
|
||
arrancar, repique al lanzar o cerrar, bajo al desalojar, con prioridad
|
||
sobre `sys_tono`— la Fase 16 COMPLETA —la barra viva: botón «+»
|
||
lanzador a la izquierda y reloj `mm:ss` a la derecha que late cada
|
||
segundo— la Fase 17 COMPLETA —`bitacora`, editor de texto que persiste entre
|
||
arranques en el grafo de objetos (tipografía 8×8 embebida)— la Fase 18
|
||
COMPLETA —red: virtio-net + ARP al gateway de QEMU + recepción de
|
||
paquetes registrada por COM1—, la Fase 19 COMPLETA —voz del userspace
|
||
hacia la red: capacidades `sys_net_mac` / `sys_net_enviar` / `sys_net_recibir`
|
||
+ la app `pregon` que pregona su presencia con un broadcast Ethernet
|
||
y muestra el tráfico entrante— y la Fase 20 COMPLETA —Akasha Over Ether:
|
||
crate `akasha` (no_std compartido) con `MensajeAkasha` postcard sobre
|
||
EtherType 0x88B5 + respondedor en el kernel (demuxer, atención de
|
||
SolicitarObjeto / ProveedorObjeto / AnunciarRaiz, faro periódico cada
|
||
5 s contra reloj monótono)—. Todo verificado en QEMU. Ver `ROADMAP.md`.
|
||
|
||
## Flujo de trabajo
|
||
|
||
En **cada iteración** de trabajo, sin excepción:
|
||
|
||
1. Actualizar `CHANGELOG.md` — la entrada técnica detallada del cambio.
|
||
2. Actualizar `DIARIO.md` — la misma jornada contada en lenguaje llano y
|
||
elegante, sin carga técnica (es una crónica humana, no un registro técnico).
|
||
3. Verificar en QEMU si el cambio es observable (con captura de pantalla).
|
||
4. `git commit` (mensaje en español, descriptivo) y `git push origin main`.
|
||
|
||
renaser vive ahora dentro del monorepo **brahman**; los commits van al remoto
|
||
de brahman (`gitea.gioser.net/sergio/brahman`). Mensajes de commit en español.
|
||
Verifica una fase en QEMU antes de darla por cerrada.
|