Título: Duda con bootsect.s - Linux Publicado por: Vaagish en 12 Diciembre 2013, 18:24 pm En el archivo bootsect.s (archivo fuente de Linux) dice esto como comentario:
Citar ! bootsect.s is loaded at 0x7c00 by the bios-startup routines, and moves ! itself out of the way to address 0x90000, and jumps there. o sea, que este es el primer archivo que ejecuta la bios cuando se inicia la pc, no? Como sabe la bios cual es el primero de todos en ser cargado? Y por que son archivos ".s"? Son igual de validos si le pongo ".asm"? Saludos! Título: Re: Duda con bootsect.s - Linux Publicado por: _Enko en 12 Diciembre 2013, 19:34 pm La extención no tiene nada que ver.
La bios lo que hace es cargar a esa direccion de memoria (0x7C00) los primeros 512b del disco elegído como aranque. Por eso, 1)A la bios no le interesa que tipo de archivo es... mejor dicho, ni siquiera es un archivo. Son los primeros 512b del disco. 2)Vos lo elegis en el setup de la bios, CD, HD, USB, etc... 3)Estas confundiendo codigo fuente con binario. La extención no importa. Lo importante que en los primeros 512b se carguen a memoria el resto del bootloader y se salte allí. Saludos. Título: Re: Duda con bootsect.s - Linux Publicado por: Vaagish en 12 Diciembre 2013, 19:41 pm Citar La bios lo que hace es cargar a esa direccion de memoria (0x7C00) los primeros 512b del disco elegído como aranque. Bien,, entiendo.. y como se pone el archivo deseado en los primeros 512b del disco elegido?? Cuando uno va a instalar un SO, el archivo ya tiene que estar ahí, en los primeros 512b..Citar Estas confundiendo codigo fuente con binario Por? No es el binario el que se carga en 0x7C00? :oTítulo: Re: Duda con bootsect.s - Linux Publicado por: _Enko en 12 Diciembre 2013, 19:57 pm 1)Hay un par de herramientas que te dejan escribir directamente sobre el disco. Si lo haces sobre tu disco rigido, la pc va dejar de arrancar seguramente.
Si usas una máquina virtual, simplemente haces que tu binario ocupe 1.44mb, en los primeros 512b pones el codigo que necesites. Luego colocas esa imagen como si fuera un disquet virtual y pones para que la maquina virtual arranque desde disquet. 2)Si, pero el codigo fuente puede estar hecho en distintos compiladores/ensambladores. Título: Re: Duda con bootsect.s - Linux Publicado por: Vaagish en 12 Diciembre 2013, 20:57 pm Gracias por responder otra vez _Enko..
Citar Si lo haces sobre tu disco rigido, la pc va dejar de arrancar seguramente. No lo dudo.. :xDCreo que capte lo que decís.. te cuento la idea, tengo planeado entender el código de Linux, y armar un pseudo sistema operativo.. claro esta, me falta mucho.. pero creo que estoy en camino.. ahora me surgió otra duda, para no abrir otro tema la hago acá.. Como es posible que un SO, el cual contiene instrucciones en ASM funcione sobre diferentes arquitecturas? Digamos, cuando instala windows, no se fija para que procesador es, simplemente elige de 32 o 64 bits.. Se que debo estar terriblemente equivocado, pero no entiendo.. EDITO: Se que dije que era una duda, pero.. pregunto,, si hago mi propio boot, y le hago mandar un mensaje en la pantalla, (con interrupciones de la BIOS claro esta..) debería verse no? Solo hago que muestre ese mensaje aclaro, sin mas.. Saludos! Título: Re: Duda con bootsect.s - Linux Publicado por: _Enko en 12 Diciembre 2013, 21:33 pm Citar Creo que capte lo que decís.. te cuento la idea, tengo planeado entender el código de Linux, y armar un pseudo sistema operativo.. claro esta, me falta mucho.. pero creo que estoy en camino.. Te recomendaría leer el manual de intel de arquitectura de sistema.http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html Y luego algun libro teorico sobre desarollo de sistemas operativos (mas que nada para tener el panorama teorico completo) Luego para asuntos practicos está la wiki OSDEV. Citar Como es posible que un SO, el cual contiene instrucciones en ASM funcione sobre diferentes arquitecturas? 1)Un SO no contiene instrucciones asm, sino instrucciones de lenguaje máquina. Las instrucciones asm son acrónimos a instrucciones de lenguaje máquina para simplificar la cosa. Pero no es lo mismo.Suponte este ejemplo. Código: add eax, ebx Que para un procesador x86 significa sumar a eax el contenido de ebx. Pero si ejecutas eso por ejemplo en un celular con arm7 puede pasar dos cosas. 1)que tire un error. 2)que haga algo totalmente diferente. Si quieres ejecutar el mismo codigo en un procesador arm7 tendras que ensamblar este codigo Código: ADD r1,r2 Pero 99.9% seguro que lo que genere el ensamblador de arm no va a ser 0x03c3. De ahí si tienes siguiendo el ejemplo usando lenguaje C Código: varA += varB; La ventaja es que puedes tomar ese mismo codigo en C, usar un compilador de C para ARM y te va generar la instruccion correspondiente para un procesador ARM. Esa es la diferencia, si escribes en asm para x86, terminas teniendo siempre binarios para x86. Pero si usas C por ejemplo, depende para que estes compilando es el binario que termines obteniendo. Citar Se que dije que era una duda, pero.. pregunto,, si hago mi propio boot, y le hago mandar un mensaje en la pantalla, (con interrupciones de la BIOS claro esta..) debería verse no? Solo hago que muestre ese mensaje aclaro, sin mas.. Totalmente. Te alcanzaría con un:"org 0x7c00" "llamar a la interrupcion que necesites". y listo. El tema es meter ese codigo en el bootsector del disco. Yo en mi práctica me resulto cómodo wmware, hacer que mi código ocupe 1.44mb y cargarlo como disquet. Título: Re: Duda con bootsect.s - Linux Publicado por: Vaagish en 12 Diciembre 2013, 22:10 pm Fa, se cerro la sesión y perdí todo lo escroto
Decía algo así.. Sos un capo Enko, muchas gracias! Yo estoy usando VirtualBox, pero cuando cree la maquina virtual, no le dije que SO era, lo deje como desconocido, capaz me complica la vida, sera cuestión de probar.. Quedo claro como el agua! Ya estoy bajando el manual de Intel! Citar Totalmente. Te alcanzaría con un: "org 0x7c00" "llamar a la interrupcion que necesites". y listo. El tema es meter ese codigo en el bootsector del disco. Yo en mi práctica me resulto cómodo wmware, hacer que mi código ocupe 1.44mb y cargarlo como disquet. Ya quiero empezar con la mia! I'm euphoric! ;D Título: Re: Duda con bootsect.s - Linux Publicado por: _Enko en 12 Diciembre 2013, 22:20 pm Citar Decía algo así.. Sos un capo Enko, muchas gracias! Yo estoy usando VirtualBox, pero cuando cree la maquina virtual, no le dije que SO era, lo deje como desconocido, capaz me complica la vida, sera cuestión de probar.. Na, eso ló único que hace es fijar la cantidad de ram que va usar la máquina virtual. Siempre luego lo puedes cambiar a mano.VirtualBox es quisquilloso con las imagenes de disquet. Creo que te obliga a que tengan un formato fat valido. Una opcion que no he utilizado sería tomar una imagen de un disquet valido y simplemente usando un editor hexadecimal reemplazar a mano el inicio con el binario de tu codigo. Bah, en realidad hay herramientas para eso pero ni idea cuales son. Citar Fa, se cerro la sesión y perdí todo lo escroto Alerta, Alerta!!!!Se han descubierto seciones de elhacker que castran!!!! Se recomienda a toda la población masculina de hackers mantener "todo lo escroto" lejos de este tipo de sesiones. Título: Re: Duda con bootsect.s - Linux Publicado por: Vaagish en 12 Diciembre 2013, 22:32 pm Citar Alerta, Alerta!!!! Se han descubierto seciones de elhacker que castran!!!! Se recomienda a toda la población masculina de hackers mantener "todo lo escroto" lejos de este tipo de seciones. Jajaja se,, es que te queres cortar un testículo cuando pasa eso :xD Bueno, voy a probar,, voy a hacer mis pruebas,, dentro de 10 años saco el SO.. :laugh: Título: Re: Duda con bootsect.s - Linux Publicado por: Vaagish en 20 Diciembre 2013, 00:06 am Capaz tendría que haber abierto otro tema, pero este no es tan viejo,, asi que le metemos acá ::)
Citar Totalmente. Te alcanzaría con un: "org 0x7c00" "llamar a la interrupcion que necesites". y listo. Estoy teniendo problemas con esto.. estoy en masm32,, cuando uso org 7C00h lo que hace es estirar el código un montón, en vez de desplazarlo a esa posición,, alguna sugerencia como hacer lo mismo pero si agrandar el archivo final?? PD: Cuando digo que org estira el codigo lo que hace es llenar con 0's la cantidad "deseada", por ejemplo, eso me puede servir para llegar a los 512 bytes que necesito... :silbar: EDITO:Na, perdón la molestia,, recién encontré algo que puede funcionar, pero no lo entiendo,, si alguien me lo explica, yo agradecido.. Código Dice que tiene el mismo resultado que ORG 0x7C0, Yo que se.. no lo entiendo.. Título: Re: Duda con bootsect.s - Linux Publicado por: _Enko en 20 Diciembre 2013, 16:46 pm mh... creo que te estas confundiendo de lo que verdaderamente hace un org.
Te conviene leer un poco mas de teoria, porque yo ya no la tengo presente en mi memoria xD 2) Para llegar a los 510 bytes tendrias que hacer algo tipo: Código: db 510 - $; dup 0 3)El inicio podria ser algo como: Código: use16 Citar estoy en masm32 NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOeso no te sirve, ensambla para windows unicamente. Necesitas un ensamblador que ensamble codigo de 16bit. No se si masm16 serviria.... fasm, nasm segurisimo. Título: Re: Duda con bootsect.s - Linux Publicado por: Vaagish en 20 Diciembre 2013, 18:50 pm Bueno, al final lo solucione así:
Código
Citar estoy en masm32 NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO Si, la verdad que todos los ejemplos estan en Nasm o Fasm,, pero ahora me da terrible pereza pasarme de sintaxis, aunque lo voy a tener que hacer.. Masm32 ensambla de 16 Bits si,, y/o linkea también,, (con link16.exe), despues hay que pasar eso por otra herramienta que es exe2bin (para sacar código binario, sin cabeceras de windows) mucho mas complicado que otros ensambladores,, pero bueno,, es la costumbre.. Bueno,, la cosa es que ahora funciona! (A medias) lo que hago es generar ese binario de 512 bytes, después abro un disco de la unidad A: con un visor hexadecimal, y en el sector 0 del disquette le meto el binario,, meto el disquette en la pc y la inicio ( tengo veintipico de PC's para hacer pruebas :p ) la cosa es que lo lee!!! (EA! EA! EA!!!) pero me imprime cualquier cosa menos "Cargando..." me salen unos caracteres raros,, como si la codificación no fuese la correcta por así decirlo.. ) Sugerencias?? Gracias man! Título: Re: Duda con bootsect.s - Linux Publicado por: xv0 en 20 Diciembre 2013, 23:50 pm El registro %bp esta concatenado con el segmento %ss, creo que hay puede estar el problema.
Si te soy sincero no lo entiendo de el todo, pero estoy leyendo los codigos del nucleo, y el segmento %ss lo dejan en cero, creo que el procesador multiplicaba el valor del segmento por 16 y luego sumaba la direccion o algo asi, pruebalo no puedo decirte mas, pero si no muestra los caracteres buenos seguro que es porque no esta apuntando bien. Un saludo. Título: Re: Duda con bootsect.s - Linux Publicado por: Vaagish en 21 Diciembre 2013, 00:22 am Citar El registro %bp esta concatenado con el segmento %ss, creo que hay puede estar el problema. Sip, todo el **** día y no lo resuelvo aun.. pero le saque el push y el pop (para ver que pasaba) y salen otros caracteres,, o sea que apunta a otro lado ahora.. lo voy a resolver, esto no va a quedar así >:( Saludos!! EDITO: Aca debe estar la solucion,, pero ya tengo 8hs de continuo con esto y no doy mas,, lo sigo cuando me lea esto: Citar http://stackoverflow.com/questions/4903906/assembly-using-the-data-segment-register-ds http://wiki.osdev.org/Real_Mode http://www.internals.com/articles/protmode/realmode.htm Título: Re: Duda con bootsect.s - Linux Publicado por: xv0 en 21 Diciembre 2013, 06:14 am Primero tienes que leer las funciones de cada segmento, veras que se concatenan con los registros, yo revisaria el push y el pop a esos segmentos y estate seguro de lo que estas haciendo.
Tu dijiste que no mostraban los caracteres correctos, bien el problema puede ser por el segmento %ss, que es usado por el stack %esp y %ebp, como estas en 16 bits %sp y %bp. E leido esos papers que citas, veras la formula que tiene la CPU para calcular los offsets, si el segmento %ss tiene algun valor o lo que sea, apuntara mal. Este comentario es casi como el anterior pero es para que veas. Como el codigo no es muy extenso es facil de buscar los problemas, los parametros no son, asi que seguro que son los segmentos, si no es el %ss sera otro ves comprobando, asi lo entienderas todo. Un saludo. Título: Re: Duda con bootsect.s - Linux Publicado por: Vaagish en 23 Diciembre 2013, 22:12 pm Citar Primero tienes que leer las funciones de cada segmento, veras que se concatenan con los registros, yo revisaria el push y el pop a esos segmentos y estate seguro de lo que estas haciendo. Si, evidentemente me falta mucho,, estuve leyendo un poco esos enlaces, y otros,, al final me pase a nasm,, (en realidad no tiene mucha diferencia y se pueden usar los dos) el asunto es que con nasm se puede usar esto por ejemplo: Código
y con eso queda solucionado.. igual me falta aprender mucho sobre los segmentos, y sobre asm en general.. pero bue, de a poco.. ACTUALIZACIÓN: Para MASM hacer: Código
Para NASM: Código
Felicidades a todos en las fiestas! Gracias por las ayudas! Saludos!! ;D |