Foro de elhacker.net

Programación => ASM => Mensaje iniciado por: Vaagish en 12 Diciembre 2013, 18:24 pm



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?  :o


Tí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..  :xD

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..

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
Al ensamblar esto para x86 va generar  0x03c3.
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
Que va generar una instruccion de 2 o mas bytes (no tengo desensamblador de arm a mano ni ensamblador)
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;
Si compilas ese codigo para x86 va generar algo muy parecido a "add eax, ebx" o tal vez algo diferente pero con el mismo sentido. Depende del contexto, de la optimizacion del compilador. Si el compilador es bueno y tiene buena optimizacion, y esa linea de codigo es codigo basura totalmente irrelevante para lo que se esté haciendo, tal vez ni genere nada.

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
  1. mov ax, 0x07c0
  2. mov ds, ax
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
dw  0xAA55
mh... son 510 mas 2 bytes de la firma de un bootloader.

3)El inicio podria ser algo como:
Código:
use16
  org   0
  jmp  0x07C0:start
start:
  mov  ax, cs
  mov  ds, ax
  mov  es, ax


Citar
estoy en masm32
NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

eso 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
  1. .model TINY
  2.  
  3. .code
  4. _Main:
  5.  
  6. mov ax, 7C00h ; CARGAR EN 7C00H
  7. mov ds, ax
  8. mov ax, 1301h ; FUNCION 13, MODO 01
  9. mov bx, 000Ah ; PAGINA 00, COLOR 10 (VERDE CHILLON)
  10. mov cx, 11 ; TAMAÑO DEL STRING
  11. mov dx, 0202h ; FILA 02, COLUMNA 02
  12. push cs
  13. pop es
  14. mov bp, _MSG ; DIRECCION DEL STRING
  15. int 10h ; INTERRUPCION DEL BIOS
  16.  
  17. _MSG:
  18. db "Cargando...", 0
  19. SinUsar BYTE 474 dup(?)
  20.  
  21. _Exit:
  22. db 55h
  23. db 0AAh
  24.  
  25. end _Main

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
  1. jmp 07C0h:_MAIN
  2.    mov ax, cs ; ''
  3.    mov ds, ax ; ''
  4.    mov es, ax ; ''

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
  1. org 0
  2. mov ax, 07C0h
  3. ; Update the segment registers
  4. mov ds, ax ; ''

Para NASM:
Código
  1. [BITS 16] ; Ensamblar en 16 Bits
  2. [ORG 0]
  3.  
  4. jmp 07C0h:_MAIN     ; Saltar el hilo principal a la posicion 07C0h
  5.  
  6. _MAIN:
  7. ; Update the segment registers
  8.    mov ax, cs ; ''
  9.    mov ds, ax ; ''
  10.    mov es, ax ; ''

Felicidades a todos en las fiestas! Gracias por las ayudas! Saludos!!  ;D