[eside-ghost] Desarrollando un cutre kernel...

EthDra ethdra en telefonica.net
Mar Sep 13 16:14:24 CEST 2005


Veamos si me explico... el boot sector se carga automagicamente en 
0x7C00, este boot sector d marras carga el resto del kernel 0x1000 (una 
direccion tan buena como otra cualkiera no? xD) y salta a la primera 
instruccion en 0x1000. Ahi esta el entry point del kernel, q inicializa 
las movidas y salta a codigo c, este donde este (d averiguar donde esta 
se encargar el linker). En la GDT hay dos descriptores, uno para datos y 
otro para codigos, identicos (excepto en el tipo, obviamente) q abarcan 
todo el rango, desde 0 hasta 0xFFFFFFFF, asi que para que el kernel 
funcione, al linker le digo q toda la movida empieza a partir de 0x1000 
y todo va bien. Pongo un string como variable local y la coje bien, 
teniendo en cuenta q el puntero esta en la pila y q el string como tal 
andara alla por 0x011E dentro del fichero del kernel, y en 0x111E en 
memoria, y como el linker sabe q el tema empieza en 0x1000 coje 
correctamente el string tomando la direccion 0x111E.
El problemo viene al usar una variable global, esta vez el puntero no 
esta en la pila, sino en memoria, alla por 0x01F4 dentro del fichero, 
asi que lo q hace es cargar en un registro el contenido de 0x11F4, q es 
0x111E, con lo cual, todo es aparentemente correcto excepto por el pqño 
detalle de q no funciona..
Espero q se entienda lo q e explicado, pq io mismo me e liado :S
y si, publicare en codigo fuente y una especie de blog con 
consideraciones y problemas durante el desarrollo... si alguien me 
ofrece hosting php4+mysql gratis... :D

Se despide,
  EthDra

Cymo escribió:

>>Bueno, como apaño podria valer, puedo copiar una variable local a una
>>direccion prefijada y luego acceder a piñon, pero es una solucion
>>bastante warra, a mi parecer.
>>    
>>
>Ciertamente.
>  
>
>>Ademas, q no hay ningun motivo aparente
>>para que las variables globales no funcionen :S
>>    
>>
>
>A mi se me ocurre una. Así, a bote pronto. Como sabemos todos y todas,
>las variables locales se crean en pila, pero las globales no, van en
>una zona de memoria aparte. Yo no sé donde cargas tu kernel (me
>refiero a la dirección de memoria), pero habría que ver como
>relocalizar esas direcciones. Quicymo (versión de quicir):
>
>---------------------- base de la memoria
>Dir: 0 GDT y otras movidad de Arqui que no recuerdo
>Dir: x EthDra->OtrasMovidas
>Dir y: EthDra->GetKernel();
>Resto de la memoria
>--------------------- Fin de la memoria
>
>Por tanto, si las direcciones de las variables globales son relativas
>al comienzo del kernel (o absolutas desde el kernel, según se mire),
>tendrá que haber algún mecanismo para relocalizar dichas variables y
>sumarles el desplazamiento (dirección y) desde la dirección cero,
>hasta la que ocupa el kernel ... ¿nop?
>_______________________________________________
>eside-ghost mailing list
>eside-ghost en deusto.es
>https://listas.deusto.es/mailman/listinfo/eside-ghost
>
>
>  
>




Más información sobre la lista de distribución eside-ghost