e2272c0ed3
renaser —kernel asíncrono de espacio de direcciones único, no-POSIX, `no_std` x86_64— entra al monorepo como su PROPIO workspace de Cargo, no fusionado: usa toolchain nightly, target `x86_64-unknown-none` y `panic = "abort"`, incompatibles con los perfiles globales de brahman. - `renaser/` — copia del proyecto (sin su `.git`; el repo original conserva su historia standalone). Workspace propio con su `rust-toolchain.toml` y `.cargo/`. - `exclude = ["renaser"]` en el workspace de brahman: Cargo lo trata como ajeno. - El kernel de renaser path-depende `mirada-layout` cruzando la frontera de workspace — primer núcleo compartido. Semilla de la Fase 8 (compositor): geometría de teselado compartida, framebuffer nativo de renaser; smithay se queda en el lado Linux. Verificado: `cargo build -p boot` compila kernel + imagen UEFI con mirada-layout enlazado para bare-metal. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
43 lines
2.0 KiB
Rust
43 lines
2.0 KiB
Rust
// =============================================================================
|
|
// renaser :: kernel/src/memory/allocator.rs — Fase 3 :: el asignador global
|
|
// -----------------------------------------------------------------------------
|
|
// Reutilizamos un algoritmo probado (`linked_list_allocator`) en lugar de
|
|
// arriesgar un asignador propio a bugs de fragmentacion. El heap es una region
|
|
// estatica que PERSISTE durante toda la vida del kernel.
|
|
// =============================================================================
|
|
|
|
use linked_list_allocator::LockedHeap;
|
|
|
|
use crate::CeldaSync;
|
|
|
|
/// 64 MiB de heap para el kernel. La arquitectura estimaba 16, pero `fontdue`,
|
|
/// al analizar una tipografia real, exige mas holgura; el manejador de OOM —la
|
|
/// franja naranja— fue justamente lo que delato esa cota demasiado corta.
|
|
const TAM_HEAP: usize = 64 * 1024 * 1024;
|
|
|
|
/// Region de respaldo del heap, alineada a pagina, residente en `.bss`. Su
|
|
/// campo solo se alcanza via puntero crudo —asi lo exige `GlobalAlloc`—, de ahi
|
|
/// el `allow(dead_code)`: la memoria se usa, aunque no por una via «normal».
|
|
#[repr(align(4096))]
|
|
#[allow(dead_code)]
|
|
struct RegionHeap([u8; TAM_HEAP]);
|
|
|
|
/// La memoria fisica del heap. Nace a ceros, no engorda el binario.
|
|
static REGION_HEAP: CeldaSync<RegionHeap> = CeldaSync::nueva(RegionHeap([0u8; TAM_HEAP]));
|
|
|
|
/// El asignador global. Todo `alloc::*` —`Box`, `Vec`, `BTreeMap`, `Arc`...—
|
|
/// se apoya, en silencio, sobre este.
|
|
#[global_allocator]
|
|
static ASIGNADOR: LockedHeap = LockedHeap::empty();
|
|
|
|
/// Funda el heap del kernel. Debe invocarse UNA sola vez, en el arranque,
|
|
/// antes del primer uso de cualquier estructura de `alloc`.
|
|
pub fn init() {
|
|
let inicio: *mut u8 = REGION_HEAP.puntero().cast::<u8>();
|
|
// SEGURIDAD: la region es estatica, de uso exclusivo del asignador, vive
|
|
// tanto como el kernel, y `init` se invoca una unica vez en el arranque.
|
|
unsafe {
|
|
ASIGNADOR.lock().init(inicio, TAM_HEAP);
|
|
}
|
|
}
|