feat(renaser): Fase 11 — el reloj del sistema como capacidad de host

El userspace gana un sentido del tiempo: hasta ahora una app solo sabía
cuántas veces la habían llamado, no cuánto tiempo había pasado.

- Capacidad `sys_tiempo_mono() -> u64` — la décima función del host:
  los milisegundos monótonos desde el arranque. `reloj` expone la
  cuenta del PIT (100 Hz) como `milisegundos()`; `env` la inyecta.
  Lectura pura, no toca la memoria del módulo, jamás retrocede.
- App nueva `pulso` (`apps/pulso/`, wasm32): un compás visual cuya
  escena es una función PURA de `sys_tiempo_mono` — sin estado entre
  fotogramas—. Dos instancias laten al unísono nazcan cuando nazcan.
- `GENESIS` crece de 5 a 6 apps; `pulso` es la maestra del escritorio.

Verificado en QEMU (sendkey): la barra de `pulso` avanza con el tiempo
de pared; un segundo `pulso` lanzado con Alt+N ~15 s después aparece
sincronizado con el primero — el compás se rige por el reloj absoluto,
no por una cuenta de fotogramas.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-22 20:43:17 +00:00
parent 19d04a2766
commit 4bcdc88c83
11 changed files with 269 additions and 11 deletions
+16 -1
View File
@@ -13,7 +13,8 @@
// * sys_object_raiz — leer la raiz del grafo;
// * sys_object_fijar_raiz — coronar un objeto como raiz;
// * sys_estado_cargar — leer el estado persistido de la app (Fase 7c);
// * sys_estado_guardar — anclar el estado persistido de la app (Fase 7c).
// * sys_estado_guardar — anclar el estado persistido de la app (Fase 7c);
// * sys_tiempo_mono — leer el reloj monotono del sistema (Fase 11).
//
// GUARDARRAIL: el kernel valida MATEMATICAMENTE todo puntero que el modulo le
// entrega contra los limites reales de su memoria lineal. No se confia en que
@@ -442,5 +443,19 @@ pub(crate) fn enlazar_capacidades(
},
)?;
// --- CAPACIDAD 10 :: sys_tiempo_mono() -> u64 ---
// El reloj MONOTONO del sistema: milisegundos transcurridos desde el
// arranque. Le da al userspace un sentido del tiempo independiente del
// ritmo de los fotogramas — una app sabe CUANTO ha pasado, no solo CUANTAS
// veces la han llamado—. Jamas retrocede. No toca la memoria del modulo:
// es una lectura pura, sin puntero que validar.
enlazador.func_wrap(
"renaser",
"sys_tiempo_mono",
|_caller: Caller<'_, ContextoCapacidades>| -> u64 {
crate::async_system::reloj::milisegundos()
},
)?;
Ok(())
}