GNU/Linux >> Linux Esercitazione >  >> Linux

Dove è documentato l'ABI x86-64 System V?

Il documento psABI System V AMD64 è mantenuto come fonti LaTeX su GitLab. Allo stesso modo, i386 psABI è un repository GitLab separato. (Precedentemente su github). Quelle pagine contengono informazioni su dove vengono discusse le revisioni.
L'ABI x32 (puntatori a 32 bit in modalità lunga) fa parte del documento x86-64 aka AMD64 ABI. Vedi Capitolo 10:Modello di programmazione ILP32.

Il repository GitLab crea automaticamente un PDF dell'attuale versione x86-64 , ma non i386.

Vedi anche il wiki del tag x86 per altre guide/riferimenti/link.

L'ultima versione su Github era x86-64 versione 1.0 bozza (gennaio 2018). A partire da luglio 2022, la versione corrente è ancora la 1.0, con la parola Bozza rimossa entro la fine del 2018.

Github ospita anche un PDF di i386 ABI versione 1.1.
(Si noti che la maggior parte dei sistemi operativi non Linux utilizza una versione precedente dell'ABI i386 che non richiede l'allineamento dello stack a 16 byte, solo 4. GCC ha finito per dipendere da -mpreferred-stack-boundary=4 Allineamento a 16 byte per la sua generazione di codice SSE (forse involontariamente), e alla fine l'ABI è stato aggiornato per Linux per sancirlo come requisito ufficiale. Ho tentato un riepilogo in un commento sul bug #40838 di GCC. Questo interrompe la compatibilità all'indietro con alcuni asm scritti a mano che chiamano altre funzioni.)

Ufficiosamente, è richiesto l'estensione del segno a 32 bit (sia per i386 che per amd64), perché clang dipende da questo. Si spera che una futura revisione dell'ABI lo documenti. GCC e/o clang ora hanno alcune opzioni per controllarlo (TODO scopri come venivano chiamati), ma l'impostazione predefinita è sempre la stessa del 2022.

Denominazione:psABI

Il supplemento per il processore (psABI) i documenti sono concepiti come supplemento al System V gABI (generico) meno aggiornato, ospitato sul sito web di SCO.

Altri link

Anche https://refspecs.linuxfoundation.org/ ospita una copia del gABI del 1997.

https://uclibc.org/specs.html ha collegamenti psABI per vari ISA non x86. (Sebbene, ad esempio, ARM sembri documentare solo il layout del file ELF, non la convenzione di chiamata o lo stato di avvio del processo.) https://uclibc.org/docs/psABI-x86_64.pdf è una copia obsoleta di x86-64 psABI (0,99,7 dal 2014). La versione su GitHub ha una formulazione più chiara di alcune cose e correzioni di bug in alcuni esempi.

Correlata:Descrive quali sono le convenzioni di chiamata per le chiamate di sistema UNIX e Linux (e le funzioni dello spazio utente) su i386 e x86-64 la convenzione di chiamata di sistema per x86-64 SysV (così come i386 Linux contro FreeBSD).

Riepiloga anche le convenzioni di chiamata di funzione per argomenti interi. Le chiamate di sistema non accettano argomenti vettoriali FP o SSE/AVX o strutture per valore, quindi la convenzione di chiamata di funzione è più complicata.

Agner Fog ha una guida alle convenzioni di chiamata (che copre Windows rispetto a Sys V e le varie convenzioni per 32 bit e suggerimenti/trucchi per la scrittura di funzioni che è possibile utilizzare su entrambe le piattaforme). Questo è un PDF separato dalle sue guide di ottimizzazione e microarchitettura e tabelle di istruzioni (che sono letture essenziali se ti interessano le prestazioni).

Wikipedia ha un articolo sulle convenzioni di chiamata x86 che descrive varie convenzioni, ma per lo più non in modo sufficientemente dettagliato per usarle per qualcosa di diverso da semplici argomenti interi. (ad es. nessuna descrizione delle regole di impacchettamento delle strutture).

Correlato:C++ ABI

GCC e Clang (su tutte le architetture) utilizzano l'ABI C++ originariamente sviluppato per Itanium. https://itanium-cxx-abi.github.io/cxx-abi/. Ciò è rilevante, ad esempio, per quali requisiti una struttura/classe C++ deve essere passata nei registri (ad esempio essendo un aggregato secondo una definizione), rispetto a quando una struttura/classe deve sempre avere un indirizzo e essere passata per riferimento, anche quando è abbastanza piccolo da contenere 2 registri. Queste regole dipendono da cose che hanno un costruttore o distruttore non banale.


Base standard Linux

La Linux Standard Base, che può essere considerata da alcuni la specifica autorevole per questa materia, ha una sezione chiamata 7.2. "Function Calling Sequence" punta alla 2.1. "Sezione Riferimenti Normativi" che contiene i seguenti link:

  • Interfaccia binaria dell'applicazione System V, edizione 4.1 http://www.sco.com/developers/devspecs/gabi41.pdf
  • Interfaccia binaria dell'applicazione System V - BOZZA - 17 dicembre 2003 http://www.sco.com/developers/gabi/2003-12-17/contents.html
  • Supplemento per il processore dell'architettura AMD64 dell'interfaccia binaria dell'applicazione System V, bozza versione 0.95 http://refspecs.linux-foundation.org/elf/x86_64-abi-0.95.pdf

Consiglierei quindi di utilizzare quelle versioni delle specifiche come quelle canoniche a meno che tu non abbia una buona ragione per fare altrimenti.


La versione corrente del Sistema V ABI da GitLab può essere facilmente trasformato in un bel PDF con questi passaggi, assumendo 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

Questo produrrà un file chiamato abi.pdf che è proprio quello necessario, come di seguito.

Tieni presente che la data nel titolo sembra essere la data di creazione del PDF anziché l'effettiva data dell'ultima modifica del documento.


Linux
  1. Dov'è la funzione itoa in Linux?

  2. Come reindirizzare l'output di system() su un file?

  3. Dov'è il comando gem in RHEL6?

  4. Dove sono documentati i contenuti di /proc del kernel Linux?

  5. Dove sono documentati i parametri del kernel Linux presenti in /proc/sys?

Introduzione al file system Linux

Arch Linux – Personalizzazione del sistema

Come utilizzare il comando fd sul sistema Linux

Dove posso trovare la prima versione del sistema operativo Linux?

Qual è l'interfaccia per le chiamate di sistema ARM e dove è definita nel kernel Linux?

Dov'è il fork() sulla fork bomb :(){ :|:&};:?