Passaggio Parametri a Chiamate di sistema

I parametri vengono passati a chiamate di sistema nello stesso modo in cui i parametri vengono passati ad altre funzioni, ma si applicano alcune convenzioni e limitazioni aggiuntive richiamate.

In primo luogo, le chiamate di sistema non possono avere parametri di virgola mobile. Infatti, il sistema operativo non conserva il contenuto dei registri a virgola mobile quando una chiamata di sistema viene prestata da un altro thread, quindi le chiamate di sistema non possono utilizzare operazioni a virgola mobile.

In secondo luogo, poiché una chiamata di sistema viene eseguita sul proprio stack, il numero di argomenti che possono essere passati a una chiamata di sistema è limitato. Le convenzioni di linkage del sistema operativo specificano che fino a otto registri di finalità generale vengono utilizzati per il passaggio dei parametri. Se più parametri esistono rispetto a quanto si adatterà in otto registri, i restanti parametri vengono passati nella pila. Poiché una chiamata di sistema non ha accesso diretto allo stack dell'applicazione, tutti i parametri per le chiamate di sistema devono rientrare in otto registri.

Terzo, alcuni parametri vengono passati in più registri. Ad esempio, 32 - bit applicazioni passano lunga durata parametri in due registri e le strutture passate per valore possono richiedere più registri, a seconda della dimensione della struttura. Lo scrittore di una chiamata di sistema dovrebbe conoscere il modo in cui i parametri vengono passati dal compilatore e assicurarsi che il limite di 8 registri non venga superato. Per ulteriori informazioni sulle convenzioni di richiamo dei parametri, consultare Convenzione Linkage Subroutine.

Infine, poiché le applicazioni a 32 - bit sono supportate dal kernel a 64 - bit, il modello di dati utilizzato dal kernel non corrisponde sempre al modello di dati utilizzato dall'applicazione. Quando i modelli di dati non corrispondono, la chiamata di sistema potrebbe dover eseguire un'elaborazione extra prima che i parametri possano essere utilizzati.

La macro IS64U può essere utilizzata per determinare se il chiamante di una chiamata di sistema è un processo a 64 - bit.

I modelli di dati ILP32 e LP64 differiscono nel modo in cui i parametri di puntamento e lunga e lunga durata vengono trattati quando utilizzati in strutture o passati come parametri funzionali. Le tabelle seguenti riepilogano le differenze.
Tipo Dimensione Utilizzato come parametro
long 32 bit Un registro
puntatore 32 bit Un registro
lunga durata 64 bit Due registri
Tipo Dimensione Utilizzato come parametro
long 64 bit Un registro
puntatore 64 bit Un registro
lunga durata 64 bit Un registro

Le chiamate di sistema che utilizzano questi tipi devono tener conto dei diversi modelli di dati. Il trattamento di questi tipi dipende dal fatto che siano utilizzati come parametri o in strutture passate come parametri per valore o per riferimento.