Los marcadores de kernel eran un mecanismo de soporte de instrumentación de kernel estático para el código fuente del kernel de Linux , que permitía que herramientas especiales como LTTng [1] o SystemTap [2] rastrearan la información expuesta por estos puntos de sondeo. Los marcadores de kernel se declaraban en el código del kernel mediante líneas de una sola línea con el formato:
trace_mark ( nombre , cadena_de_formato , ...);
Donde nombre es el nombre único del marcador y formato_cadena describe los tipos de argumentos restantes.
Un marcador puede estar activado o desactivado según si hay una sonda conectada a él o no. El código que desea conectarse a un punto de seguimiento primero llama a:
int marker_probe_register ( const char * nombre , const char * cadena_de_formato , marker_probe_func * sonda , void * pdata );
para registrar su devolución de llamada de sonda con el punto marcador ( pdata es un valor de datos privado que el código desea pasar a la sonda ). Posteriormente, la sonda se activa y desactiva mediante:
int marcador_arm ( const char * nombre ); int marcador_disarm ( const char * nombre );
El uso de marcadores tiene una sobrecarga insignificante gracias en parte a los Valores Inmediatos , [3] otro mecanismo de soporte que incorpora interruptores en el código que se pueden activar y desactivar dinámicamente, sin usar una referencia de memoria y ahorrando así líneas de caché. [4]
La motivación inicial para crear esta infraestructura de instrumentación estática fue la gran sobrecarga de rendimiento inducida por el mecanismo de instrumentación dinámica anterior, el mecanismo Kprobe , que depende de puntos de interrupción . La instrumentación estática también puede sobrevivir más fácilmente a los cambios en el código fuente porque los marcadores están en el código fuente.
Los marcadores de núcleo consistían esencialmente en una macro de preprocesamiento de C que añadía, en la función instrumentada, una rama sobre una llamada de función . Al hacerlo, ni la configuración de la pila ni la llamada de función se ejecutan cuando la instrumentación no está habilitada. Al identificar la rama que ejecuta la configuración de la pila y la llamada de función como (usando el gcc incorporado ), se le da una pista al compilador para que coloque las instrucciones de seguimiento lejos de las líneas de caché involucradas en la ejecución estándar del núcleo. [5]unlikely
expect()
Se identificaron dos inconvenientes de los marcadores de kernel [5] que llevaron a su reemplazo por puntos de seguimiento :
Un conjunto de parches que los implementaba se fusionó en la versión 2.6.24, [6] que se lanzó el 24 de enero de 2008. Para abordar los problemas relacionados con los marcadores del núcleo, Mathieu Desnoyers, su autor original, implementó una versión más simple y más segura de los puntos de sondeo estáticos llamada Tracepoints . Un conjunto de parches que implementaba Tracepoints se fusionó en la versión 2.6.28, [7] que se lanzó el 25 de diciembre de 2008. A partir de entonces, los marcadores del núcleo se eliminaron lentamente de las fuentes del núcleo y finalmente se eliminaron por completo en el núcleo Linux 2.6.32, [8] [9] que se lanzó el 3 de diciembre de 2009.