2012-10-09 34 views
41

Estudio el kernel de Linux y descubrí que para la arquitectura x86_64 la interrupción int 0x80 no funciona como una llamada de sistema.¿Qué es mejor "int 0x80" o "syscall"?

La pregunta es: en el caso de la arquitectura x86 ¿qué es más preferible syscall o int 0x80 y por qué?

EDITAR: Yo uso el kernel 3.4

+0

¿Dónde ¿Está buscando en el núcleo que se está viendo el uso de '0x80' int? ¿Puedes especificar algunos archivos? – Mike

+0

@Mike De hecho, encontré un tipo de tutorial en Linux kernel donde, como ejemplo, se utilizó. Fue 2.6 basado. – Alex

+0

Similar a http://stackoverflow.com/q/12776340/841108 pregunta –

Respuesta

55
  • syscall es la forma predeterminada de entrar en modo de núcleo en x86-64. Esta instrucción no está disponible en los modos de operación de 32 bits en los procesadores Intel.
  • sysenter es una instrucción que se usa con más frecuencia para invocar llamadas al sistema en modos de operación de 32 bits. Es similar a syscall, aunque es un poco más difícil de usar, pero esa es la preocupación del kernel.
  • int 0x80 es una forma heredada de invocar una llamada al sistema y debe evitarse.

forma preferible de invocar una llamada de sistema es utilizar VDSO, una parte de la memoria asignada en cada espacio de direcciones del proceso que permite utilizar el sistema de llamadas de manera más eficiente (por ejemplo, al no entrar en modo de núcleo en algunos casos en absoluto) VDSO también se encarga de más difícil, en comparación con el antiguo int 0x80 manera, manejo de syscall o sysenter instrucciones.

También, vea this y this.

+4

La recomendación de elegir uno sobre el otro es para desarrolladores de kernel del sistema operativo. Su elección se hace luego parte de la ABI, y si está desarrollando para un cierto sistema operativo, debe cumplir ese ABI. Por ejemplo, Linux/i386 usa int 0x80 y pasa argumentos en registros, mientras que MirBSD/i386 usa int 0x80 y pasa argumentos en la pila, con un puntero de marco entre ellos (lo que significa que no hay costos de configuración en el espacio de usuario cuando se usa cdecl). [Esta respuesta es principalmente para personas que se envían aquí pero no son diseñadores de kernel del sistema operativo.] – mirabilos

+1

La pregunta era sobre Linux y la respuesta describe posibles formas de invocar un syscall en Linux (tanto i386 como x86_64). Usted sugiere que Linux/i386 solo usa 'int 0x80' que no es verdadero. La forma preferible de hacer un syscall es usar VDSO. –

-4

int 0x80 es una mejor terminología para indicar una llamada a su sistema de al kernel para indicarle que debe hacer algo.

El significado y la interpretación son intercambiables, 'make a syscall' o 'issue int 80h'.

no es diferente a los días de DOS:

  • invocación int 21h para obtener DOS para hacer algo depedning en el registro AX y opcionalmente ES: par de registros DX,
  • int 13h es el BIOS controlador de disco duro.
  • int 10h es la pantalla EGA/VGA.
  • int 09h es el controlador de teclado.

¿Cuál es el tema común aquí es la siguiente, cuando se invoca una interrupción/llamada al sistema, el núcleo comprueba el estado de los registros para ver qué tipo de llamada al sistema se requiere. Al observar, por ejemplo, eax registrarse, por ejemplo, y determinar qué realizar, el contexto interno cambia al espacio del kernel, lleva a cabo el procedimiento y el cambio de contexto al espacio de usuario, con la opción de devolver los resultados de la llamada, es decir, si tuvo éxito o fue un fracaso.

+4

En realidad, el conjunto de instrucciones x86_64 tiene una instrucción 'syscall'. A este respecto, 'int 0x80' solo se usa para una llamada al sistema en un entorno Linux de 32 bits. –

+1

Bueno, para ser justos, OP debería haber dejado más clara * arquitectura x86 que es más preferible syscall o int 0x80 * - era ambiguo ya que OP se refería a x86-64 y desde ese contexto, implicaba 32bit ... que hizo que mi respuesta algo ir por mal camino o interrumpir excepción: P – t0mm13b

17

Mi respuesta here cubre su pregunta.

En la práctica, los núcleos recientes están implementando un VDSO, especialmente para optimizar dinámicamente las llamadas al sistema (el kernel establece el VDSO a algún código mejor para el procesador actual). Por lo tanto, debe usar VDSO, y será mejor utilizar, para las llamadas de sistema existentes, la interfaz proporcionada por la libc.

Tenga en cuenta que, AFAIK, una parte significativa del costo de las llamadas de sistema simples va del espacio de usuario al núcleo y viceversa. Por lo tanto, para algunas llamadas de sistema (probablemente gettimeofday, getpid ...) el VDSO podría evitar incluso eso (y técnicamente podría evitar hacer una llamada de sistema real). Para la mayoría de llamadas al sistema (como open, read, send, mmap ....) el coste del núcleo de la syscall es lo suficientemente grande para que cualquier mejora del espacio de usuario al núcleo transición espacio (por ejemplo, usando SYSENTER o SYSCALL instrucciones de la máquina en lugar de INT) insignificante.

+15

En los 80386 días, la forma más rápida de ingresar al kernel era en realidad [ejecutar una instrucción no válida] (http://blogs.msdn.com/b/oldnewthing/archive/2004 /12/15/313250.aspx). –