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.
| 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.