⎇ 922ad1f86bbef5d4f8c5f59827e5fd6a9b17c1af
renaser/apps/discola/src/lib.rs
Historia
Quién tocó qué
crudo
feat: integra renaser (kernel SASOS bare-metal) al monorepo
1// =============================================================================
2// renaser :: apps/discola — Fase 5 :: el inquilino discolo del userspace
3// -----------------------------------------------------------------------------
4// Esta aplicacion esta MAL a proposito. Su `tick` no hace un fotograma de
5// trabajo y retorna —como manda el ABI cooperativo—: cae en un bucle cerrado
6// y jamas devuelve el control. En un sistema cooperativo ingenuo, eso colgaria
7// la maquina entera.
8//
9// Pero renaser ejecuta cada `tick` con un presupuesto estricto de COMBUSTIBLE.
10// Cuando este bucle lo agota, el runtime `wasmi` lanza una trampa, el kernel
11// recupera el mando y desaloja a este modulo — tatuando su region de purpura.
12// El resto del userspace ni se entera. Eso es lo que esta app demuestra.
13// =============================================================================
14
15#![no_std]
16
17/// Sin sistema operativo bajo nosotros, un panico solo puede detenerse en seco.
18#[panic_handler]
19fn al_fallar(_: &core::panic::PanicInfo) -> ! {
20 loop {}
21}
22
23/// Sumidero de las escrituras del bucle: obliga al compilador a CONSERVAR cada
24/// iteracion —y, con ella, su consumo de combustible— en lugar de elidirla.
25static mut SUMIDERO: u64 = 0;
26
27/// Preparacion. No hay nada honrado que preparar: el kernel la invoca, retorna
28/// sin incidentes, y la app pasa por buena... hasta su primer `tick`.
29#[no_mangle]
30pub extern "C" fn init() {}
31
32/// El fotograma que nunca termina. Un bucle cerrado, deliberado: jamas retorna.
33/// El kernel `renaser` lo cortara por agotamiento de combustible y desalojara
34/// esta aplicacion sin que el sistema sufra un solo sobresalto.
35#[no_mangle]
36pub extern "C" fn tick() {
37 let mut contador: u64 = 0;
38 loop {
39 contador = contador.wrapping_add(1);
40 // SEGURIDAD: escritura volatil a un escalar estatico; su unico fin es
41 // que el optimizador no pueda vaciar el bucle. No se crea referencia.
42 unsafe {
43 core::ptr::write_volatile(core::ptr::addr_of_mut!(SUMIDERO), contador);
44 }
45 }
46}