Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
td3:bochs [2020/03/22 12:33] alpertron |
— (actual) | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| - | ===== Introducción ===== | ||
| - | El Bochs es un emulador de la arquitectura IA-32. Esta aplicación //Open Source// puede ser ejecutada en varias plataformas, | ||
| - | Una de las principales características que distinguen este emulador de otros como Virtual Box o VM Ware, es la funcionalidad de depuración, | ||
| - | |||
| - | Esta aplicación se puede instalar tanto en Windows como en Linux, aunque las opciones de configuración varían de un sistema al otro, debido principalmente a la forma de interactuar con el resto del host de desarrollo ( el "mundo exterior" | ||
| - | |||
| - | La versión de Windows incluye por defecto dos ejecutables, | ||
| - | Las versiones de Linux que se instalan a través de los gestores de paquetes solo suelen incluir el ejecutable para el modo normal, debiendo el usuario descargar los fuentes y compilarlo con las opciones correspondientes, | ||
| - | |||
| - | En la Cátedra solo se utilizará y brindará soporte, de la versión __// | ||
| - | |||
| - | La Cátedra provee una imágen de Linux ([[td3: | ||
| - | |||
| - | En los apartados subsiguientes se detalla el proceso de instalación y configuración, | ||
| - | |||
| - | ===== Instalación ===== | ||
| - | A continuación se detallan los pasos necesarios (ante problemas recuerde leer las [[td3: | ||
| - | - Descargar la versión homologada desde [[https:// | ||
| - | - Descomprimir el paquete de instalación en un directorio de trabajo temporario, mediante el comando:\\ < | ||
| - | * -x: Extrae el contenido del fichero. | ||
| - | * -z: Descomprime el contenido mediante gzip. | ||
| - | * -v: Muestra en pantalla todas las salidas del comando (modo verbose). | ||
| - | * -f: Especifica que fichero //tar// debe ser tomado como argumento. | ||
| - | * -C: Indica la ruta a la carpeta donde se desea descomprimir el fichero.\\ Para mayores detalles < | ||
| - | - Si la operación fue exitosa, se observará en **// / | ||
| - | ls </ | ||
| - | - Verificar que se disponen de todas las dependencias (librerías) necesarias para que la aplicación pueda ser instalada y funcionar correctamente.\\ < | ||
| - | sudo apt-get install nasm | ||
| - | sudo apt-get build-dep bochs</ | ||
| - | sudo apt-get install gtk-2.0</ | ||
| - | - A fin de ejecutar la aplicación desde cualquier ubicación en el sistema, sin necesidad de escribir la ruta de acceso completa, se puede agregar la misma a las variables de entorno globales del SO de la siguiente manera, segùn la instalación a realizar: < | ||
| - | | ||
| - | |||
| - | ==== Interfaz de depuración BOCHS ==== | ||
| - | Para la configuración de la interfaz de depuración interna de Bochs se deben seguir los siguiente lineamientos: | ||
| - | - El //script// **configure**, | ||
| - | ./configure --prefix=< | ||
| - | * **--prefix**: | ||
| - | * **--enable-x86-64**: | ||
| - | * **--enable-smp**: | ||
| - | * **--enable-usb**: | ||
| - | * **--enable-usb-ohci**: | ||
| - | * **--enable-debugger**: | ||
| - | * **--enable-disasm**: | ||
| - | * **--enable-x86-debugger**: | ||
| - | * **--disable-docbook**: | ||
| - | - Para finalizar la instalación solo resta ejecutar < | ||
| - | |||
| - | ==== Interfaz de depuración GDB ==== | ||
| - | Para disponer de la interfaz de depuración GDB, se deben repetir los pasos pasos detallados en [[bochs | Interfaz de depuracion BOCHS]], pero reconfigurando las siguientes opciones | ||
| - | * La carpeta de instalación debe ser diferente al seleccionado previamente, | ||
| - | * **--enable-gdb-stub**: | ||
| - | * **--enable-smp**: | ||
| - | Antes de ejecutar el comando //make//, se debe verificar que los paquetes **// | ||
| - | Adicionalmente, | ||
| - | |||
| - | ===== Configuración ===== | ||
| - | La configuración de la aplicación puede ser llevada a cabo fácilmente mediante su interfaz de edición, para inicializarla solo basta con ejecutar **bochs** y seleccionar la opción //Edit options// y una vez finalizada la edición guardar la configuración mediante //Save options to// en **.bochsrc** | ||
| - | ==== Depurador BOCHS ==== | ||
| - | A continuación se detallan las opciones más relevantes para utilizar con el depurador interno del Bochs. | ||
| - | * **Logfile options**: permite establecer los ficheros en los cuales se almacenarán los mensajes de información provistos por el depurador y la consola de control. Seleccionar la opción deseada e indicar el nombre del fichero en el cual se desea almacenar la información, | ||
| - | * **CPU Options**: esta configuración es una de las más importantes ya que establece que tipo de CPU se simulará. En la Cátedra se utilizará la siguiente configuración: | ||
| - | * //CPU configuration// | ||
| - | * //Emulated instructions per second (IPS)// **2500000** | ||
| - | * Las opciones no especificadas deben disponer de su valor por defecto | ||
| - | * **CPUID Options**: establece las caracterìsticas del CPU a simular | ||
| - | * //Support for SSE instruction set// **sse4_2** | ||
| - | * //Support for XSAVE instruction // **yes** | ||
| - | * //Support for XSAVEOPT instruction // **yes** | ||
| - | * //1G pages support in long mode // **yes** | ||
| - | * //PCID support in long mode // **yes** | ||
| - | * //FS/GS BASE acces instructions support // **yes** | ||
| - | * // | ||
| - | * // | ||
| - | * Las opciones no especificadas deben disponer de su valor por defecto | ||
| - | * **Memory options**: establece la memoria a simular por el emulador y la que el //host// le asignará | ||
| - | * //Standard Options-> | ||
| - | * //Standard Options-> | ||
| - | * //Standard Options-> | ||
| - | * //Standard Options-> | ||
| - | * **Clock & CMOS options**: establece las opciones de configuración de la BIOS referentes al reloj | ||
| - | * // | ||
| - | * **Disk & Boot options**: permite especificar el dispositivo desde el cual se iniciará la PC simulada y que unidades de disco dispondrá | ||
| - | * //First Floppy Drive-> | ||
| - | * //First Floppy Drive-> | ||
| - | * //First Floppy Drive-> | ||
| - | * //First Floppy Drive-> | ||
| - | * //First Floppy Drive-> | ||
| - | * //Boot Options-> | ||
| - | * Existen algunas opciones de configuración que no se encuentran accesibles desde la interfaz de edición, para lo cual con algùn editor de texto se abrirá el fichero creado (.bochsrc), y se modificará el valor de la opciones, en especial | ||
| - | * // | ||
| - | * // | ||
| - | |||
| - | ==== Depurador GDB ==== | ||
| - | La configuración de Bochs para su utilización con GDB, solo debe ser aplicada si se generó el binario como se indica en [[bochs | Interfaz de depuración GDB]], adicionalmente debe seguir los pasos detallados en [[bochs | Depurador BOCHS]], con las siguientes modificaciones: | ||
| - | * //Other options-> | ||
| - | * Las no especificadas deben disponer de su valor por defecto | ||
| - | |||
| - | Adicionalmente al iniciar **DDD** (la GUI de GDB), se debe configurar la interfaz con la cual se conectará con Bochs, para ello bastará con ejecutar en la consola de **DDD** < | ||
| - | |||
| - | |||
| - | ===== Argumentos de la linea de comandos ===== | ||
| - | Visualizar la ayuda disponible | ||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | Cargar la configuración desde un fichero específico | ||
| - | < | ||
| - | / | ||
| - | </ | ||
| - | |||
| - | ===== Comandos del depurador interno ===== | ||
| - | La lista completa de los comandos provistos por Bochs se encuentra en [[http:// | ||
| - | Sin embargo a continuación se detallan los que son considerados más relevantes. | ||
| - | |||
| - | ==== Breakpoints ==== | ||
| - | Sin lugar a duda al momento de desarrollar cualquier aplicación resulta de suma utilidad, detener la ejecución de código en puntos conocidos, ya sea para inspeccionar a posteriori el contenido de ciertas variables o bien para analizar condiciones de error. | ||
| - | A tal fin el depurador del Bochs, cuenta con la familia de comandos //break// o bien su abreviatura //b// | ||
| - | |||
| - | < | ||
| - | vb seg:off | ||
| - | lb linearaddress | ||
| - | b physicaladdress | ||
| - | </ | ||
| - | |||
| - | Como se verá durante el desarrollo de los problemas, el siguiente comando detiene la ejecución de código en la dirección lógica asociada al segundo descriptor (//0x10//) de la GDT en la instrucción ubicada en el desplazamiento | ||
| - | |||
| - | < | ||
| - | vb 10:89a | ||
| - | </ | ||
| - | |||
| - | Si la base del descriptor se inicializa en //0x0//, el siguiente comando detendrá la ejecución en el mismo punto que el anterior, es decir en la dirección lìneal //0x89a// | ||
| - | |||
| - | < | ||
| - | lb 0x89a | ||
| - | </ | ||
| - | |||
| - | Por otro lado si se trabaja en un esquema de paginación en el cual las direcciones lógicas coincidan con las físicas (//identity mapping//), el siguiente comando generará los mismos efectos que los descriptos anteriormente. | ||
| - | |||
| - | < | ||
| - | b 0x89a | ||
| - | </ | ||
| - | |||
| - | ==== Control de ejecución ==== | ||
| - | En conjunto con los // | ||
| - | |||
| - | ==== Inspección de las tablas de descriptores ==== | ||
| - | Uno de los comandos más útiles y de los primeros que se utilizarán al momento de realizar la guía de trabajos prácticos es | ||
| - | |||
| - | < | ||
| - | info gdt n | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | info idt n | ||
| - | </ | ||
| - | |||
| - | Estos comandos permiten visualizar el contenido del descriptor //n// de la Tabla Global de Descriptores (GDT) y la Tabla de Descriptores de Interrupción (IDT), respectivamente. En caso de requerir el análisis de las tabla completa, solo basta con omitir el parámetro. | ||
| - | Es muy ilustrativo comparar los descriptores utilizados en modo IA-32e tanto para 32b como para 64b. | ||
| - | |||
| - | ==== Inspección de memoria ==== | ||
| - | El contenido de la memoria puede ser inspeccionado mediante el comando ' | ||
| - | |||
| - | < | ||
| - | x /< | ||
| - | </ | ||
| - | | ||
| - | donde | ||
| - | |||
| - | **< | ||
| - | |||
| - | **< | ||
| - | |||
| - | **< | ||
| - | |||
| - | Como se puede apreciar es posible inspeccionar el contenido de la memoria, ya sea con de las direcciones lineales o de las direcciones físicas. Este comando es sumamente útil en el desarrollo de la guía de trabajos prácticos para todo aquello referido a paginación, | ||
| - | |||
| - | Asi, por ejemplo, el siguiente comando del depurador mostrará los 10 bytes de memoria a partir de la dirección lineal 0x1000, en formato hexadecimal. | ||
| - | < | ||
| - | |||
| - | De forma similar, el siguiente comando mostrará los 10 dwords de memoria a partir de la dirección lineal 0x1000, en formato hexadecimal. | ||
| - | < | ||
| - | |||
| - | Si en cambio quisieramos ver los 10 bytes de memoria a partir de la dirección lineal 0x1000, pero en formato decimal, deberíamos ejecutar: | ||
| - | < | ||
| - | |||
| - | ==== Traducción de las direcciones lineales paginadas a físicas ==== | ||
| - | Uno de los principales escollos que el desarrollador se encuentra al momento de resolver los ejercicios relacionados con paginación, | ||
| - | |||
| - | < | ||
| - | info tab | ||
| - | </ | ||
| - | |||
| - | El primer comando permite no solo realizar la traducción de la dirección líneal paginada a su correspondiente dirección física, sino también permite visualizar la inicialización de los registros y entradas de paginación asociadas. | ||
| - | El segundo caso permite | ||
| - | A continuación se muestran algunos ejemplos, el primero de los cuales no utiliza la unidad de paginación, | ||
| - | |||
| - | < | ||
| - | < | ||
| - | linear page 0x0000000000000000 maps to physical page 0x0000000000000000 | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | < | ||
| - | PML4: 0x0000000000011021 ps A pcd pwt S R P | ||
| - | PDPE: 0x0000000000012021 ps A pcd pwt S R P | ||
| - | PDE: 0x00000000000000e7 PS g pat D A pcd pwt U W P | ||
| - | linear page 0x0000000000008000 maps to physical page 0x0000000000008000 | ||
| - | </ | ||
| - | |||
| - | < | ||
| - | < | ||
| - | 0x00000000-0x000fffff -> 0x0000000000000000-0x00000000000fffff | ||
| - | 0x54a20000-0x54a20fff -> 0x0000003df000e000-0x0000003df000efff | ||
| - | ... | ||
| - | 0xd62e7000-0xd62e7fff -> 0x000000000298e000-0x000000000298efff | ||
| - | </ | ||
| - | |||
| - | ==== Inspección de la pila ==== | ||
| - | En el caso de querer analizar el //stack//, se puede optar por dos alternativas. | ||
| - | * Utilizar el mismo mecanismo empleado para inspeccionar memoria, utilizando la dirección lineal que se conforma a partir de la dirección lógica SS:ESP. | ||
| - | * Mediante el comando < | ||
| - | |||
| - | Al ejecutar el mismo se podrá ver el contenido de los primeros multiplos de 16 bit especificados como argumento, mediante //num words//. Recordar que si se desea inspeccionar el contenido que se guardó en primera instancia, se debe leer en forma completa la pila, ya que el comando mencionado realiza una lectura tipo // | ||
| - | |||
| - | Este comando es de mucha utilidad a la hora de depurar excepciones, | ||
| - | |||
| - | ==== Inspección de dispositivos ==== | ||
| - | En ciertos casos puede resultar de utilidad observar el estado de un dispositivo especìfico, | ||
| - | 82C54 PIT | ||
| - | |||
| - | GATE #2 = 1 | ||
| - | Speaker = 0 | ||
| - | |||
| - | counter #0; freq=18, | ||
| - | counter #1; freq=18, | ||
| - | counter #2; freq=18, | ||
| - | |||
| - | Supported options: | ||
| - | info device ' | ||
| - | Se puede observar que además de brindarnos la información completa de la configuración y el estado de cada contador, se indica que es posible seleccionar un elemento en forma individual para conocer su estado, en forma detallada\\ < | ||
| - | 82C54 PIT | ||
| - | |||
| - | GATE #2 = 1 | ||
| - | Speaker = 0 | ||
| - | |||
| - | counter #0; freq=18,206 | ||
| - | count: 40456 | ||
| - | count_binary: | ||
| - | counter GAT: 1 | ||
| - | counter OUT: 1 | ||
| - | next_change_time: | ||
| - | Es importante destacar que tanto los dispositivos como las opciones debe especificarse como argumentos tipo cadena, es decir entre comillas. | ||
| - | |||
| - | --- // | ||
| - | |||
| - | ===== FAQ ===== | ||
| - | * **¡Al ejecutar el comando //apt-get build-dep bochs// se presenta el error //Debe poner algunos URIs ' | ||
| - | Como parte de su funcionamiento, | ||
| - | deb http:// | ||
| - | deb http:// | ||
| - | Para mayores detalles refirise a [[http:// | ||
| - | En caso de utilizar Ubuntu bastara con habilitar " | ||
| - | * **¡El comando //make install// finaliza con un mensaje que contiene un texto similar a //undefined reference to symbol ' | ||
| - | Agregar la siguiente opción LDFLAGS=' | ||
| - | * **¡El comando //make install// finaliza con un mensaje similar a //mkdir: no se puede crear el directorio «/ | ||
| - | Como ///opt/// solo puede ser modificado por root, se debe ejecutar //sudo make install// | ||
| - | * **¡Instale la aplicación en /tmp/ y al reiniciar la PC se borró!** | ||
| - | Efectivamente es el funcionamiento esperado, ya que /tmp/ es un directorio de ficheros no persistentes. Por este motivo se debe instalar en /var/tmp/. | ||
| - | * **¿Puedo instalar el Bochs en otra ubicación? | ||
| - | __**NO**__. La ubicación indicada permite que todos los scripts sean compatibles facilitando el trabajo de desarrollo y evaluación. | ||