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
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
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://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