onlinegdb online linea dev compiler compilador c++ gdb

c++ - online - ¿Qué es__kernel_vsyscall?



online gdb python (4)

Cuando realiza una llamada al sistema (como leer un archivo, hablar con el hardware, escribir en los sockets), en realidad está creando una interrupción. El sistema maneja la interrupción en modo kernel y tu llamada regresa con el resultado. La mayoría de las veces es inusual que tengas muchos hilos en syscall a menos que realices llamadas de bloqueo, en cuyo caso se espera.

Más específicamente, significa que el hilo está esperando en una llamada al sistema del nivel kernel. Pero eso es (por desgracia para mis puntos) ya en el nombre :)

Obtuve un núcleo que se ve muy diferente de los que suelo obtener: la mayoría de los hilos están en __kernel_vsyscall ():

9 process 11334 0xffffe410 in __kernel_vsyscall () 8 process 11453 0xffffe410 in __kernel_vsyscall () 7 process 11454 0xffffe410 in __kernel_vsyscall () 6 process 11455 0xffffe410 in __kernel_vsyscall () 5 process 11474 0xffffe410 in __kernel_vsyscall () 4 process 11475 0xffffe410 in __kernel_vsyscall () 3 process 11476 0xffffe410 in __kernel_vsyscall () 2 process 11477 0xffffe410 in __kernel_vsyscall () 1 process 11323 0x08220782 in MyClass::myfunc ()

Qué significa eso?

EDITAR: en particular, suelo ver muchos subprocesos en "pthread_cond_wait" y "___newselect_nocancel" y ahora están en el segundo fotograma de cada tema. ¿Por qué este núcleo es diferente?


__kernel_vsyscal es el método utilizado por linux-gate.so (una parte del kernel de Linux) para hacer una llamada al sistema utilizando el método más rápido disponible, preferiblemente la instrucción sysenter . La cosa es explicada adecuadamente por Johan Petersson .


Además del buen enlace ya dado a la explicación de lo que es linux-gate.so , me gustaría responder "¿por qué este núcleo es diferente?". Los sistemas Linux más recientes (más nuevos que 2.5.68) de 32 bits usan la página VDSO (también conocida como linux-gate.so.1 ), y los sistemas de 64 bits también comenzarán pronto (VDSO de 64 bits fue introducido en el núcleo 2.6.24 )

Si desarrolla en un sistema anterior, o con un viejo glibc, entonces nunca vería __kernel_vsyscall() , ya sea porque el kernel no creó VDSO en absoluto, o porque (antiguo) glibc no lo usa, incluso cuando VDSO está presente.


Como dijo Adam, la razón principal es el rendimiento. Vea este enlace para algunos números antiguos http://lkml.org/lkml/2002/12/9/13 .

Si tiene un kernel habilitado para vDSO, no está utilizando interrupciones para ejecutar llamadas de sistema, como dijo Stefan, en realidad era porque las interrupciones eran cada vez más lentas y todo el vDSO se agregaba al kernel.