Técnica de programación mediante saltos indirectos.
En programación de computadoras , la palabra trampolín tiene varios significados y generalmente se asocia con instrucciones de salto (es decir, moverse a diferentes rutas de código).
Programación de bajo nivel
Los trampolines (a veces denominados vectores de salto indirectos ) son ubicaciones de memoria que contienen direcciones que apuntan a rutinas de servicio de interrupción , rutinas de E/S , etc. La ejecución salta al trampolín y luego inmediatamente salta o rebota, de ahí el término trampolín . Tienen muchos usos:
- Trampoline se puede utilizar para superar las limitaciones impuestas por la arquitectura de una unidad central de procesamiento (CPU) que espera encontrar siempre vectores en ubicaciones fijas.
- Cuando se inicia un sistema operativo en una máquina de multiprocesamiento simétrico (SMP), solo estará activo un procesador, el procesador de arranque. Una vez que el sistema operativo se haya configurado, indicará a los otros procesadores que salten a un fragmento de código de trampolín que inicializará los procesadores y esperará a que el sistema operativo comience a programar subprocesos en ellos.
Programación de alto nivel
- Como se usa en algunas implementaciones de Lisp , un trampolín es un bucle que invoca iterativamente funciones de retorno de procesador ( estilo de paso de continuación ). Un solo trampolín es suficiente para expresar todas las transferencias de control de un programa; un programa así expresado es un trampolín o un estilo trampolín ; convertir un programa al estilo trampolín es hacer un trampolín. Los programadores pueden utilizar funciones de trampolín para implementar llamadas a funciones recursivas de cola en lenguajes de programación orientados a pila . [1]
- En Java , trampolín se refiere al uso de la reflexión para evitar el uso de clases internas , por ejemplo en detectores de eventos. La sobrecarga de tiempo de una llamada de reflexión se intercambia por la sobrecarga de espacio de una clase interna. Los trampolines en Java generalmente implican la creación de un GenericListener para pasar eventos a una clase externa. [2]
- En Mono Runtime , los trampolines son pequeñas piezas de código ensamblador escritas a mano que se utilizan para realizar diversas tareas. [3]
- Cuando se interconectan fragmentos de código con convenciones de llamadas incompatibles , se utiliza un trampolín para convertir la convención de la persona que llama en la convención del destinatario.
- En los sistemas integrados , los trampolines son fragmentos cortos de código que inician otros fragmentos de código. Por ejemplo, en lugar de escribir controladores de interrupciones completamente en lenguaje ensamblador, otra opción es escribir controladores de interrupciones principalmente en C y usar un trampolín corto para convertir la convención de llamada de interrupciones del lenguaje ensamblador en la convención de llamada de C. [4]
- Cuando se pasa una devolución de llamada a un sistema que espera llamar a una función C , pero se quiere que ejecute el método de una instancia particular de una clase escrita en C++ , se usa un trampolín corto para convertir la convención de llamada de funciones de C a C++. convención de llamada de métodos. Una forma de escribir un trampolín de este tipo es utilizar un golpe seco . [5] Otro método es utilizar un oyente genérico . [2]
- En Objective-C , un trampolín es un objeto devuelto por un método que captura y cosifica todos los mensajes que se le envían y luego "rebota" esos mensajes en otro objeto, por ejemplo, en mensajes de orden superior . [6]
- En el compilador GCC , trampolín se refiere a una técnica para implementar punteros a funciones anidadas cuando la opción está habilitada. [7] El trampolín es un pequeño fragmento de código que se construye sobre la marcha en la pila cuando se toma la dirección de una función anidada. El trampolín configura el puntero de enlace estático, que permite que la función anidada acceda a las variables locales de la función adjunta. El puntero de función es entonces simplemente la dirección del trampolín. Esto evita tener que utilizar punteros de función "gordos" para funciones anidadas que llevan tanto la dirección del código como el enlace estático. [8] [9] [10] Esto, sin embargo, entra en conflicto con el deseo de hacer que la pila no sea ejecutable por razones de seguridad.
-ftrampolines
- En el lenguaje de programación esotérico Befunge , un trampolín es una instrucción para saltar la siguiente celda en el flujo de control .
Pilas sin ejecución
Algunas implementaciones de trampolines provocan una pérdida de pilas no ejecutables (pila NX). En la colección de compiladores GNU (GCC) en particular, una función anidada construye un trampolín en la pila en tiempo de ejecución y luego llama a la función anidada a través de los datos de la pila. El trampolín requiere que la pila sea ejecutable.
Las pilas que no se ejecutan y las funciones anidadas se excluyen mutuamente según GCC. Si se utiliza una función anidada en el desarrollo de un programa, entonces la pila NX se pierde silenciosamente. GCC ofrece la -Wtrampolines
advertencia para alertar de la condición.
El software diseñado utilizando un ciclo de vida de desarrollo seguro a menudo no permite el uso de funciones anidadas debido a la pérdida de pilas de NX. [11]
Ver también
Referencias
- ^ Baker, Henry G. (septiembre de 1995). "Los CONTRAS no deberían contrarrestar sus argumentos, Parte II: Cheney sobre la MTA" Avisos de ACM SIGPLAN . 30 (9): 17–20. doi :10.1145/214448.214454. S2CID 20720831. Archivado desde el original el 11 de noviembre de 2016.
- ^ ab Müller, Hans (31 de enero de 2005). "Afirmar el control sobre la GUI: comandos, valores predeterminados y paquetes de recursos". hoy.java.net . Trampolines . Consultado el 6 de noviembre de 2015 .[1]
- ^ "Trampolines". Proyecto Mono. 8 de octubre de 2022.
- ^ Enlace, Joseph M. (1 de septiembre de 2001). "Trampolines para sistemas integrados: minimizar la latencia de los controladores de interrupciones". Diario del Dr. Dobb . Archivado desde el original el 27 de mayo de 2018 . Consultado el 26 de mayo de 2018 .
- ^ Stangvik, Einar Otto (16 de agosto de 2006). "Pensar en Win32 con C++". Archivado desde el original el 15 de octubre de 2012.
- ^ Weiher, Marcel (2004). "Mensajería de orden superior (HOM)" (PDF) . Archivado (PDF) desde el original el 27 de mayo de 2018 . Consultado el 26 de mayo de 2018 .
- ^ fuz (18 de noviembre de 2011). "Implementación de funciones anidadas". Desbordamiento de pila . Archivado desde el original el 29 de marzo de 2016 . Consultado el 26 de mayo de 2018 .
- ^ "Trampolines para funciones anidadas". Usando la colección de compiladores GNU (GCC) . 2018 [2002]. 18.11. Archivado desde el original el 27 de mayo de 2018 . Consultado el 26 de mayo de 2018 .
- ^ "Funciones anidadas". Usando la colección de compiladores GNU (GCC) . 2018 [2002]. 6.4. Archivado desde el original el 27 de mayo de 2018 . Consultado el 26 de mayo de 2018 .
- ^ Breuel, Thomas M. (2013). "Cierres léxicos para C++" (PDF) . Archivado (PDF) desde el original el 12 de diciembre de 2017 . Consultado el 26 de mayo de 2018 .
- ^ Walton, Jeffrey; Manico, Jim; Muro, Kevin (2 de marzo de 2018) [2013]. "Endurecimiento de la cadena de herramientas basado en C". El Proyecto de Seguridad de Aplicaciones Web Abiertas (OWASP). Archivado desde el original el 27 de mayo de 2018 . Consultado el 2 de marzo de 2018 .