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 , permitiendo herramientas especiales como LTTng [1] o SystemTap [2] para rastrear la información expuesta por estos puntos de prueba. Los marcadores del kernel se declararon en el código del kernel mediante una línea de la forma:
trace_mark ( nombre , formato_cadena , ...);
Donde nombre es el nombre único del marcador, y format_string describe los tipos de argumentos restantes.
Un marcador puede estar encendido o apagado dependiendo de si hay una sonda conectada a él o no. El código que quiere conectarse a un punto de seguimiento primero llama:
int marker_probe_register ( const char * nombre , const char * format_string , marker_probe_func * probe , void * pdata );
para registrar su devolución de llamada de sonda con el punto de marcador ( pdata es un valor de datos privados que el código quiere pasar a la sonda ). Posteriormente, la sonda se enciende y apaga usando:
int marker_arm ( const char * nombre ); int marker_disarm ( const char * nombre );
El uso de marcadores tiene una sobrecarga insignificante gracias en parte a Immediate Values , [3] otro mecanismo de soporte que incrusta interruptores en el código que pueden activarse y desactivarse dinámicamente, sin usar una referencia de memoria y por lo tanto ahorrando 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 al mecanismo Kprobe , que depende de los 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.
Kernel Markers consistía esencialmente en una macro de preprocesamiento de C que agregaba, 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 a la 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 a la función como poco probable (usando el gcc integrado wait () ), se le da una pista al compilador para que coloque las instrucciones de rastreo lejos de las líneas de caché involucradas en la ejecución estándar del kernel. [5]
Se identificaron dos inconvenientes de Kernel Markers [5] que llevaron a su reemplazo por Tracepoints :
- La verificación de tipo se limitó a los tipos escalares porque la API se basa en cadenas de formato. Esto podría ser problemático si los punteros deben ser desreferenciados por el código de seguimiento.
- Los Marcadores "ocultan" la instrumentación en el código fuente, sin mantener un registro global de la instrumentación. Esto dificulta las convenciones del espacio de nombres y el seguimiento de la modificación de la instrumentación, a menos que se controle todo el árbol del kernel.
Un conjunto de parches que los implementa se fusionó en la versión 2.6.24, [6] que se publicó el 24 de enero de 2008. Para abordar los problemas relacionados con los marcadores del kernel, Mathieu Desnoyers, su autor original, implementó una versión más simple y segura de tipos de puntos de sonda estáticos denominados Tracepoints . Un conjunto de parches que implementaba Tracepoints se fusionó con la versión 2.6.28, [7] que se publicó el 25 de diciembre de 2008. A partir de entonces, los marcadores del kernel se eliminaron lentamente de las fuentes del kernel y finalmente se eliminaron por completo en el kernel 2.6.32 de Linux, [8 ] [9] que fue lanzado el 3 de diciembre de 2009.
Ver también
Referencias
- ^ Tracepoints y marcadores Archivado 2009-09-23 en Wayback Machine , Wiki de rastreo de LTTng
- ^ Usando marcadores , SystemTap Wiki
- ^ Mathieu Desnoyers, [parche 08/10] Valor inmediato - Documentación [ enlace muerto permanente ]
- ^ Mathieu Desnoyers, [parche 7/8] Valores inmediatos - Documentación [ enlace muerto permanente ]
- ^ a b Mathieu Desnoyers, seguimiento del sistema operativo de bajo impacto , tesis doctoral, departamento 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 rastreo: Eliminar marcadores, árbol git de Linux de Torvalds
enlaces externos
- Jonathan Corbet, marcadores de kernel , LWN.net, 2007
- Mathieu Desnoyers, Uso del núcleo de Linux marcadores , el núcleo de Linux documentación de 2008
- Jonathan Corbet, Rastreo: no hay escasez de opciones , LWN.net, 2008