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;}
Primero, la configuración de snmp del switch, el siguiente es el comando de configuración de la se
Este artículo presenta el concepto, la función y el uso de LVM para ayudarlo a comprender LVM y usar
El shell de Linux tiene su propio conjunto de sentencias de control de flujo, incluidas sentencias
En primer lugar, gracias a los fanáticos y simpatizantes de la comunidad por su atención a Linux Dee
Bloquear software de herramienta de intento de contraseña SSH
Método de nomenclatura del conjunto de archivos de shell (¡Renombrar!)
El servidor Linux se está ejecutando durante 210 días más o menos
Herramienta de recuperación de código de hipertexto de Linux
Punto de montaje del sistema Linux y relación de partición
Que es linux ¿Cuáles son las características? Alfabetización de Linux
Búsqueda de comando de búsqueda de archivos de Linux, xargs detallados
Las habilidades de gestión del sistema Linux se acumulan en gran medida
Las operaciones de cadena de shell de Linux (longitud, búsqueda, reemplazo) se detallan en
Cómo Linux usa inode para borrar archivos
Cómo configurar la tarjeta gráfica nVIDIA bajo el sistema Linux
Ghost minimiza dos malentendidos de los clones
Siete golpes para crear un sistema operativo Windows XP seguro
Error en el disco duro del montaje de Linux "debe especificar el tipo de sistema de archivos"
Win9 estará equipado con una función de actualización clave
Win7 puede modificar la dirección mac sin reiniciar
Configure fácilmente la protección del sistema Win7 y recupere archivos por error