Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Soporte Técnico - Laboratorio Nº3
Soporte Técnico - Laboratorio Nº3
Preparado por:
Profesor:
● Jorge, Javier
1
Laboratorio: Compilar y correr una aplicación sin SO
2
Figura N° 4. Ejecución de “bios_hello_world” en la máquina virtual.
Real mode
3
Como se muestra en la Figura N° 5, el programa imprime el string “hello world” en
pantalla. A partir del código del programa, mostrado en la Figura N° 7, se observa
que en la línea N° 6 se carga el string (representado por msg, líneas N° 16 y N° 17)
en una dirección de memoria apuntada por el registro %si. En la línea N° 7 se carga
la función “0x0E” del grupo de interrupciones 0x10 (Video services). Está función
(0x0E) imprime un caracter almacenado en %al, en la posición del cursor y avanza el
cursor en una posición. Desde la línea N° 9 hasta la N° 13 se tiene un bucle que se
encarga de imprimir el string cargado anteriormente (línea N° 6). La instrucción lodsb
(línea N° 9) carga un byte desde la dirección de memoria indicada en el registro %si,
en el registro %al, e incrementa el registro %si en un byte. Si el byte cargado en %al
es cero, es decir fin del string (línea N° 10), la ejecución salta hacia la instrucción hlt
(línea N° 11) y el procesador deja de ejecutar instrucciones y entra en modo stop
(halt, línea N° 15). Si el byte cargado en %al no es nulo, se ejecuta la función de
interrupción 0x0E (línea N° 12) y se imprime el caracter en pantalla.
Con fin de estudiar las diferencias entre la nomenclatura AtyT e Intel y el uso de
GAS y NASM, el programa anterior fue reescrito en formato Intel y ensamblado con
NASM. El código fue nombrado nasm_hello_world.asm.
4
Figura N° 9. código de “nasm_hello_world.asm”, formato Intel.
5
Figura N° 12. Inicio de depuración con gdb.
Para depurar el programa sin iniciarlo desde gdb, se utilizó el comando target
remote localhost:1234. Esto inicializó la depuración del programa ejecutado
anteriormente. Luego se colocó un breakpoint en la dirección de arranque y se inició
la ejecución del programa para frenar en esa dirección.
6
Figura N° 15. Contenido del registro %si al inicio del programa.
7
Se puede observar que efectivamente el registro %si apunta a la dirección donde
está almacenado el string a imprimir. El primer byte (“H”) es almacenado en %al,
luego de ejecutar la instrucción.
Se puede observar que el contenido de %al (los primero 8 bits de %eax) es el byte
0x48, que representa el caracter “H” en codificación ASCII.
Figura N° 22. Impresión del caracter “H” luego de ejecutar la función de interrupción.
8
Como se mencionó anteriormente, al ejecutarse la instrucción lodsb, el contenido
del registro %si es incrementado en un byte. En la Figura N° 22 se observa el
contenido de %si, luego de imprimir el caracter “H” y antes de volver a ejecutar lodsb.
9
Figura N° 26. Contenido en %al luego de imprimir el último caracter.
10
Figura N° 28. Revisión del contenido en memoria, desde 0x7C0F hasta 0x7C1B.
Protected mode
11
Figura N° 31. Código de programa, a partir de la dirección de inicio.
12
Figura N° 33. Código de programa, seguido a deshabilitar interrupciones.
13
Figura N° 35. Macros CURSOR_POSITION y CLEAR.
14
Figura N° 37. Ejecución de instrucciones definidas en CLEAR y PUSH_ADX.
Como se muestra en la figura N° 35, dentro del macro CLEAR se invoca el macro
CURSOS_POSITION.
15
Figura N° 40. Macro PROTECTED_MODE.
16
A continuación se muestra la ejecución de las instrucciones declaradas en el
macro PROTECTED_MODE.
17
Finalmente, en la Figura N° 29 se observa que, luego de entrar en modo
protegido, se imprime el mensaje “hello world” ejecutando el macro
VGA_PRINT_SCREEN, el cual se muestra a continuación.
18
Figura N° 49. Programa luego de la primera iteración del bucle de impresión.
No fue posible correr en HW real los códigos aportados en el repositorio (Parte 1).
Por lo tanto, se modificó el código del programa “nasm_hello_world” (Parte 2, Paso
2, Figura N° 9) de acuerdo a:
19
https://stackoverflow.com/questions/47277702/custom-bootloader-booted-via-usb-driv
e-produces-incorrect-output-on-some-compute
20
El código fue ensamblado con NASM y grabado en la unidad con el comando dd.
21
BIOS/UEFI
22
La CSME es una plataforma de seguridad que se ejecuta en una CPU
separada dentro del procesador Intel. Proporciona funciones de seguridad y
administración para la plataforma, incluyendo el cifrado y la autenticación de
datos, la gestión de identidades y la protección contra amenazas de
seguridad.
El Intel MEBx, por otro lado, es una extensión de firmware de la BIOS que se
ejecuta en la plataforma del sistema. Proporciona una interfaz para la
configuración y la administración de las funciones de seguridad y
administración de la plataforma, incluyendo la gestión de contraseñas, la
configuración de la red y la solución de problemas.
23
Linker
1. ¿Qué es un linker? ¿qué hace ?
24
En la Figura N° 9 se muestra el uso de hexdump para analizar la imágen generada
a partir del mismo código.
Esta actividad fue realizada en “Laboratorio: Compilar y correr una aplicación sin
SO”, Parte 3.
Se utiliza para indicar que se desea generar un archivo binario como salida
en lugar del formato de archivo ejecutable convencional. El linker generará un
archivo binario que contiene el código y los datos del programa en su forma más
cruda y sin ningún formato específico para el sistema operativo o el procesador. Este
archivo binario puede ser cargado directamente en la memoria y ejecutado por el
procesador sin necesidad de ningún sistema operativo o capa de abstracción de
hardware adicional.
25
Modo Protegido
1. Crear un código assembler que pueda pasar a modo protegido (sin
macros).
26
Para tener dos descriptores de memoria diferentes, uno para cada segmento
de código y datos en espacios de memoria diferenciados, necesitarás definir y cargar
dos tablas de descriptores diferentes, una para el segmento de código y otra para el
segmento de datos.
3. Cambiar los bits de acceso del segmento de datos para que sea de solo
lectura, intentar escribir, ¿Qué sucede? ¿Qué debería suceder a
continuación? (Revisar el teórico) Verificarlo con gdb.
Los registros de segmentos se cargan con un dato de 16 bits donde los dos bits
menos significativos representan RPL (Requestor Privilege Level) cuya funcionalidad
es permitir que un programa pueda solicitar acceso a un segmento con un nivel de
privilegio diferente al del segmento actualmente activo. Los 14 bits más significativos
conforman el Selector el cuál apunta a una dirección de memoria de la tabla de
descriptores donde estará contenida la información del segmento.
Repositorio GitHub
https://github.com/felipx/syscom-tp3
27