15

Estoy buscando una herramienta para generar de forma estática un gráfico de llamadas del kernel de Linux (para una configuración de kernel determinada). El gráfico de llamadas generado debe ser "completo", en el sentido de que todas las llamadas están incluidas, incluidas las potenciales indirectas, que podemos suponer que solo se realizan mediante el uso de punteros de función en el caso del kernel de Linux.Generación de gráfico de llamada estática para el kernel de Linux

Por ejemplo, esto podría hacerse analizando los tipos de punteros de función: este enfoque daría lugar a bordes superfluos en el gráfico, pero eso está bien para mí.

ncc parece implementar esta idea, sin embargo, no tuve éxito en hacerlo funcionar en el kernel 3.0. ¿Cualquier otra sugerencia?

Supongo que este enfoque también podría dar lugar a que falten bordes en los casos en que se utilizan moldes de punteros de función, por lo que también me interesaría saber si esto es probable en el kernel de Linux.

Como nota al margen, parece que hay otras herramientas que son capaces de hacer análisis semántico de la fuente para inferir valores de potencial de puntero, pero AFAICT, ninguno de ellos es el diseño que se utilizará en un proyecto como el núcleo de Linux .

Cualquier ayuda sería muy apreciada.

+0

¿No lograste que funcione? ¿Cuánto esfuerzo invirtió? En mi respuesta a continuación, analizamos un gran sistema. Nos llevó varios meses-hombre capturar de manera confiable las fuentes correctas, los datos de compilación y procesarlos.¿Crees que hacer esto para Linux debería ser mucho más rápido la primera vez que lo intentes? –

+0

Bueno, simplemente seguí al pie de la letra el ejemplo de caso de uso para el kernel de Linux que se proporciona en la documentación de ncc. Esto resultó en un error que todavía estoy tratando de resolver. – addalbx

+0

OK, entonces NCC supuestamente viene configurado para procesar Linux. Entonces tu tiempo debería ser mucho más corto ya que alguien más ha hecho todo este trabajo. Por supuesto, ese trabajo no es probable que sea estable; el kernal de Linux se mueve. ¿Han contactado a los constructores de NCC y les han preguntado sobre esto? –

Respuesta

5

Hemos hecho análisis de puntos globales (con punteros de función indirecta) y construcción de gráficos de llamada completa de sistemas C monolíticos de 26 millones de líneas (18,000 unidades de compilación).

Lo hicimos usando nuestro DMS Software Reengineering Toolkit, es C Front End y es associated flow analysis machinery. La maquinaria de análisis de puntos (y los otros análisis) son conservadores; sí, obtienes algunos puntos falsos y, por lo tanto, llamas bordes como consecuencia. Estos son bastante difíciles de evitar Puede ayudar a tales analizadores proporcionando ciertos datos cruciales sobre las funciones clave y aprovechando los conocimientos, como "los sistemas integrados [y los sistemas operativos] tienden a no tener ciclos en el gráfico de llamadas", lo que significa que puede eliminar algunos de estos. Por supuesto, debes permitir excepciones; mi moral: "en los sistemas grandes, todo sucede".

El problema en particular incluía los módulos C cargados dinámicamente (!) Usando un esquema de carga especial específico para este software en particular, pero eso simplemente se sumó al problema.

Los lanzamientos en los punteros de función no deberían perder bordes; un análisis conservador debería simplemente asumir que el puntero de conversión coincide con cualquier función en el sistema con la firma correspondiente al resultado arrojado. Más problemáticos son los moldes que producen firmas de tipo compatible; si lanza un puntero de función a void * foo (uint) cuando la función real a la que se llama acepta un int, los puntos para el análisis elegirán de forma conservadora las funciones incorrectas. No puedes culpar al analizador por eso; el reparto yace en ese caso. Sí, vimos este tipo de basura en el sistema de 26 millones de líneas.

Esta es ciertamente la escala correcta para analizar Linux (que creo que son solo 8 millones de líneas más o menos :-). Pero no lo hemos probado específicamente en Linux.

La configuración de esta herramienta es complicada porque debe capturar todos los detalles sobre las compilaciones en sí, y en particular la configuración del kernel de Linux que desea generar. Así que tienes que interceptar las llamadas al compilador para obtener los interruptores de línea de comando, etc.

+2

Lamentablemente, me gustaría abstenerme de usar herramientas comerciales. Gracias por tu ayuda. – addalbx

+0

@addalbx: ¿Alguna vez encontró una respuesta? (Veo que probaste LLVM, también). –

+0

Me rendí, aunque tuve un éxito leve. Las cosas tienden a funcionar de manera aproximada, incluso con ncc, el principal obstáculo son los gcc-ismos del kernel. Requiere mucho alboroto ... corrígeme si me equivoco, pero no sería demasiado diferente con nuestro software. ¿o? – addalbx

Cuestiones relacionadas