lunes, 11 de mayo de 2015

Interrupciones en modo real

Interrupciones en modo real

Cuando se presiona una tecla se genera una interrupción de hardware. en este caso la interrupcion de hardware 09, la tabla de interrupciones esta a partir de la dirección de memoria 0x00, en la dirección 0x09 x 4 va estar el vector de interrupción que apunta a la rutina que atiende a la interrupción de teclado en este caso ¨keyhandler¨ .
Leemos el código de la tecla presionada "Scan code" no el código ascii, y lo imprimimos en pantalla.

El programa en assembler int.asm es el siguiente.



 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
[ORG 0x7c00]      ; add to offsets
   jmp start
 
   %include "print.inc"
 
start:   
   xor ax, ax   ; make it zero
   mov ds, ax   ; DS=0
   mov ss, ax   ; stack starts at 0
   mov sp, 0x9c00   ; 200h past code start
 
   mov ax, 0xb800   ; text video memory
   mov es, ax
 
   cli      ;no interruptions
   mov bx, 0x09   ;hardware interrupt #
   shl bx, 2   ;multiply by 4
   xor ax, ax
   mov gs, ax   ;start of memory
   mov [gs:bx], word keyhandler
   mov [gs:bx+2], ds ; segment
   sti
 
   jmp $      ; loop forever
 
keyhandler:
   in al, 0x60   ; get key data
   mov bl, al   ; save it
   mov byte [port60], al
 
   in al, 0x61   ; keybrd control
   mov ah, al
   or al, 0x80   ; disable bit 7
   out 0x61, al   ; send it back
   xchg ah, al   ; get original
   out 0x61, al   ; send that back
 
   mov al, 0x20   ; End of Interrupt
   out 0x20, al   ;
 
   and bl, 0x80   ; key released
   jnz done   ; don't repeat
 
   mov ax, [port60]
   mov  word [reg16], ax
   call printreg16
 
done:
   iret




port60   dw 0
 
   times 510-($-$$) db 0  ; fill sector w/ 0's
   dw 0xAA55        ; req'd by some BIOSes
;==========================================

El print.inc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
;----------------------
dochar:
   call cprint         ; print one character
sprint:
   lodsb      ; string char to AL
   cmp al, 0
   jne dochar   ; else, we're done
   add byte [ypos], 1   ;down one row
   mov byte [xpos], 0   ;back to left
   ret
 
cprint:   
   mov ah, 0x0F   ; attrib = white on black
   mov cx, ax    ; save char/attribute
   movzx ax, byte [ypos]
   mov dx, 160   ; 2 bytes (char/attrib)
   mul dx      ; for 80 columns
   movzx bx, byte [xpos]
   shl bx, 1    ; times 2 to skip attrib
 
   mov di, 0        ; start of video memory
   add di, ax      ; add y offset
   add di, bx      ; add x offset
 
   mov ax, cx        ; restore char/attribute
   stosw              ; write char/attribute
   add byte [xpos], 1  ; advance to right
 
   ret
 
;------------------------------------
 
printreg16:
   mov di, outstr16
   mov ax, [reg16]
   mov si, hexstr
   mov cx, 4   ;four places
hexloop:
   rol ax, 4   ;leftmost will
   mov bx, ax   ; become
   and bx, 0x0f   ; rightmost
   mov bl, [si + bx];index into hexstr
   mov [di], bl
   inc di
   dec cx
   jnz hexloop
 
   mov si, outstr16
   call sprint
 
   ret
 
;------------------------------------
A este programa lo asemblamos con la siguiente linea de codigo:


$ nasm -o int.img int.asm

Para correrlo desde VirtualBox podemos hacer los pasos que se hicieron en la seccion Paso a Modo protegido  o genramos una maquina Virtual en sistema operativo seleccionamos


Luego vamos a la pestaña Storage y le agregamos un Floppy Disk




Para el Floppy Disk elegimos la imagen int.img ya generado arrancamos la Maquina Virtual


Aparecerá una pantalla negra y cuando presionemos una tecla se imprime el "Scan Code"



viernes, 8 de mayo de 2015

Crear una MV DOS en VirtualBox

Crear una MV DOS en VirtualBox



Muchas veces es necesario trabajar con maquinas en modo real, el DOS es un sistema operativo que trabaja en modo  real.
Usamos el FreeDOS el cual lo podemos descargar de aqui.

