[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