2010-05-03 27 views
10

Solo quiero preguntar, sé que las llamadas al sistema estándar en Linux se llevan a cabo mediante la instrucción int que apunta a Interrupt Vector Table. Supongo que esto es similar en Windows. Pero, ¿cómo llamas a algunas rutinas de sistemas específicos de alto nivel? Por ejemplo, ¿cómo le dices a Windows que cree una ventana? Sé que esto es manejado por el código en el dll, pero ¿qué pasó realmente en el nivel de instrucción del ensamblador? ¿La rutina en DLL llama al software interrumpido por la instrucción int, o hay algún enfoque diferente para manejar esto? Gracias.Llamadas al sistema en Windows

Respuesta

5

Hacer una llamada de Win32 para crear una ventana no está realmente relacionado con una interrupción. La aplicación cliente ya está vinculada con el .dll que proporciona la llamada que expone la dirección que el vinculador debe usar. Ya que está preguntando sobre la diferencia en el mecanismo de llamadas, estoy limitando la discusión aquí a aquellas llamadas de Win32 que están disponibles para cualquier aplicación en oposición a las llamadas a nivel kernel o controladores de dispositivo. En un nivel de lenguaje ensamblador, sería lo mismo que cualquier otra llamada de función, ya que la mayoría de las llamadas de Win32 son llamadas a nivel de usuario que hacen internamente las llamadas al kernel necesarias. El vinculador proporciona la dirección de la función Win32 como destino para algún tipo de instrucción de bifurcación, los detalles dependerían del compilador.

[Editar] Parece que tiene razón sobre las interrupciones y la int. mesa de vectores. CodeGuru tiene un buen artículo con los detalles del sistema operativo sobre cómo funcionan las llamadas NT kernel. Enlace:
http://www.codeguru.com/cpp/w-p/system/devicedriverdevelopment/article.php/c8035

+1

Sí, sé que dll tiene las llamadas necesarias en el interior, escribí eso. Pero básicamente todo lo que pido es: ¿Tiene la rutina dll para dibujar un syscalls de Windows en forma de interrupciones de software, o, si no, cómo le dice a Windows kernel que cree una ventana? Porque, por lo que sé, no puede cambiar desde el espacio en el que su programa se está ejecutando de otra manera que la instrucción int debido a la limitación de nivel de anillo. –

+0

b-gen-jack-o-neill: AFAIK el kernel no es responsable de la gestión de ventanas. –

+2

En los procesadores más nuevos, se usan las instrucciones sysenter/sysexit en lugar de emitir una interrupción de software con la instrucción INT. El concepto es el mismo, es una forma de cambiar al modo kernel. Sin embargo, no se gestiona una ventana en el núcleo, no encontrará una llamada al sistema CreateWindow, sino que está construida sobre otras numerosas llamadas al sistema, incluida la comunicación con otros procesos, como un administrador de ventanas – nos

3

La API de Win32 es una capa que se ejecuta en modo de usuario (anillo 3). Windows también solía soportar una capa API OS/2 y POSIX, pero cayeron en desuso y se eliminaron. El administrador de ventanas es un código de modo de usuario puro, no se involucran llamadas al kernel. Solo las llamadas API que usan recursos del kernel (CreateThread, VirtualAlloc, etc.) llamarán al sistema operativo "real" (ntdll.dll) y atraparán el anillo 0 con una interrupción del software (int 0x2e).

+2

Esta no es toda la historia. Desde NT4 el administrador de ventanas ha estado en el modelo kernel (win32k.sys) y tiene un montón de syscalls para llamarlo. Incluso antes de eso, vivía en CSRSS, y tenía que llamar a través del kernel para llegar a él (usando LPC) por lo que aún había una llamada al kernel implicada. Además, Windows no ha utilizado int 0x2e para entrar en el modo kernel por un tiempo. Depende de la arquitectura en la que se encuentre, pero normalmente ahora usa sysenter para acceder al modo kernel en x86. – Stewart

Cuestiones relacionadas