Análisis ftrace - Godson plataformas de 64 bits

 

ftrace funciona - plataforma Godson

 

En primer lugar, la inyección de llamadas a funciones de rastreo

1. En el ejemplo kernel_thread y sys_fork, el código fuente mostrado en la Figura 1-1:

Figura 1-1 Fuente

2. Al compilar el kernel, el gcc -pg opción, el tiempo de compilación, el comienzo de la llamada a la función se inserta automáticamente ftrace_caller.

El antes descrito dos funciones ensamblador código que se muestra en la Figura 1-2.

La figura código código ensamblador generación 1-2

En la Figura 1-1, la fuente no llamar ftrace_caller, pero el núcleo ha terminado de compilar las llamadas se ha unido.

 

3. Análisis siguiente fuente ftrace_caller 1-3, la Figura 1-4 muestra el código de montaje.

La Fig. 1-3 fuente ftrace_caller

 

La Fig. Código de montaje 1-4 ftrace_caller

 

Dos, el estado de funcionamiento ftrace

1. Después de iniciar el sistema, y ​​el código binario kernel_thread sys_fork estado predeterminado se muestra en la Figura 2-1, el código ensamblador ftrace_caller muestra en la Figura 2-2.

Figura 2-1 sistema de escritura de código de arranque binaria

 

La Fig. 2-2 ftrace_caller después de script de arranque del sistema

 

Comparar las figuras. 2-1 y 1-2, que se encuentra 0x0c085428 es decir, salto dirección de la instrucción función 0x8024137c ftrace_caller y dirección original 0x802413bc ​​después el sistema comienza a 0 (es decir, nop instrucciones).

Comparar. Las figuras 2-2 y. Las figuras 1-4, la dirección de instrucción 0x10000027 es decir, salto encontró ftrace_stub 0x802150a0 función original después el sistema comienza a 0 (es decir nop de instrucciones).

Llamando a la inicialización del sistema ftrace_init los cambios anteriores: ftrace_dyn_arch_init (dir) y ftrace_modify_code llamada de función (MCOUNT_ADDR, INSN_NOP) comenzará ftrace_caller b ftrace

instrucción NOP modificado para la instrucción _stub. ftrace_process_locs función (NULL, __ start_mcount_loc,

__stop_mcount_loc) para llevar a cabo todas las funciones de la instrucción se modifica para contener jal ftrace_caller nop. comienzo

_Mcount_loc contenidos de todas las direcciones (generada en tiempo de compilación), fácil de encontrar y modificar la llamada dirección de ftrace_caller jal de la región en una dirección 0x0x8024137c (kernel_thread) y dirección de 0x802413bc

(Sys_fork).

 

 

 

Los cambios en la función de las variables y funciones 2.echo> current_tracer en el sistema

fuente kernel_thread sys_fork y la escritura de cambio se muestra en la Figura 2-3, la instrucción de cambio de código fuente ftrace_caller muestra en la Figura 2-4.

La Fig. 2-3 sys_fork y de secuencias de comandos kernel_thread

 

Fig. 2-4 ftrace_caller de secuencias de comandos

Cifras se comparan 2-3 y 2-1, y la dirección de la dirección encontrada 0x8024137c 0x802413bc ​​0x0 original (es decir, nop instrucción) se convierte en la dirección de la instrucción en el salto ftrace_caller 0x0c08542a es decir +8 direcciones de función (es decir 0x802150a8).

Comparar. Las figuras 2-4 y Fig. 2-2, 0 encontrado desde la dirección original 0x80215104 (NOP) que está modificado para 0x0c0b9ff2 ftrace_ops_no_ops saltar función (0x802e7fc8 dirección).

ftrace_ops_no_ops fuente de 2-5, la función de exploración llama la lista de funciones ftrace_ops_list registrado.

2-5 ftrace_ops_no_ops funciones clave en el código fuente de la fig.

Por mirada desmontaje ftrace_ops_list en el contenido de la lista, el contenido del núcleo compilado muestran en la Figura 2-6,

Por eco función> current_tracer los contenidos mostrados en la Figura 2-7.

Figura 2-6 contenido ftrace_ops_list

La Fig. 2-7 código contenido ftrace_ops_list

Por la figura puede tener el contenido original ftrace_ops_list 0x81024060 (es decir ftrace_list_end) modificado 0x81037510 (es decir global_ops). global_ops contenido original 0x80215140 (es decir ftrace_stub), modificado como 0x80301330 (función es decir function_trace_call).

Actualmente función de agregado llama ftrace_caller llamada a la función final es función function_trace_call.

Función> current_tracer eco es llamado por el tracing_set_trace_write acción (), que se lleva a cabo la función de caracteres de "función" de la misma variable global trace_types el trazador. Todas las funciones trazador llamando register_tracer () para completar el registro, la función de proceso de registro como se muestra en la Figura 2-8 (etapas de terminación init).

         tracing_set_trace_write () llamada a la función en la función init función function_trace_init es decir, para realizar otra inicialización, tales como la función de llamar register_ftrace_function (y trace_ops) para completar los trace_ops de registro, aparecerá una lista trace_ops añadido global_ops; asignaciones ftrace_trace_function como una variable global y similares. Y en última instancia hace la llamada ftrace_caller puede llamar a la función function_trace_call.

 

función 3.echo> current_tracer el sistema ahora puede llamar a funciones, pero la traza de bienes aún no ha comenzado, necesidad de echo 1> después tracing_on, el sistema se iniciará.

         En el function_trace_call función () se llama trace_function grabación ring_buffer información.

         echo 1> tracing_on llamada general rb_simple_write operación (), llamada TR> current_trace-> empezar a llamar a la función, es decir function_trace_start (), el buffer-> record_disabled menos 1, la cpu_

buffer-> record_disabled amortiguar menos 1 está habilitado para habilitar el registro. Trace_function función de registro en el que dos ring_buffer_lock_reserve record_disabled determinará si se han cumplido los requisitos, si cumplen con el registro, de lo contrario dejar de fumar.

 

 

Cómo funcionan 4.ring_buffer?

Referencia específica: http://blog.chinaunix.net/uid-20543183-id-1930845.html

Publicado cuatro artículos originales · ganado elogios 0 · Vistas 250

Supongo que te gusta

Origin blog.csdn.net/yuanjunqing/article/details/104762579
Recomendado
Clasificación