GNU/Linux >> Tutoriales Linux >  >> Linux

¿Dónde está documentada la ABI x86-64 System V?

El documento System V AMD64 psABI se mantiene como fuentes de LaTeX en GitLab. Del mismo modo, el i386 psABI es un repositorio de GitLab separado. (Anteriormente en github). Esas páginas tienen información sobre dónde se discuten las revisiones.
El x32 ABI (punteros de 32 bits en modo largo) es parte del documento x86-64, también conocido como AMD64 ABI. Consulte el Capítulo 10:Modelo de programación ILP32.

El repositorio de GitLab crea automáticamente un PDF de la versión x86-64 actual , pero no i386.

Consulte también la wiki de etiquetas x86 para obtener otras guías/referencias/enlaces.

La última versión en Github fue el borrador x86-64 versión 1.0 (enero de 2018). A partir de julio de 2022, la versión actual sigue siendo 1.0, y la palabra Borrador se eliminó a fines de 2018.

Github también alberga un PDF de i386 ABI versión 1.1.
(Tenga en cuenta que la mayoría de los sistemas operativos que no son Linux usan una versión anterior de i386 ABI que no requiere una alineación de pila de 16 bytes, solo 4. GCC terminó dependiendo de -mpreferred-stack-boundary=4 Alineación de 16 bytes para su generación de código SSE (quizás sin querer) y, finalmente, la ABI se actualizó para Linux para consagrar eso como un requisito oficial. Intenté un resumen en un comentario sobre el error GCC #40838. Esto rompe la compatibilidad inversa con algunos asm escritos a mano que llaman a otras funciones).

Extraoficialmente, se requieren argumentos estrechos que extiendan el signo a 32 bits (tanto para i386 como para amd64), porque el sonido metálico depende de ello. Con suerte, una futura revisión de ABI documentará eso. GCC y/o clang ahora tienen algunas opciones para controlar eso (TODO desenterrar cómo se llamaban), pero el valor predeterminado sigue siendo el mismo a partir de 2022.

Denominación:psABI

El suplemento del procesador Los documentos (psABI) están diseñados como un complemento del System V gABI (genérico), que se actualiza con menos frecuencia y está alojado en el sitio web de SCO.

Otros enlaces

También https://refspecs.linuxfoundation.org/ alberga una copia de gABI de 1997.

https://uclibc.org/specs.html tiene enlaces psABI para varias ISA que no son x86. (Aunque, por ejemplo, ARM solo parece documentar el diseño del archivo ELF, no la convención de llamada o el estado de inicio del proceso). psABI (0.99.7 desde 2014). La versión en GitHub tiene una redacción más clara de algunas cosas y correcciones de errores en algunos ejemplos.

Relacionado:¿Cuáles son las convenciones de llamada para las llamadas del sistema UNIX y Linux (y funciones de espacio de usuario) en i386 y x86-64? la convención de llamada al sistema para x86-64 SysV (así como i386 Linux vs. FreeBSD).

También resume las convenciones de llamadas a funciones para argumentos enteros. Las llamadas al sistema no toman argumentos vectoriales FP o SSE/AVX, ni estructuras por valor, por lo que la convención de llamadas a funciones es más complicada.

Agner Fog tiene una guía de convenciones de llamadas (que cubre Windows vs. Sys V, y las diversas convenciones para 32 bits, y consejos/trucos para escribir funciones que puede usar en cualquiera de las plataformas). Este es un PDF separado de sus guías de optimización y microarquitectura y tablas de instrucciones (que son lecturas esenciales si te preocupa el rendimiento).

Wikipedia tiene un artículo de convenciones de llamadas x86 que describe varias convenciones, pero en su mayoría no con suficiente detalle para usarlas para otra cosa que no sean simples argumentos enteros. (por ejemplo, sin descripción de las reglas de empaquetado de estructuras).

Relacionado:C++ ITB

GCC y Clang (en todas las arquitecturas) utilizan la ABI de C++ desarrollada originalmente para Itanium. https://itanium-cxx-abi.github.io/cxx-abi/. Esto es relevante, por ejemplo, para los requisitos que una estructura/clase de C++ debe pasar en los registros (por ejemplo, ser un agregado de acuerdo con alguna definición), frente a cuando una estructura/clase siempre necesita tener una dirección y pasar por referencia, incluso cuando es lo suficientemente pequeño para empacar en 2 registros. Estas reglas dependen de que las cosas tengan un constructor o destructor no trivial.


Base estándar de Linux

La base estándar de Linux, que algunos pueden considerar la especificación autorizada para este asunto, tiene una sección llamada 7.2. "Secuencia de llamada de función" apunta a la 2.1. "Sección de referencias normativas" que contiene los siguientes enlaces:

  • Interfaz binaria de aplicaciones System V, edición 4.1 http://www.sco.com/developers/devspecs/gabi41.pdf
  • Interfaz binaria de la aplicación System V - BORRADOR - 17 de diciembre de 2003 http://www.sco.com/developers/gabi/2003-12-17/contents.html
  • Suplemento del procesador de arquitectura AMD64 de la interfaz binaria de la aplicación System V, versión preliminar 0.95 http://refspecs.linux-foundation.org/elf/x86_64-abi-0.95.pdf

Por lo tanto, recomendaría usar esas versiones de las especificaciones como las canónicas a menos que tenga una buena razón para hacerlo de otra manera.


La versión actual del Sistema V ABI de GitLab se puede convertir fácilmente en un agradable PDF con estos pasos, asumiendo un sistema Ubuntu.

sudo apt-get install texlive-full
git clone https://gitlab.com/x86-psABIs/x86-64-ABI
cd x86-64-ABI
make pdf

Esto producirá un archivo llamado abi.pdf que es el mismo que se necesita, como se muestra a continuación.

Tenga en cuenta que la fecha en el título parece ser la fecha de creación del PDF en lugar de la fecha real de la última modificación del documento.


Linux
  1. Cómo cambiar la identidad de un sistema Linux

  2. ¿Dónde está el temporizador Cron?

  3. ¿Dónde está la función itoa en Linux?

  4. ¿Cómo redirigir la salida de system() a un archivo?

  5. ¿Cuál es la interfaz para las llamadas al sistema ARM y dónde se define en el kernel de Linux?

Introducción al sistema de archivos de Linux

Arch Linux – Personalizando el sistema

¿Cuál es el nivel de ejecución actual del sistema Linux?

¿Salida del comando "último"?

Cómo usar el comando fd en el sistema Linux

¿Dónde puedo encontrar la primera versión del sistema operativo Linux?