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
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
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).
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
- 1. ¿Llamadas al sistema en Windows y API nativa?
- 2. R y llamadas al sistema
- 3. Debian para llamadas al sistema
- 4. fork() - múltiples procesos y llamadas al sistema
- 5. Reproducción de sonido en C++ utilizando llamadas al sistema nativo?
- 6. Supresión de llamadas al sistema al usar gcc/g ++
- 7. Monitorización de ciertas llamadas al sistema realizadas por un proceso en Windows
- 8. ¿Cuántas llamadas al sistema hay en Linux kernel 2.6?
- 9. Windows C llamada al sistema con espacios en el comando
- 10. Llamadas al sistema operativo desde el script bash
- 11. Obteniendo llamadas al sistema Python como resultado de cadena
- 12. Cómo prohibir las llamadas al sistema, GNU/Linux
- 13. ¿Cuándo y cómo se interrumpen las llamadas al sistema?
- 14. ¿Cómo rastrear un proceso para llamadas al sistema?
- 15. GCC cómo bloquear llamadas al sistema dentro de un programa?
- 16. (Windows) Monitoreo de llamadas API en C
- 17. x86_64 Ensamblaje Sistema Linux Confusión de llamadas
- 18. llamadas multihilo en la aplicación Windows Forms?
- 19. ¿Qué podría hacer que las llamadas al sistema Perl comiencen a fallar?
- 20. evitando las llamadas al navegador en R
- 21. ¿Cómo hacer llamadas de comandos del sistema en Java/Groovy?
- 22. En Perl, ¿cómo puedo bloquear para que finalicen un montón de llamadas al sistema?
- 23. ¿Todas las llamadas al sistema no son seguras en tiempo real?
- 24. ¿Cuáles son las posibles formas de interceptar las llamadas al sistema en entornos Unix?
- 25. La formación de comandos shell sanitarias o llamadas al sistema en Ruby
- 26. Buscando la implementación de llamadas al sistema en el núcleo de Linux
- 27. Lista de y documentación para llamadas al sistema para kernel XNU en OSX
- 28. Creación de nuevas llamadas al sistema a través de KLD en FreeBSD
- 29. ¿Puedo obtener un resultado continuo de las llamadas al sistema en Ruby?
- 30. ¿Por qué las llamadas al sistema devuelven EFAULT en lugar de enviar una segfault?
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. –
b-gen-jack-o-neill: AFAIK el kernel no es responsable de la gestión de ventanas. –
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