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