Avería tecnología de localización en el Red Hat Linux

  

Función kprobe SystemTap núcleo está sondeando funcionalidad se implementa en el kernel, ya que el kernel proporciona una API formal para usar kprobe, por lo que muchos programadores del kernel, tal vez kprobe directamente más conveniente que el uso SystemTap. kernel proporciona tres tipos de carretilla para kprobe, respectivamente JProbe, kprobe, kretprobe, se observó el siguiente código con la sonda en los tres función arp_process ejecución de TCP /IP en el ip_route_input ( ) llamada devuelve el resultado de este código también ilustra un método la misma función entre la sonda y los parámetros de controlador de entrada compartidos código del controlador de Ret es el siguiente: ..

arp_probe.c /* * arp_probe.c, por Qianfeng Zhang ([email protected]) * /

#include #include #include #include #include #include #include #include

MODULE_AUTHOR (" [email protected]"); module_description (" Un módulo para realizar un seguimiento de los resultados de llamada de ip_route_input () dentro arp_process usando JProbe y kretprobe "); MODULE_LICENSE (" GPL ");

static int j_arp_proc ess (struct sk_buff * SKB) {struct net_device * dev = skb- > dev; struct in_device * in_dev; int no_addr, RPF;

in_dev = in_dev_get (dev); no_addr = (in_dev- > ifa_list == NULL); FPR = IN_DEV_RPFILTER (in_dev); in_dev_put (in_dev); printk (" \\ narp_process () se llama con dispositivo de interfaz% s, in_dev (no_addr =% d, RPF =% d) \\ n ", dev - > nombre, no_addr, RPF); jprobe_return (); return (0);};

static int j_fib_validate_source (__ BE32 src, dst __be32, tos U8, int OIF, struct net_device * dev, __be32 * spec_dst, u32 * itag, marca u32)

{printk (" fib_validate_source () se llama con dst = 0x% x, oif =% d \\ n ", dst, OIF); jprobe_return (); regreso (0);};

estática struct JProbe my_jp1 = {.entry = j_arp_process, .kp.symbol_name = " arp_process "};


struct estática JProbe my_jp2 = {.entry = j_fib_validate_source, .kp.symbol_name = " fib_validate_source "};

static int entry_handler (struct kretprobe_instance * ri, pt_regs struct * regs) {pri NTK (" de llamada:% s () \\ n ", RI- > RP > kp.symbol_name); return (0);};

static int return_handler (struct kretprobe_instance * ri, struct pt_regs * regs) {int eax;

eax = regs- > ax &0xffff; printk (" Volviendo:% s () con un valor de retorno: 0x% lx (64 bits) 0x% x ( 32 bits) \\ n ", RI- > RP > kp.symbol_name, regs- > hacha, eax);

retorno (0);};

int estática fib_lookup_entry_handler ( kretprobe_instance struct * ri, pt_regs struct *, reglas) {struct fib_result * resp;

resp = (struct fib_result *) regs- > dx; printk (" de llamada:% s () \\ n ", ri - > RP > kp.symbol_name); * ((struct fib_result **) RI- > datos) = resp;

retorno (0);};


static int fib_lookup_return_handler (struct kretprobe_instance * ri, pt_regs struct * regs) {struct fib_result * resp; int eax;

eax = regs- > & hacha; 0xffff; resp = * ((struct fib_result **) RI- > datos); printk (" Volviendo: fib_lookup () con un valor de retorno: 0x% lx (64 bits) 0x% x (32 bits), result- > typ e:% d \\ n ", regs- > hacha, eax, resp- > tipo);

retorno (0);}

struct kretprobe my_rp1 = static {.handler = return_handler, .entry_handler = entry_handler, .kp.symbol_name = " ip_route_input_slow "};


estática my_rp2 struct kretprobe = {.handler = return_handler, .entry_handler = entry_handler, .kp.symbol_name = " fib_validate_source "};


my_rp3 estática struct kretprobe = {.handler = fib_lookup_return_handler, .entry_handler = fib_lookup_entry_handler, .kp.symbol_name = " " fib_lookup, .data_size = sizeof ( struct fib_result *)};

init_myprobe __init int estática (void) {int ret;

printk (" RTN_UNICAST es% d \\ n ", RTN_UNICAST); if ((ret = register_jprobe (&my_jp1)) < 0) {printk (" register_jprobe% s fallidos, regresaron% d \\ n ", my_jp1.kp.symbol_name, ret); retorno (-1);}

si ((ret = register_jprobe (&my_jp2)) < 0) {printk (" register_jprobe% s fallidos, regresado% d \\ n ", my_j p2.kp.symbol_name, ret); retorno (-1);}

if ((ret = register_kretprobe (&my_rp1)) < 0) {printk (" register_kretprobe% s fallidos, regresado% d \\ n ", my_rp1.kp.symbol_name, ret); unregister_jprobe (&my_jp1); unregister_jprobe (&my_jp2); retorno (-1);}

if ((ret = register_kretprobe (&my_rp2)) < 0) {printk (" register_kretprobe% s fallidos, regresado% d \\ n ", my_rp2.kp.symbol_name, ret); unregister_jprobe (&my_jp1); unregister_jprobe (&my_jp2); unregister_kretprobe (&my_rp1); retorno (-1);}

if ((ret = register_kretprobe (&my_rp3)) < 0) {printk (" register_kretprobe% s falló, volvió% d \\ n ", my_rp3.kp.symbol_name, ret); unregister_jprobe (&my_jp1); unregister_jprobe (&my_jp2); unregister_kretprobe (&my_rp1); unregister_kretprobe (&my_rp2); return (-1);}

return 0;}

Copyright © Conocimiento de Windows All Rights Reserved