2011-01-27 34 views
18

Esto es lo que dice Wikipedia:¿Qué es ABI (Application Binary Interface)?

En el software del ordenador, una interfaz de aplicación binaria (ABI) describe la interfaz de bajo nivel entre una aplicación (o cualquier tipo de) programa y el sistema operativo o otra aplicación .

ABI cubre detalles tales como tipo de datos, tamaño , y alineación; la convención de llamada , que controla cómo se pasan los argumentos de las funciones y se recuperan los valores de retorno ; los números de llamada del sistema y cómo una aplicación debe realizar llamadas al sistema ; y en el caso de un sistema operativo completo ABI, el formato binario de archivos de objetos, programa bibliotecas y más. Una completa ABI, como la compatibilidad binaria estándar de Intel (IBC), permite que un programa de un sistema operativo compatible que ABI se ejecute sin modificaciones en cualquier otro sistema de este tipo, siempre que las bibliotecas compartidas necesarias son presente, y se cumplen los requisitos previos similares .

Supongo que un ABI es una convención o estándar, y los compiladores/vinculadores usan esta convención para producir códigos de objeto. ¿Está bien? Si es así, ¿quién hizo estas convenciones (empresas o alguna organización)? ¿Cómo era cuando no había ABI? ¿Hay documentos sobre estos ABI a los que podamos referirnos?

+7

Ver http://stackoverflow.com/questions/2171177/i-never-really-understood-what-is-application-binary-interface-abi – Simone

Respuesta

12

Tiene razón sobre la definición de ABI, hasta cierto punto. El ejemplo clásico es la interfaz syscall en Linux (y otros UNIX).

Son una forma estándar para que el código solicite al sistema operativo que realice ciertas tareas.

Como tal, se deciden por las personas que escribieron el SO o, en el caso en el que syscalls se agregaron después, por quien los haya agregado (en los casos en que el SO lo permita). Por ejemplo, la interfaz de Linux en x86 syscall establece que se carga el número syscall en eax, con otros parámetros colocados en ebx, ecx y así sucesivamente, dependiendo de la syscall que está haciendo (eax).

Normalmente, no es el compilador o el vinculador el que hace el trabajo de interfaz, sino que son las bibliotecas proporcionadas para el idioma que está utilizando.

Volviendo a Linux, las bibliotecas GNU C contienen código para fopen (por ejemplo) que finalmente llame a la correspondiente syscall para realizar las tareas de nivel inferior (syscall número 5, open). Se puede encontrar una lista de syscalls en this PDF file.

+0

No creo que sea el sistema operativo que define el ABI, Creo que es la arquitectura de la máquina que define su propio ABI específico, corrígeme si estoy equivocado. – AnkitSablok

+1

@Ankit, la arquitectura de la máquina puede limitar los métodos posibles, pero la elección la realiza el SO. Considere, por ejemplo, las formas sysenter e int80 de hacer llamadas al sistema Linux en x86. También podría usar variables de pila o direcciones de memoria fija para pasar parámetros en lugar de usar registros. – paxdiablo

+0

La arquitectura de la máquina solo tiene control sobre cómo el kernel invoca los métodos, su número depende del kernel del sistema operativo para esa arquitectura, supongo – AnkitSablok

4

La especificación es un término más adecuado que una convención, ya que la convención es un término abreviado para la práctica ampliamente aceptada, mientras que la especificación está bien definida.

Tienes razón. La especificación está hecha por el cuerpo de estandarización.Eche un vistazo a la especificación POSIX, que es compatible con Windows y las cadenas de herramientas de compilación/compilación, como gcc, asume que el sistema operativo se adhiere a ella, e incluso el kernel de Linux se adhiere parcialmente (casi exactamente) a ella.

¿Antes de ABI? Incluso hoy en día, el firmware está hecho a mano a medida que aparecen nuevos chips para decodificadores y otros dispositivos que tienen sistemas incorporados.

La documentación es contenido de lógica digital en la hoja de datos para que los chips sean programados por lenguaje ensamblador y para lenguaje de alto nivel, la documentación de la cadena de herramientas del compilador cruzado revela los supuestos que deberían ser parte de ABI.

2

Bueno, el concepto de ABI fue presumiblemente concebido para admitir la compatibilidad binaria de su programa en otros sistemas operativos y arquitecturas de máquina. Entonces, supongamos que usted escribió un programa en alguna distribución de sistema operativo que se ejecuta en la arquitectura x86. Ahora, para un programador, lo más importante es que este programa que escribió en su máquina debería ser capaz de funcionar exactamente igual en cualquier otra máquina que se ejecute en la misma o diferente arquitectura. Digamos por motivos de discusión que la otra máquina se está ejecutando en la arquitectura i386 y aquí entra el concepto de ABI o Application Binary Interfaces. Como cada arquitectura de máquina define su propia forma en que el kernel del sistema operativo habla con el mundo exterior, es decir, programas de espacio de usuario, por lo tanto, cada arquitectura define un conjunto diferente de llamadas al sistema, registros de máquinas, cómo se usan esos registros, cómo el kernal maneja las interrupciones de software, etc. ABI es lo que maneja estas cosas para usted, como compilar, vincular, ordenar byte, etc. Los programadores del sistema han tenido mala suerte al definir un ABI uniforme para los mismos sistemas operativos que se ejecutan en arquitecturas diferentes y es por eso que cada arquitectura de máquina tiene su propia y necesita compilar sus programas para confirmar el formato de esas máquinas.