miércoles, 15 de octubre de 2008

Procesos e hilos de ejecucion en Windows (I)

Podemos definir un proceso como una instancia para un programa en ejecución, e instancia es la palabra adecuada dado que, como la mayoría de elementos en Windows, para el kernel o núcleo del sistema un proceso no es más que un tipo de objeto determinado.

Aunque parezcan similares debemos distinguir de forma clara las diferencias existentes entre un proceso y un programa:

  • Un programa es una secuencia estática de instrucciones, organizadas de forma secuencial.

  • Un proceso es un contenedor para los recursos y demás elementos que serán utilizados por los hilos (o threads), encargados de ejecutar las instrucciones que componen el programa.

De las definiciones anteriores podemos desprender que un proceso en sí mismo es inservible, a menos que contenga un hilo o thread, el cual será utilizado por Windows para planificar la ejecución del programa.

El sistema de planificación de Windows se basa en prioridades, de forma que la CPU se encarga de asignarles un tiempo basándose en dicha prioridad. De esta forma, cada uno de los threads que componen los diferentes procesos del sistema se ejecutan en "gajos" de tiempo (conocidos internamente como quantums) siguiendo un algoritmo round-robin, y dando la impresión de que lo hacen de forma concurrente.

Windows Debugging Tools

Para poder ver las estructuras de datos manejadas internamente por el kernel necesitaremos tener instaladas las Microsoft Debugging Tools. Una vez descargados los binarios adecuados para nuestro tipo de arquitectura (32 o 64 bits) aparecerá una nueva entrada en la lista de programas del menú Inicio que se corresponderá con los binarios que componen el debugger de Microsoft.

Existen dos versiones diferentes del debugger, ambas con funcionalidades similares y que únicamente se diferencian en el tipo de interfaz utilizada:
  • kd.exe: versión de línea de comandos
  • windbg.exe: versión con entorno gráfico

Por otra parte, y para poder analizar correctamente las estructuras internas del kernel será necesario contar con la versión adecuada de los ficheros de símbolos (symbols). Dichos ficheros contienen los nombres de variables y funciones, son generados por el linker y los utiliza el debugger para mostrar los nombres adecuados durante una sesión de debug. Esta información no se almacena en la imagen binaria del kernel dado que no resulta necesaria para la ejecución del mismo y la mejor opción es la de cargarlos bajo demanda desde el servidor de Microsoft mediante la variable "symbol path" utilizada por el debugger.

Vamos a describir a continuación el proceso de configuración de la versión gráfica para realizar una sesion de debugging local del kernel. Abriremos el programa WinDbg mediante el acceso directo del menú Inicio. Una vez abierto accederemos al menú File - Symbol File Path. Allí incluiremos lo siguiente:
SRV*C:\websymbols*http://msdl.microsoft.com/donwloadsymbols

Una vez incluido pulsaremos OK y accederemos al menú File - Save Workspace. De esta forma no será necesario volver a introducir el parámetro para cada sesión.

Lanzaremos ahora la sesión de debugging local del kernel mediante el menú File - Kernel Debug. En el cuadro de diálogo seleccionaremos la pestaña Local pulsando el botón Aceptar para obtener la línea de ejecución de comandos y la ventana de resultados.

Pasos básicos de creación de un proceso

Para crear un proceso se realiza una llamada a cualquiera de las funciones de creación de Windows:

Los pasos indicados a continuación implican la participación de tres componentes del sistema operativo: la parte cliente de la librería kernel32.dll, el Windows Executive y el proceso de subsistema de Windows (Csrss). Resumen de las fases en que se divide la creación de un proceso:
  1. Abrir el fichero de imagen (.exe) que se ejecutará mediante el proceso.

  2. Crear el objeto para el bloque ejecutivo de proceso (_EPROCESS).

  3. Crear el hilo de ejecución primario (pila, contexto y bloque ejecutivo de hilo _ETHREAD).

  4. Comenzar la ejecución del hilo primario.

  5. En el contexto del nuevo proceso y su hilo asociado completar la inicialización del espacio de direcciones (p.e. mediante la carga de las DLL requeridas) y empezar la ejecución del programa.

Estructuras internas de datos

Vamos a analizar la estructura interna para los diferentes bloques ejecutivos, _EPROCESS y _ETHREAD, y que serían las representaciones manejadas por el kernel de Windows para los procesos e hilos de ejecución respectivamente.

Los comandos a ejecutar en el debugger del kernel que iniciamos en una de las anteriores secciones serían:
lkd> dt -a -b -v _EPROCESS
lkd> dt -a -b -v _ETHREAD

Sé que la información incluida en esta última sección es muy escueta, por lo que prometo desarrollarla más a fondo en próximas entradas.

Bibliografia

Microsoft Windows Internals, Fourth Edition
David Solomon y Mark Russinovich
Microsoft Press

1 comentario:

Anónimo dijo...

Muy bueno gracias por la Info

Saludos