diag(renaser): trazado por serie del arranque + DMA salta la página 0
Para localizar dónde colapsa el kernel en máquinas que no son la del autor, cada hito de `kernel_main` deja una traza por COM1 (con el panic-handler-a-serie de antes, ya tenemos boot trace + autopsia). - `baliza::Serie` se hace `pub(crate)` para que cualquier módulo deje trazas con `writeln!(baliza::Serie, ...)`. - `kernel_main`: traza tras adoptar el framebuffer, encender la baliza, fundar GDT/IDT/PIC, fundar el heap, fundar teclado/reloj/texto, publicar la consola, iniciar disco y almacén, arrancar el ratón, crear el ejecutor, cargar el userspace y arrancar el reactor. Y un volcado de `physical_memory_offset` + `region_dma` al inicio. - `drivers::disco::init`: registra offset, región, base de la arena y número de marcos disponibles. - Endurecimiento: `disco::init` ahora salta SIEMPRE la primera página física al elegir la base de la arena DMA. Algunos cargadores la dejan sin mapear como protección NULL; un marco DMA ahí se traduce a una dirección que peta al desreferenciar. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -131,10 +131,23 @@ static ASIGNADOR: Once<Mutex<AsignadorMarcos>> = Once::new();
|
||||
/// el asignador de marcos sobre la region de RAM libre que el cargador reporto.
|
||||
/// Una sola vez, antes de montar el disco.
|
||||
pub fn init(offset_fisico: u64, region_inicio: u64, region_fin: u64) {
|
||||
use core::fmt::Write;
|
||||
OFFSET_FISICO.store(offset_fisico, Ordering::Relaxed);
|
||||
let base = alinear_arriba(region_inicio, PAGINA);
|
||||
// Saltar SIEMPRE la primera pagina fisica: algunos cargadores la dejan sin
|
||||
// mapear como proteccion contra punteros NULL — un marco DMA ahi seria una
|
||||
// bomba en cuanto el driver lo desreferenciase via el mapeo alto.
|
||||
let base = alinear_arriba(region_inicio.max(PAGINA), PAGINA);
|
||||
let disponibles = region_fin.saturating_sub(base) / PAGINA;
|
||||
let total = (disponibles as usize).min(MAX_MARCOS);
|
||||
let _ = writeln!(
|
||||
crate::baliza::Serie,
|
||||
"disco :: init offset={:#x} region=[{:#x}, {:#x}) base={:#x} marcos={}",
|
||||
offset_fisico,
|
||||
region_inicio,
|
||||
region_fin,
|
||||
base,
|
||||
total,
|
||||
);
|
||||
ASIGNADOR.call_once(|| {
|
||||
Mutex::new(AsignadorMarcos {
|
||||
base,
|
||||
|
||||
Reference in New Issue
Block a user