2013-12-11 9 views
5

Mi sto insegnando come linguaggio assembly di Linux e ho trovato una differenza interessante tra BSD e Linux. In Unix, si spingono i parametri di syscall sullo stack prima di chiamare un interrupt di 80 h; al contrario, in Linux, si passano i parametri nei registri.Perché Linux non segue le convenzioni syscall di Unix?

Qualcuno sa quale sia stata la logica per gli sviluppatori Linux di utilizzare registri anziché stack?

Nota: questa è una buona pagina che dettaglia la differenza: FreeBSD Developer's Handbook:System Calls senza spiegare la logica.

+0

nessuna idea chiara, ma forse è legata alla velocità di esecuzione e accessibilità del luogo? aspetterò qualcuno per chiarire. –

+3

Perché chiami cosa BSD fa "Unix"? – unwind

+0

@unwind - il collegamento ipertestuale che ho incluso nella mia domanda suggerisce che BSD segue le convenzioni Unix per le syscalls e Linux no. È altrimenti? – clay

risposta

1

La convenzione syscall è diversa perché la sequenza di chiamata della funzione standard è diversa. Suppongo che tu stia parlando della differenza tra la convenzione di chiamata x86-32 e la convenzione di chiamata AMD64. È possibile controllare l'AMD64 ABI here.

Ma se si vuole arrivare al punto rapidamente controllare post this. Fondamentalmente si tratta di velocità. Modificando la convenzione di chiamata e utilizzando i registri anziché lo stack, è possibile rimuovere le istruzioni nel prologo e l'epilogo di una chiamata.

1

È possibile utilizzare anche alcuni registri con codice a 32 bit. Esistono diverse convenzioni di chiamata per il codice a 32 bit: cdecl, stdcall, pascal e fastcall. Windows e Linux utilizzano le stesse convenzioni di chiamata per il codice a 32 bit. Con fastcall (__attribute((fastcall) in GCC) possono essere registrati i primi due parametri interi (3 con alcuni compilatori). Le altre convenzioni di chiamata utilizzano lo stack.

Per codice a 64 bit Windows e Linux utilizzano diverse convenzioni di chiamata. Linux può utilizzare fino a 14 registri per le chiamate e Windows solo sei. L'uso dei registri può rendere il codice più veloce. Questo potrebbe essere parte della ragione per cui un codice a 64 bit con molte chiamate di funzione esegue O (10%) più veloce dello stesso codice a 32 bit.

Problemi correlati