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]unlikelyexpect()
Se identificaron dos inconvenientes de los marcadores de kernel [5] que llevaron a su reemplazo por puntos de seguimiento :
- La verificación de tipos se limitó a los tipos escalares porque la API se basa en cadenas de formato. Esto podría ser problemático si el código del rastreador debe desreferenciar los punteros.
- Los marcadores "ocultan" la instrumentación en el código fuente, sin mantener un registro global de la instrumentación. Esto dificulta las convenciones de espacio de nombres y el seguimiento de las modificaciones de la instrumentación a menos que se controle todo el árbol del núcleo.
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.
Véase también
Referencias
- ^ Puntos de seguimiento y marcadores Archivado el 23 de septiembre de 2009 en Wayback Machine , Wiki de seguimiento de LTTng
- ^ Uso de marcadores, Wiki de SystemTap
- ^ Mathieu Desnoyers, [parche 08/10] Valor inmediato - Documentación [ enlace muerto permanente ]
- ^ Mathieu Desnoyers, [parche 7/8] Valores inmediatos - Documentación [ enlace muerto permanente ]
- ^ ab Mathieu Desnoyers, Seguimiento de sistemas operativos de bajo impacto, tesis doctoral, Département de génie informatique et génie logiciel, École Polytechnique de Montréal, Université de Montréal, diciembre de 2009
- ^ Registro de cambios de Linux 2.6.24, principiantes del kernel de Linux
- ^ Registro de cambios de Linux 2.6.28, principiantes del kernel de Linux
- ^ Registro de cambios de Linux 2.6.32, principiantes del kernel de Linux
- ^ Christoph Hellwig, fc537766 Archivado el 15 de abril de 2013 en archive.today seguimiento: eliminar marcadores, árbol git de Linux de Torvalds
Enlaces externos
- Jonathan Corbet, Marcadores de núcleo , LWN.net, 2007
- Mathieu Desnoyers, Uso de los marcadores del núcleo de Linux , documentación del núcleo de Linux , 2008
- Jonathan Corbet, Rastreo: no faltan opciones , LWN.net, 2008