lunes, 14 de abril de 2014

Como crear un disco booteable en VirtualBox

Como crear un disco booteable en VirtualBox

Una computadora cuando arranca carga el sector 0 del primer disco booteable.
Un disco para que sea booteable,  el sector (0) de booteo debe comenzar con codigo (asembler x86) y termina con 0XAA55.



En un disco virtual de VirtualBox en el byte 0x158 como se ve en la figura, se encuentra el puntero al primer sector del disco.


A continuación vamos a escribir un pequeño programa en assembler la computadora carga el sector 0 en la dirección 0x7C00 y transfiere el control a esta dirección, el programa escribe en la pantalla "Hola Mundo!" llamando a la interrupción del BIOS 10H, ya que a esta altura no existe ningún SO cargado.


[BITS 16]

[org 0x7C00]
 start: 
     mov si,MSG    
call print_string    
jmp $ 

print_string:           ; Espera un mensaje terminado en null en si    
mov al,[si]    
or al,al    
jz  .end 
     inc si    
call print_char 
     jmp print_string
 .end:    
retn

print_char: 
    mov ah,0x0E         ; Especifica que caracter queremos escribir en pantalla 
    mov bl,0x07           ; Especifica el color del texto    
mov bh,0x00          ; Numero de pagina. 
    int 0x10                   ; Interrupcion del  BIOS
     retn
;data    

MSG db 'Hola Mundo!',0x0A,0
TIMES 510 - ($ - $$) db 0

DW 0xAA55




A este programa lo compilamos con el nasm mediante la sentencia:


nasm boot.asm -f bin -o boot.bin



Obtenemos un archivo boot.bin que ocupa exactamente 512 bytes.



Para crear el disco de Virtual Box arrancamos el programa y creamos una nueva VM ( ej. boot) en Type elegimos "other" y en versión elegimos "other/unknow".Elegimos el disco de longitud fija. Buscamos el archivo os.vdi en la carpeta "Virtualbox VMs"



Ahora debemos escribir el archivo "boot.bin" en el sector 0 del disco de Virtualbox para facilitar esta tarea se ha escrito un script en python.




#!/usr/bin/python

from struct import *

import sys, getopt ,os

l = long
def main(argv):
inputfile = ''
   outputfile = ''
try:
   opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
    except getopt.GetoptError:
     print 'vdiboot.py -i <inputfile> -o <outputfile>'
     sys.exit(2)
  for opt, arg in opts:
if opt == '-h':
print 'vdiboot.py -i <inputfile> -o <outputfile>'
   sys.exit()
     elif opt in ("-i", "--ifile"):
          inputfile = arg
     elif opt in ("-o", "--ofile"):
          outputfile = arg
leng = os.path.getsize(inputfile)
f = open(outputfile,'rb+')
g = open(inputfile,'rb')
f.seek(0x158)
byte = f.read(4)
l = unpack("<l", byte)
f.seek(l[0])
sector0 = g.read(leng)
f.wr ite(sector0)
print 'escribiendo sector ....'
f.close
g.close
if __name__ == "__main__":
        main(sys.argv[1:])

La secuencia de comandos para realizar toda la tarea es:

nasm boot.asm -f bin -o boot.bin
./vdiboot.py -i boot.bin -o boot.vdi
cp ./boot.vdi /home/usuario/VirtualBox\ VMs/boot/

Lanzamos en VirtualBox el sistema boot.vdi y podemos observar en la pantalla "Hola Mundo!


Bibligrafia


http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders
http://www.codeproject.com/KB/tips/boot-loader.aspx?fid=1541607&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=1#_Toc231383187


No hay comentarios:

Publicar un comentario