tawasuyu

tawasuyu/brahman

Rust 225TOML 67JSON 14HTML 12842 Sutichaykuna

⎇ main renaser/kernel/src/memory/allocator.rs Rust · 42 siq'ikuna · 2.0 KB Ñawpa willay Pi imata llamkarqan ch'uya

feat: integra renaser (kernel SASOS bare-metal) al monorepo e2272c0ed · sergio ·

1// =============================================================================
2//  renaser :: kernel/src/memory/allocator.rs — Fase 3 :: el asignador global
3// -----------------------------------------------------------------------------
4//  Reutilizamos un algoritmo probado (`linked_list_allocator`) en lugar de
5//  arriesgar un asignador propio a bugs de fragmentacion. El heap es una region
6//  estatica que PERSISTE durante toda la vida del kernel.
7// =============================================================================
8
9use linked_list_allocator::LockedHeap;
10
11use crate::CeldaSync;
12
13/// 64 MiB de heap para el kernel. La arquitectura estimaba 16, pero `fontdue`,
14/// al analizar una tipografia real, exige mas holgura; el manejador de OOM —la
15/// franja naranja— fue justamente lo que delato esa cota demasiado corta.
16const TAM_HEAP: usize = 64 * 1024 * 1024;
17
18/// Region de respaldo del heap, alineada a pagina, residente en `.bss`. Su
19/// campo solo se alcanza via puntero crudo —asi lo exige `GlobalAlloc`—, de ahi
20/// el `allow(dead_code)`: la memoria se usa, aunque no por una via «normal».
21#[repr(align(4096))]
22#[allow(dead_code)]
23struct RegionHeap([u8; TAM_HEAP]);
24
25/// La memoria fisica del heap. Nace a ceros, no engorda el binario.
26static REGION_HEAP: CeldaSync<RegionHeap> = CeldaSync::nueva(RegionHeap([0u8; TAM_HEAP]));
27
28/// El asignador global. Todo `alloc::*` —`Box`, `Vec`, `BTreeMap`, `Arc`...—
29/// se apoya, en silencio, sobre este.
30#[global_allocator]
31static ASIGNADOR: LockedHeap = LockedHeap::empty();
32
33/// Funda el heap del kernel. Debe invocarse UNA sola vez, en el arranque,
34/// antes del primer uso de cualquier estructura de `alloc`.
35pub fn init() {
36    let inicio: *mut u8 = REGION_HEAP.puntero().cast::<u8>();
37    // SEGURIDAD: la region es estatica, de uso exclusivo del asignador, vive
38    // tanto como el kernel, y `init` se invoca una unica vez en el arranque.
39    unsafe {
40        ASIGNADOR.lock().init(inicio, TAM_HEAP);
41    }
42}