Una vez descargado el archivo fd11src.iso iniciamos VirtualBox


  • Elegimos la pestana del procesador y reducimos la   "Execution Cap" de  100 % a 40 %.





  • Cambiamos el adaptador de red  de  "NAT" a "Bridged Adapter".



Luego procedemos como como cualquier otro sistema operativo, seleccionamos instalar a "harddisk"
  • Y el CD de instalación de FreeDOS  bootea la nueva maquina virtual.




  • Elegimos crear el disco C  "Create Drive C:" desde el menu de booteo.


  • Esto inicia la instalacion de  Free FDISK. Permitimos a Free FDISK soporte de  FAT32 respondiendo "Y"".




  • Creamos una particion  DOS eligiendo  "1".


  • Como la primera partición, y también debe ser la partición primaria. Elegimos  "1".


  • Si es la unica particion contestamos y queremos usar todo el espacio del disco respondemos: "Y".


  • Free FDISK muestra el resultado


  • Reboot.


Para intercambiar archivos entre FreeDOS y el Host habilitamos la red y un servidor FTP en el FreeDOS.

Habilitar la red 

Por default VirtualBox use el adaptador de red AMD's PCnet Fast III (Am79C973) . Este es un driver de paquetes libre que también usa FreeDOS. Para activarlo:
  • Tipee "auto" para abrir el editor y editar  AUTOEXEC.BAT

  • Remover "REM" en la linea mostrada en la figura, de tal forma que queda.
LH PCNTPK INT=0x60
  • Para habilitar el DHCP cliente remover "REM" de la siguiente linea y queda
DHCP
  • Reboote y deberá cargar una dirección IP
  • Para verificar la dirección IP vea el archivo C:\fdos\mtcp.cfg


Configurar el  FTP server

Para intercambiar archivos entre el  host y el FreeDOS guest, se debe iniciar el servidor FTP en DOS. FreeDOS incluye el programa TCP ftpsrv de Michael B. Brutman. Para usarlo debemos configurarlo.
FreeDOS 1.1 guarda la configuración de  mTCP en el archivo MTCP.CFG debemos realizar los siguientes comandos:
copy C:\FDOS\DOC\MTCP\SAMPLE.CFG C:\FDOS\MTCP.CFG
edit C:\fdos\mtcp.cfg
  • Activamos y seteamos las siguientes opciones:
MTU 1472
ftpsrv_password_file c:\fdos\ftppass.txt
ftpsrv_log_file c:\fdos\ftpsrv.log
FTPSRV_FILEBUFFER_SIZE 16
FTPSRV_TCPBUFFER_SIZE 16
FTPSRV_PACKETS_PER_POLL 2
  • Ahora creamos y editamos el archivo de  password  para el FTP server:
edit C:\fdos\ftppass.txt
  • IUsamos user como usuario y password como password para acceder a todos los archivos, el archivo ftppassword.txt quedaria asi:
user     password      [none]     [any]      all

Iniciamos el FTP server

  • Iniciamos el  FTP server con el siguiente comando:
ftpsrv
Ftpsrv.png
  • Nos conectamos desde una consola Linux con el usuario y password especificados en el archivo  C:\FDOS\ftppass.txt.



Ejecutamos un programa

En el Host linux editamos el siguiente programa para imprimir "Hello world"
; Guardarlo como dos.asm, assemble con nasm -f bin -o dos.com dos.asm
ORG       100h
Start:    JMP Main
strOfs    DB 'hello, world'
strLen    EQU $-strOfs   
Main:     MOV SI,strOfs  ; offset address de la cadena
          MOV CX,strLen  ; longitud de la cadena
          MOV AX, 0B800h ; segment address del buffer de video
          MOV ES, AX     ; se almacena en extra segment register
          MOV DI, 160    ; posicion en la pantalla 
          CLD            ; 
nextChar: LODSB          ; carga AL de DS:[SI], e incrementa SI
          STOSB          ; almacena AL en ES:[DI], incrementa DI
          INC DI         ; salta sobre el byte de atributo
          LOOP nextChar  ; repite hasta CX=0
          MOV AH,00h     ; BIOS function GET KEYSTROKE
          INT 16h        ; Presione una tecla para continuar
          RET            ; Sale del programa
Lo asemblamos con:  nasm -f bin -o dos.com dos.asm y luego lo transferimos a la maquina virtual DOS.
En la maquina virtual DOS lo ejecutamos

Y imprime "Hello World"

Bibliografia


http://www.codeproject.com/Articles/45788/The-Real-Protected-Long-mode-assembly-tutorial-for