viernes, 14 de febrero de 2014

Apuntes del Kernel Linux

POSIX (Portable Operating System Interface)

Documentos producidos por el IEEE y estandarizados por ANSI e ISO. El objetivo de POSIX es permitir tener un código fuente transportable.

Para un desarrollador el compilador el enlazador y el depurados son vitales. El compilador le indica si hay errores de sintaxis en su código y el enlazador resuelve los diferentes símbolos. El depurador permite ejecutar paso a paso la aplicación deseada.

GCC

Permite encadenar las diferentes fases de la compilación de un programa. Se trata de un lanzador de programas que ejecuta las diferentes etapas (preprocesador, compilación, ensamblado y enlazado) transmitiendo a los programas las pociones proporcionadas por el programador.

Parámetros:
-M parada tras la etapa de preprocesador
-S parada tras la generación de codigo ensamblador.
-c parada tras la generación del codigo objeto
-g inserción de los simbolos para la depuración


Archivos de Cabecera

/usr/include definen la interfaz de las bibliotecas utilizadas por los programas que se compilan.
/usr/src/kernel/include
|_ linux Declaraciones independientes de la arquitectura
|_ asm   Declaraciones dependientes de la arquitectura (asm-i386)

GDB

Depurador, para poder depurar un programa, es necesario que este ultimo se haya compilado con la opción -g, ya que el depurador requiere ciertas informaciones sobre el programa que no se incluyen en una compilación normal.

Strace

Permite seguir las llamadas al sistema ejecutadas por un programa. indica las primitivas llamadas, así como sus patrones (traduciendo ciertos valores por constantes simbólicas) y el código de retorno que devuelven.

Make

Herramienta estandard que permite efectuar la compilación inteligente de programas, en función de los archivos modificador que necesitan realmente ser recompilados.

ELF (Executable and Linking Format)

Formato binario para linux, permite generar tres tipos de archivo:

  • Archivo relocalizable (archivo objeto)
  • Archivo ejecutable
  • Archivo compartido (bibliotecas)


$ file <binario>

Biblioteca

Constituye la manera simple de agrupar varios archivos objetos, estas pueden ser

  • Estáticas. En el enlazado, el código de la biblioteca se integra al ejecutable.
  • Dinámicas. el código de la biblioteca se carga en la ejecución del programa. Las bibliotecas dinámicas economizan el espacio en disco y memoria, pues una biblioteca dinámica se carga una sola vez y el código puede ser compartido con  todas las demás aplicaciones que la necesiten. Cuando una biblioteca dinámica se actualiza, no es necesario recompilar las aplicaciones que la utilizan.


LDD

Permite conocer la lista de bibliotecas enlazadas con una aplicación.

$ ldd <binario>

Núcleo Linux.
El código fuente se organiza de manera jerárquica en subdirectorios con ciertas funcionalidades del núcleo:

  • include. Archivos de cabecera necesarios para la generación del núcleo
  • fs. Sistema de archivos
  • init. main.c de Linux
  • ipc. Gestión de comunicación interprocesos
  • mm. Gestión de memoria
  • kernel. Principales llamadas al sistema
  • lib. Módulos diversos.
  • drivers. Controladores de dispositivos
  • net. Protocolos de red
  • arch. Código dependiente de la plataforma
  • script. Scripts utilizados para la configuración y para la generación de las dependencias del núcleo.


Llamadas al sistema. 

Se caracterizan por un nombre y un numero único de identificación. Este numero puede encontrarse en el archivo /usr/include/asm/unistd.h

El número de argumentos están entre 0 y 5

Procesos

Estado de un proceso

  • En ejecución. el proceso es ejecutado por el procesador.
  • A punto (listo). El proceso podría ser ejecutado pero otro proceso se esta ejecutando en ese momento.
  • Suspendido. El proceso está en espera de un recurso.
  • Parado. El proceso ha sido suspendido por una intervención externa.
  • Zombi. El proceso ha terminado su ejecución pero sigue siendo referenciado en el sistema


Atributos de un proceso

  • Estado
  • Identificador de usuario y grupo.
  • Valor de los registros, incluyendo el contador ordinal
  • La identidad del usuario bajo cuyo nombre se ejecuta.
  • La información utilizada por el núcleo para proceder al ordenamiento de los procesos (prioridad)
  • La información respecto al espacio de direccionamiento del proceso (segmentos de código, de datos y de pila)
  • La información respecto a las entradas/salidas efectuadas por el proceso (descriptores de archivos abiertos, directorio actual, ...)
  • Información de contabilidad que resumen los recursos utilizados por el proceso.


Creación de un proceso. 

La creación de un proceso se efectúa duplicando el proceso actual, la llamada al sistema fork permite a un proceso crear una copia conforme a si mismo, exceptuando el identificador de proceso.

Pstree 

Muestra una jerarquía típica de procesos.
-a Visualiza los argumentos en linea de comandos

Tabla de Procesos

Descriptor del Proceso

Cada proceso se referencia por un descriptor. Este descriptor contiene los atributos del proceso, así como la información que permiten gestionar el proceso. Están definidas en el archivo <linux/sched.h>

Los descriptores de procesos se organizan en forma de una lista doblemente encadenada, por los campos next_task y prev_task. Los descriptores de los procesos listos para ejecutarse se colocan en otra lista doblemente encadenada, mediante los campos next_run y prev_run

Registros del Procesador

El contexto de un proceso incluye los registros del procesador, en un cambio de contexto, estos registros son guardados en memoria por el nucleo. El archivo de cabecera <asm/ptrace.h> contiene los campos para la arquitectura x86.


Si te gustó esta publicación no olvides compartirlo. Espero sus comentarios.



No hay comentarios:

Publicar un comentario