Mostrando entradas con la etiqueta crear disco booteable. Mostrar todas las entradas
Mostrando entradas con la etiqueta crear disco booteable. Mostrar todas las entradas

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