1edba5eecSFederico Vaga.. include:: ../disclaimer-ita.rst
2edba5eecSFederico Vaga
3edba5eecSFederico Vaga:Original: :ref:`Documentation/process/adding-syscalls.rst <addsyscalls>`
4fdf0345eSFederico Vaga:Translator: Federico Vaga <federico.vaga@vaga.pv.it>
5edba5eecSFederico Vaga
6edba5eecSFederico Vaga.. _it_addsyscalls:
7edba5eecSFederico Vaga
8edba5eecSFederico VagaAggiungere una nuova chiamata di sistema
9edba5eecSFederico Vaga========================================
10edba5eecSFederico Vaga
11fdf0345eSFederico VagaQuesto documento descrive quello che è necessario sapere per aggiungere
12fdf0345eSFederico Vaganuove chiamate di sistema al kernel Linux; questo è da considerarsi come
13fdf0345eSFederico Vagaun'aggiunta ai soliti consigli su come proporre nuove modifiche
14fdf0345eSFederico Vaga:ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`.
15edba5eecSFederico Vaga
16fdf0345eSFederico Vaga
17fdf0345eSFederico VagaAlternative alle chiamate di sistema
18fdf0345eSFederico Vaga------------------------------------
19fdf0345eSFederico Vaga
20fdf0345eSFederico VagaLa prima considerazione da fare quando si aggiunge una nuova chiamata di
21fdf0345eSFederico Vagasistema è quella di valutare le alternative.  Nonostante le chiamate di sistema
22fdf0345eSFederico Vagasiano il punto di interazione fra spazio utente e kernel più tradizionale ed
23fdf0345eSFederico Vagaovvio, esistono altre possibilità - scegliete quella che meglio si adatta alle
24fdf0345eSFederico Vagavostra interfaccia.
25fdf0345eSFederico Vaga
26fdf0345eSFederico Vaga - Se le operazioni coinvolte possono rassomigliare a quelle di un filesystem,
27fdf0345eSFederico Vaga   allora potrebbe avere molto più senso la creazione di un nuovo filesystem o
28fdf0345eSFederico Vaga   dispositivo.  Inoltre, questo rende più facile incapsulare la nuova
29fdf0345eSFederico Vaga   funzionalità in un modulo kernel piuttosto che essere sviluppata nel cuore
30fdf0345eSFederico Vaga   del kernel.
31fdf0345eSFederico Vaga
32fdf0345eSFederico Vaga     - Se la nuova funzionalità prevede operazioni dove il kernel notifica
33fdf0345eSFederico Vaga       lo spazio utente su un avvenimento, allora restituire un descrittore
34fdf0345eSFederico Vaga       di file all'oggetto corrispondente permette allo spazio utente di
35fdf0345eSFederico Vaga       utilizzare ``poll``/``select``/``epoll`` per ricevere quelle notifiche.
36fdf0345eSFederico Vaga     - Tuttavia, le operazioni che non si sposano bene con operazioni tipo
37fdf0345eSFederico Vaga       :manpage:`read(2)`/:manpage:`write(2)` dovrebbero essere implementate
38fdf0345eSFederico Vaga       come chiamate :manpage:`ioctl(2)`, il che potrebbe portare ad un'API in
39fdf0345eSFederico Vaga       un qualche modo opaca.
40fdf0345eSFederico Vaga
41fdf0345eSFederico Vaga - Se dovete esporre solo delle informazioni sul sistema, un nuovo nodo in
420c1bc6b8SMauro Carvalho Chehab   sysfs (vedere ``Documentation/filesystems/sysfs.rst``) o
43fdf0345eSFederico Vaga   in procfs potrebbe essere sufficiente.  Tuttavia, l'accesso a questi
44fdf0345eSFederico Vaga   meccanismi richiede che il filesystem sia montato, il che potrebbe non
45fdf0345eSFederico Vaga   essere sempre vero (per esempio, in ambienti come namespace/sandbox/chroot).
46fdf0345eSFederico Vaga   Evitate d'aggiungere nuove API in debugfs perché questo non viene
47fdf0345eSFederico Vaga   considerata un'interfaccia di 'produzione' verso lo spazio utente.
48fdf0345eSFederico Vaga - Se l'operazione è specifica ad un particolare file o descrittore, allora
49fdf0345eSFederico Vaga   potrebbe essere appropriata l'aggiunta di un comando :manpage:`fcntl(2)`.
50fdf0345eSFederico Vaga   Tuttavia, :manpage:`fcntl(2)` è una chiamata di sistema multiplatrice che
51fdf0345eSFederico Vaga   nasconde una notevole complessità, quindi è ottima solo quando la nuova
52fdf0345eSFederico Vaga   funzione assomiglia a quelle già esistenti in :manpage:`fcntl(2)`, oppure
53fdf0345eSFederico Vaga   la nuova funzionalità è veramente semplice (per esempio, leggere/scrivere
54fdf0345eSFederico Vaga   un semplice flag associato ad un descrittore di file).
55fdf0345eSFederico Vaga - Se l'operazione è specifica ad un particolare processo, allora
56fdf0345eSFederico Vaga   potrebbe essere appropriata l'aggiunta di un comando :manpage:`prctl(2)`.
57fdf0345eSFederico Vaga   Come per :manpage:`fcntl(2)`, questa chiamata di sistema è un complesso
58fdf0345eSFederico Vaga   multiplatore quindi è meglio usarlo per cose molto simili a quelle esistenti
59fdf0345eSFederico Vaga   nel comando ``prctl`` oppure per leggere/scrivere un semplice flag relativo
60fdf0345eSFederico Vaga   al processo.
61fdf0345eSFederico Vaga
62fdf0345eSFederico Vaga
63fdf0345eSFederico VagaProgettare l'API: pianificare le estensioni
64fdf0345eSFederico Vaga-------------------------------------------
65fdf0345eSFederico Vaga
66fdf0345eSFederico VagaUna nuova chiamata di sistema diventerà parte dell'API del kernel, e
67fdf0345eSFederico Vagadev'essere supportata per un periodo indefinito.  Per questo, è davvero
68fdf0345eSFederico Vagaun'ottima idea quella di discutere apertamente l'interfaccia sulla lista
69fdf0345eSFederico Vagadi discussione del kernel, ed è altrettanto importante pianificarne eventuali
70fdf0345eSFederico Vagaestensioni future.
71fdf0345eSFederico Vaga
72fdf0345eSFederico Vaga(Nella tabella delle chiamate di sistema sono disseminati esempi dove questo
73fdf0345eSFederico Vaganon fu fatto, assieme ai corrispondenti aggiornamenti -
74fdf0345eSFederico Vaga``eventfd``/``eventfd2``, ``dup2``/``dup3``, ``inotify_init``/``inotify_init1``,
75fdf0345eSFederico Vaga``pipe``/``pipe2``, ``renameat``/``renameat2`` --quindi imparate dalla storia
76fdf0345eSFederico Vagadel kernel e pianificate le estensioni fin dall'inizio)
77fdf0345eSFederico Vaga
78fdf0345eSFederico VagaPer semplici chiamate di sistema che accettano solo un paio di argomenti,
79fdf0345eSFederico Vagail modo migliore di permettere l'estensibilità è quello di includere un
80fdf0345eSFederico Vagaargomento *flags* alla chiamata di sistema.  Per assicurarsi che i programmi
81fdf0345eSFederico Vagadello spazio utente possano usare in sicurezza *flags* con diverse versioni
82fdf0345eSFederico Vagadel kernel, verificate se *flags* contiene un qualsiasi valore sconosciuto,
83fdf0345eSFederico Vagain qual caso rifiutate la chiamata di sistema (con ``EINVAL``)::
84fdf0345eSFederico Vaga
85fdf0345eSFederico Vaga    if (flags & ~(THING_FLAG1 | THING_FLAG2 | THING_FLAG3))
86fdf0345eSFederico Vaga        return -EINVAL;
87fdf0345eSFederico Vaga
88fdf0345eSFederico Vaga(Se *flags* non viene ancora utilizzato, verificate che l'argomento sia zero)
89fdf0345eSFederico Vaga
90fdf0345eSFederico VagaPer chiamate di sistema più sofisticate che coinvolgono un numero più grande di
91fdf0345eSFederico Vagaargomenti, il modo migliore è quello di incapsularne la maggior parte in una
92fdf0345eSFederico Vagastruttura dati che verrà passata per puntatore.  Questa struttura potrà
93fdf0345eSFederico Vagafunzionare con future estensioni includendo un campo *size*::
94fdf0345eSFederico Vaga
95fdf0345eSFederico Vaga    struct xyzzy_params {
96fdf0345eSFederico Vaga        u32 size; /* userspace sets p->size = sizeof(struct xyzzy_params) */
97fdf0345eSFederico Vaga        u32 param_1;
98fdf0345eSFederico Vaga        u64 param_2;
99fdf0345eSFederico Vaga        u64 param_3;
100fdf0345eSFederico Vaga    };
101fdf0345eSFederico Vaga
102fdf0345eSFederico VagaFintanto che un qualsiasi campo nuovo, diciamo ``param_4``, è progettato per
103fdf0345eSFederico Vagaoffrire il comportamento precedente quando vale zero, allora questo permetterà
104fdf0345eSFederico Vagadi gestire un conflitto di versione in entrambe le direzioni:
105fdf0345eSFederico Vaga
106fdf0345eSFederico Vaga - un vecchio kernel può gestire l'accesso di una versione moderna di un
107fdf0345eSFederico Vaga   programma in spazio utente verificando che la memoria oltre la dimensione
108fdf0345eSFederico Vaga   della struttura dati attesa sia zero (in pratica verificare che
109fdf0345eSFederico Vaga   ``param_4 == 0``).
110fdf0345eSFederico Vaga - un nuovo kernel può gestire l'accesso di una versione vecchia di un
111fdf0345eSFederico Vaga   programma in spazio utente estendendo la struttura dati con zeri (in pratica
112fdf0345eSFederico Vaga   ``param_4 = 0``).
113fdf0345eSFederico Vaga
114fdf0345eSFederico VagaVedere :manpage:`perf_event_open(2)` e la funzione ``perf_copy_attr()`` (in
115fdf0345eSFederico Vaga``kernel/events/core.c``) per un esempio pratico di questo approccio.
116fdf0345eSFederico Vaga
117fdf0345eSFederico Vaga
118fdf0345eSFederico VagaProgettare l'API: altre considerazioni
119fdf0345eSFederico Vaga--------------------------------------
120fdf0345eSFederico Vaga
121fdf0345eSFederico VagaSe la vostra nuova chiamata di sistema permette allo spazio utente di fare
122fdf0345eSFederico Vagariferimento ad un oggetto del kernel, allora questa dovrebbe usare un
123fdf0345eSFederico Vagadescrittore di file per accesso all'oggetto - non inventatevi nuovi tipi di
124fdf0345eSFederico Vagaaccesso da spazio utente quando il kernel ha già dei meccanismi e una semantica
125fdf0345eSFederico Vagaben definita per utilizzare i descrittori di file.
126fdf0345eSFederico Vaga
127fdf0345eSFederico VagaSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ritorna un nuovo
128fdf0345eSFederico Vagadescrittore di file, allora l'argomento *flags* dovrebbe includere un valore
129fdf0345eSFederico Vagaequivalente a ``O_CLOEXEC`` per i nuovi descrittori.  Questo rende possibile,
130fdf0345eSFederico Vaganello spazio utente, la chiusura della finestra temporale fra le chiamate a
131fdf0345eSFederico Vaga``xyzzy()`` e ``fcntl(fd, F_SETFD, FD_CLOEXEC)``, dove un inaspettato
132fdf0345eSFederico Vaga``fork()`` o ``execve()`` potrebbe trasferire il descrittore al programma
133fdf0345eSFederico Vagaeseguito (Comunque, resistete alla tentazione di riutilizzare il valore di
134fdf0345eSFederico Vaga``O_CLOEXEC`` dato che è specifico dell'architettura e fa parte di una
135fdf0345eSFederico Vagaenumerazione di flag ``O_*`` che è abbastanza ricca).
136fdf0345eSFederico Vaga
137fdf0345eSFederico VagaSe la vostra nuova chiamata di sistema ritorna un nuovo descrittore di file,
138fdf0345eSFederico Vagadovreste considerare che significato avrà l'uso delle chiamate di sistema
139fdf0345eSFederico Vagadella famiglia di :manpage:`poll(2)`. Rendere un descrittore di file pronto
140fdf0345eSFederico Vagaper la lettura o la scrittura è il tipico modo del kernel per notificare lo
141fdf0345eSFederico Vagaspazio utente circa un evento associato all'oggetto del kernel.
142fdf0345eSFederico Vaga
143fdf0345eSFederico VagaSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ha un argomento
144fdf0345eSFederico Vagache è il percorso ad un file::
145fdf0345eSFederico Vaga
146fdf0345eSFederico Vaga    int sys_xyzzy(const char __user *path, ..., unsigned int flags);
147fdf0345eSFederico Vaga
148fdf0345eSFederico Vagadovreste anche considerare se non sia più appropriata una versione
149fdf0345eSFederico Vaga:manpage:`xyzzyat(2)`::
150fdf0345eSFederico Vaga
151fdf0345eSFederico Vaga    int sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags);
152fdf0345eSFederico Vaga
153fdf0345eSFederico VagaQuesto permette più flessibilità su come lo spazio utente specificherà il file
154fdf0345eSFederico Vagain questione; in particolare, permette allo spazio utente di richiedere la
155fdf0345eSFederico Vagafunzionalità su un descrittore di file già aperto utilizzando il *flag*
156fdf0345eSFederico Vaga``AT_EMPTY_PATH``, in pratica otterremmo gratuitamente l'operazione
157fdf0345eSFederico Vaga:manpage:`fxyzzy(3)`::
158fdf0345eSFederico Vaga
159fdf0345eSFederico Vaga - xyzzyat(AT_FDCWD, path, ..., 0) is equivalent to xyzzy(path,...)
160fdf0345eSFederico Vaga - xyzzyat(fd, "", ..., AT_EMPTY_PATH) is equivalent to fxyzzy(fd, ...)
161fdf0345eSFederico Vaga
162fdf0345eSFederico Vaga(Per maggiori dettagli sulla logica delle chiamate \*at(), leggete la pagina
163fdf0345eSFederico Vagaman :manpage:`openat(2)`; per un esempio di AT_EMPTY_PATH, leggere la pagina
164fdf0345eSFederico Vagaman :manpage:`fstatat(2)`).
165fdf0345eSFederico Vaga
166fdf0345eSFederico VagaSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede un parametro
167fdf0345eSFederico Vagaper descrivere uno scostamento all'interno di un file, usate ``loff_t`` come
168fdf0345eSFederico Vagatipo cosicché scostamenti a 64-bit potranno essere supportati anche su
169fdf0345eSFederico Vagaarchitetture a 32-bit.
170fdf0345eSFederico Vaga
171fdf0345eSFederico VagaSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede l'uso di
172fdf0345eSFederico Vagafunzioni riservate, allora dev'essere gestita da un opportuno bit di privilegio
173fdf0345eSFederico Vaga(verificato con una chiamata a ``capable()``), come descritto nella pagina man
174fdf0345eSFederico Vaga:manpage:`capabilities(7)`.  Scegliete un bit di privilegio già esistente per
175fdf0345eSFederico Vagagestire la funzionalità associata, ma evitate la combinazione di diverse
176fdf0345eSFederico Vagafunzionalità vagamente collegate dietro lo stesso bit, in quanto va contro il
177fdf0345eSFederico Vagaprincipio di *capabilities* di separare i poteri di root.  In particolare,
178fdf0345eSFederico Vagaevitate di aggiungere nuovi usi al fin-troppo-generico privilegio
179fdf0345eSFederico Vaga``CAP_SYS_ADMIN``.
180fdf0345eSFederico Vaga
181fdf0345eSFederico VagaSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` manipola altri
182fdf0345eSFederico Vagaprocessi oltre a quello chiamato, allora dovrebbe essere limitata (usando
183fdf0345eSFederico Vagala chiamata ``ptrace_may_access()``) di modo che solo un processo chiamante
184fdf0345eSFederico Vagacon gli stessi permessi del processo in oggetto, o con i necessari privilegi,
185fdf0345eSFederico Vagapossa manipolarlo.
186fdf0345eSFederico Vaga
187fdf0345eSFederico VagaInfine, state attenti che in alcune architetture non-x86 la vita delle chiamate
188fdf0345eSFederico Vagadi sistema con argomenti a 64-bit viene semplificata se questi argomenti
189fdf0345eSFederico Vagaricadono in posizioni dispari (pratica, i parametri 1, 3, 5); questo permette
190fdf0345eSFederico Vagal'uso di coppie contigue di registri a 32-bit.  (Questo non conta se gli
191fdf0345eSFederico Vagaargomenti sono parte di una struttura dati che viene passata per puntatore).
192fdf0345eSFederico Vaga
193fdf0345eSFederico Vaga
194fdf0345eSFederico VagaProporre l'API
195fdf0345eSFederico Vaga--------------
196fdf0345eSFederico Vaga
197fdf0345eSFederico VagaAl fine di rendere le nuove chiamate di sistema di facile revisione, è meglio
198fdf0345eSFederico Vagache dividiate le modifiche i pezzi separati.  Questi dovrebbero includere
199fdf0345eSFederico Vagaalmeno le seguenti voci in *commit* distinti (ognuno dei quali sarà descritto
200fdf0345eSFederico Vagapiù avanti):
201fdf0345eSFederico Vaga
202fdf0345eSFederico Vaga - l'essenza dell'implementazione della chiamata di sistema, con i prototipi,
203fdf0345eSFederico Vaga   i numeri generici, le modifiche al Kconfig e l'implementazione *stub* di
204fdf0345eSFederico Vaga   ripiego.
205fdf0345eSFederico Vaga - preparare la nuova chiamata di sistema per un'architettura specifica,
206fdf0345eSFederico Vaga   solitamente x86 (ovvero tutti: x86_64, x86_32 e x32).
207fdf0345eSFederico Vaga - un programma di auto-verifica da mettere in ``tools/testing/selftests/``
208fdf0345eSFederico Vaga   che mostri l'uso della chiamata di sistema.
209fdf0345eSFederico Vaga - una bozza di pagina man per la nuova chiamata di sistema. Può essere
210fdf0345eSFederico Vaga   scritta nell'email di presentazione, oppure come modifica vera e propria
211fdf0345eSFederico Vaga   al repositorio delle pagine man.
212fdf0345eSFederico Vaga
213fdf0345eSFederico VagaLe proposte di nuove chiamate di sistema, come ogni altro modifica all'API del
214fdf0345eSFederico Vagakernel, deve essere sottomessa alla lista di discussione
215fdf0345eSFederico Vagalinux-api@vger.kernel.org.
216fdf0345eSFederico Vaga
217fdf0345eSFederico Vaga
218fdf0345eSFederico VagaImplementazione di chiamate di sistema generiche
219fdf0345eSFederico Vaga------------------------------------------------
220fdf0345eSFederico Vaga
221fdf0345eSFederico VagaIl principale punto d'accesso alla vostra nuova chiamata di sistema
222fdf0345eSFederico Vaga:manpage:`xyzzy(2)` verrà chiamato ``sys_xyzzy()``; ma, piuttosto che in modo
223fdf0345eSFederico Vagaesplicito, lo aggiungerete tramite la macro ``SYSCALL_DEFINEn``. La 'n'
224fdf0345eSFederico Vagaindica il numero di argomenti della chiamata di sistema; la macro ha come
225fdf0345eSFederico Vagaargomento il nome della chiamata di sistema, seguito dalle coppie (tipo, nome)
226fdf0345eSFederico Vagaper definire i suoi parametri.  L'uso di questa macro permette di avere
227fdf0345eSFederico Vagai metadati della nuova chiamata di sistema disponibili anche per altri
228fdf0345eSFederico Vagastrumenti.
229fdf0345eSFederico Vaga
230fdf0345eSFederico VagaIl nuovo punto d'accesso necessita anche del suo prototipo di funzione in
231fdf0345eSFederico Vaga``include/linux/syscalls.h``, marcato come asmlinkage di modo da abbinargli
232fdf0345eSFederico Vagail modo in cui quelle chiamate di sistema verranno invocate::
233fdf0345eSFederico Vaga
234fdf0345eSFederico Vaga    asmlinkage long sys_xyzzy(...);
235fdf0345eSFederico Vaga
236fdf0345eSFederico VagaAlcune architetture (per esempio x86) hanno le loro specifiche tabelle di
237fdf0345eSFederico Vagachiamate di sistema (syscall), ma molte altre architetture condividono una
238fdf0345eSFederico Vagatabella comune di syscall. Aggiungete alla lista generica la vostra nuova
239fdf0345eSFederico Vagachiamata di sistema aggiungendo un nuovo elemento alla lista in
240fdf0345eSFederico Vaga``include/uapi/asm-generic/unistd.h``::
241fdf0345eSFederico Vaga
242fdf0345eSFederico Vaga    #define __NR_xyzzy 292
243fdf0345eSFederico Vaga    __SYSCALL(__NR_xyzzy, sys_xyzzy)
244fdf0345eSFederico Vaga
245fdf0345eSFederico VagaAggiornate anche il contatore __NR_syscalls di modo che sia coerente con
246fdf0345eSFederico Vagal'aggiunta della nuove chiamate di sistema; va notato che se più di una nuova
247fdf0345eSFederico Vagachiamata di sistema viene aggiunga nella stessa finestra di sviluppo, il numero
248fdf0345eSFederico Vagadella vostra nuova syscall potrebbe essere aggiustato al fine di risolvere i
249fdf0345eSFederico Vagaconflitti.
250fdf0345eSFederico Vaga
251fdf0345eSFederico VagaIl file ``kernel/sys_ni.c`` fornisce le implementazioni *stub* di ripiego che
252fdf0345eSFederico Vagaritornano ``-ENOSYS``.  Aggiungete la vostra nuova chiamata di sistema anche
253fdf0345eSFederico Vagaqui::
254fdf0345eSFederico Vaga
255fdf0345eSFederico Vaga    COND_SYSCALL(xyzzy);
256fdf0345eSFederico Vaga
257fdf0345eSFederico VagaLa vostra nuova funzionalità del kernel, e la chiamata di sistema che la
258fdf0345eSFederico Vagacontrolla, dovrebbero essere opzionali. Quindi, aggiungete un'opzione
259fdf0345eSFederico Vaga``CONFIG`` (solitamente in ``init/Kconfig``).  Come al solito per le nuove
260fdf0345eSFederico Vagaopzioni ``CONFIG``:
261fdf0345eSFederico Vaga
262fdf0345eSFederico Vaga - Includete una descrizione della nuova funzionalità e della chiamata di
263fdf0345eSFederico Vaga   sistema che la controlla.
264fdf0345eSFederico Vaga - Rendete l'opzione dipendente da EXPERT se dev'essere nascosta agli utenti
265fdf0345eSFederico Vaga   normali.
266fdf0345eSFederico Vaga - Nel Makefile, rendere tutti i nuovi file sorgenti, che implementano la
267fdf0345eSFederico Vaga   nuova funzionalità, dipendenti dall'opzione CONFIG (per esempio
268fdf0345eSFederico Vaga   ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``).
269fdf0345eSFederico Vaga - Controllate due volte che sia possibile generare il kernel con la nuova
270fdf0345eSFederico Vaga   opzione CONFIG disabilitata.
271fdf0345eSFederico Vaga
272fdf0345eSFederico VagaPer riassumere, vi serve un *commit* che includa:
273fdf0345eSFederico Vaga
274fdf0345eSFederico Vaga - un'opzione ``CONFIG``per la nuova funzione, normalmente in ``init/Kconfig``
275fdf0345eSFederico Vaga - ``SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso
276fdf0345eSFederico Vaga - il corrispondente prototipo in ``include/linux/syscalls.h``
277fdf0345eSFederico Vaga - un elemento nella tabella generica in ``include/uapi/asm-generic/unistd.h``
278fdf0345eSFederico Vaga - *stub* di ripiego in ``kernel/sys_ni.c``
279fdf0345eSFederico Vaga
280fdf0345eSFederico Vaga
281fdf0345eSFederico VagaImplementazione delle chiamate di sistema x86
282fdf0345eSFederico Vaga---------------------------------------------
283fdf0345eSFederico Vaga
284fdf0345eSFederico VagaPer collegare la vostra nuova chiamate di sistema alle piattaforme x86,
285fdf0345eSFederico Vagadovete aggiornate la tabella principale di syscall.  Assumendo che la vostra
286fdf0345eSFederico Vaganuova chiamata di sistema non sia particolarmente speciale (vedere sotto),
287fdf0345eSFederico Vagadovete aggiungere un elemento *common* (per x86_64 e x32) in
288fdf0345eSFederico Vagaarch/x86/entry/syscalls/syscall_64.tbl::
289fdf0345eSFederico Vaga
290fdf0345eSFederico Vaga    333   common   xyzzy     sys_xyzzy
291fdf0345eSFederico Vaga
292fdf0345eSFederico Vagae un elemento per *i386* ``arch/x86/entry/syscalls/syscall_32.tbl``::
293fdf0345eSFederico Vaga
294fdf0345eSFederico Vaga    380   i386     xyzzy     sys_xyzzy
295fdf0345eSFederico Vaga
296fdf0345eSFederico VagaAncora una volta, questi numeri potrebbero essere cambiati se generano
297fdf0345eSFederico Vagaconflitti durante la finestra di integrazione.
298fdf0345eSFederico Vaga
299fdf0345eSFederico Vaga
300fdf0345eSFederico VagaChiamate di sistema compatibili (generico)
301fdf0345eSFederico Vaga------------------------------------------
302fdf0345eSFederico Vaga
303fdf0345eSFederico VagaPer molte chiamate di sistema, la stessa implementazione a 64-bit può essere
304fdf0345eSFederico Vagainvocata anche quando il programma in spazio utente è a 32-bit; anche se la
305fdf0345eSFederico Vagachiamata di sistema include esplicitamente un puntatore, questo viene gestito
306fdf0345eSFederico Vagain modo trasparente.
307fdf0345eSFederico Vaga
308fdf0345eSFederico VagaTuttavia, ci sono un paio di situazione dove diventa necessario avere un
309fdf0345eSFederico Vagalivello di gestione della compatibilità per risolvere le differenze di
310fdf0345eSFederico Vagadimensioni fra 32-bit e 64-bit.
311fdf0345eSFederico Vaga
312fdf0345eSFederico VagaIl primo caso è quando un kernel a 64-bit supporta anche programmi in spazio
313fdf0345eSFederico Vagautente a 32-bit, perciò dovrà ispezionare aree della memoria (``__user``) che
314fdf0345eSFederico Vagapotrebbero contenere valori a 32-bit o a 64-bit.  In particolar modo, questo
315fdf0345eSFederico Vagaè necessario quando un argomento di una chiamata di sistema è:
316fdf0345eSFederico Vaga
317fdf0345eSFederico Vaga - un puntatore ad un puntatore
318fdf0345eSFederico Vaga - un puntatore ad una struttura dati contenente a sua volta un puntatore
319fdf0345eSFederico Vaga   ( ad esempio ``struct iovec __user *``)
320fdf0345eSFederico Vaga - un puntatore ad un tipo intero di dimensione variabile (``time_t``,
321fdf0345eSFederico Vaga   ``off_t``, ``long``, ...)
322fdf0345eSFederico Vaga - un puntatore ad una struttura dati contenente un tipo intero di dimensione
323fdf0345eSFederico Vaga   variabile.
324fdf0345eSFederico Vaga
325fdf0345eSFederico VagaIl secondo caso che richiede un livello di gestione della compatibilità è
326fdf0345eSFederico Vagaquando uno degli argomenti di una chiamata a sistema è esplicitamente un tipo
327fdf0345eSFederico Vagaa 64-bit anche su architetture a 32-bit, per esempio ``loff_t`` o ``__u64``.
328fdf0345eSFederico VagaIn questo caso, un valore che arriva ad un kernel a 64-bit da un'applicazione
329fdf0345eSFederico Vagaa 32-bit verrà diviso in due valori a 32-bit che dovranno essere riassemblati
330fdf0345eSFederico Vagain questo livello di compatibilità.
331fdf0345eSFederico Vaga
332fdf0345eSFederico Vaga(Da notare che non serve questo livello di compatibilità per argomenti che
333fdf0345eSFederico Vagasono puntatori ad un tipo esplicitamente a 64-bit; per esempio, in
334fdf0345eSFederico Vaga:manpage:`splice(2)` l'argomento di tipo ``loff_t __user *`` non necessita
335fdf0345eSFederico Vagadi una chiamata di sistema ``compat_``)
336fdf0345eSFederico Vaga
337fdf0345eSFederico VagaLa versione compatibile della nostra chiamata di sistema si chiamerà
338fdf0345eSFederico Vaga``compat_sys_xyzzy()``, e viene aggiunta utilizzando la macro
339fdf0345eSFederico Vaga``COMPAT_SYSCALL_DEFINEn()`` (simile a SYSCALL_DEFINEn).  Questa versione
340fdf0345eSFederico Vagadell'implementazione è parte del kernel a 64-bit ma accetta parametri a 32-bit
341fdf0345eSFederico Vagache trasformerà secondo le necessità (tipicamente, la versione
342fdf0345eSFederico Vaga``compat_sys_`` converte questi valori nello loro corrispondente a 64-bit e
343fdf0345eSFederico Vagapuò chiamare la versione ``sys_`` oppure invocare una funzione che implementa
344fdf0345eSFederico Vagale parti comuni).
345fdf0345eSFederico Vaga
346fdf0345eSFederico VagaIl punto d'accesso *compat* deve avere il corrispondente prototipo di funzione
347fdf0345eSFederico Vagain ``include/linux/compat.h``, marcato come asmlinkage di modo da abbinargli
348fdf0345eSFederico Vagail modo in cui quelle chiamate di sistema verranno invocate::
349fdf0345eSFederico Vaga
350fdf0345eSFederico Vaga    asmlinkage long compat_sys_xyzzy(...);
351fdf0345eSFederico Vaga
352fdf0345eSFederico VagaSe la chiamata di sistema prevede una struttura dati organizzata in modo
353fdf0345eSFederico Vagadiverso per sistemi a 32-bit e per quelli a 64-bit, diciamo
354fdf0345eSFederico Vaga``struct xyzzy_args``, allora il file d'intestazione
355fdf0345eSFederico Vaga``then the include/linux/compat.h`` deve includere la sua versione
356fdf0345eSFederico Vaga*compatibile* (``struct compat_xyzzy_args``); ogni variabile con
357fdf0345eSFederico Vagadimensione variabile deve avere il proprio tipo ``compat_`` corrispondente
358fdf0345eSFederico Vagaa quello in ``struct xyzzy_args``.  La funzione ``compat_sys_xyzzy()``
359fdf0345eSFederico Vagapuò usare la struttura ``compat_`` per analizzare gli argomenti ricevuti
360fdf0345eSFederico Vagada una chiamata a 32-bit.
361fdf0345eSFederico Vaga
362fdf0345eSFederico VagaPer esempio, se avete i seguenti campi::
363fdf0345eSFederico Vaga
364fdf0345eSFederico Vaga    struct xyzzy_args {
365fdf0345eSFederico Vaga        const char __user *ptr;
366fdf0345eSFederico Vaga        __kernel_long_t varying_val;
367fdf0345eSFederico Vaga        u64 fixed_val;
368fdf0345eSFederico Vaga        /* ... */
369fdf0345eSFederico Vaga    };
370fdf0345eSFederico Vaga
371fdf0345eSFederico Vaganella struttura ``struct xyzzy_args``, allora la struttura
372fdf0345eSFederico Vaga``struct compat_xyzzy_args`` dovrebbe avere::
373fdf0345eSFederico Vaga
374fdf0345eSFederico Vaga    struct compat_xyzzy_args {
375fdf0345eSFederico Vaga        compat_uptr_t ptr;
376fdf0345eSFederico Vaga        compat_long_t varying_val;
377fdf0345eSFederico Vaga        u64 fixed_val;
378fdf0345eSFederico Vaga        /* ... */
379fdf0345eSFederico Vaga    };
380fdf0345eSFederico Vaga
381fdf0345eSFederico VagaLa lista generica delle chiamate di sistema ha bisogno di essere
382fdf0345eSFederico Vagaaggiustata al fine di permettere l'uso della versione *compatibile*;
383fdf0345eSFederico Vagala voce in ``include/uapi/asm-generic/unistd.h`` dovrebbero usare
384fdf0345eSFederico Vaga``__SC_COMP`` piuttosto di ``__SYSCALL``::
385fdf0345eSFederico Vaga
386fdf0345eSFederico Vaga    #define __NR_xyzzy 292
387fdf0345eSFederico Vaga    __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy)
388fdf0345eSFederico Vaga
389fdf0345eSFederico VagaRiassumendo, vi serve:
390fdf0345eSFederico Vaga
391fdf0345eSFederico Vaga - un ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso
392fdf0345eSFederico Vaga   *compatibile*
393fdf0345eSFederico Vaga - un prototipo in ``include/linux/compat.h``
394fdf0345eSFederico Vaga - (se necessario) una struttura di compatibilità a 32-bit in
395fdf0345eSFederico Vaga   ``include/linux/compat.h``
396fdf0345eSFederico Vaga - una voce ``__SC_COMP``, e non ``__SYSCALL``, in
397fdf0345eSFederico Vaga   ``include/uapi/asm-generic/unistd.h``
398fdf0345eSFederico Vaga
399fdf0345eSFederico VagaCompatibilità delle chiamate di sistema (x86)
400fdf0345eSFederico Vaga---------------------------------------------
401fdf0345eSFederico Vaga
402fdf0345eSFederico VagaPer collegare una chiamata di sistema, su un'architettura x86, con la sua
403fdf0345eSFederico Vagaversione *compatibile*, è necessario aggiustare la voce nella tabella
404fdf0345eSFederico Vagadelle syscall.
405fdf0345eSFederico Vaga
406fdf0345eSFederico VagaPer prima cosa, la voce in ``arch/x86/entry/syscalls/syscall_32.tbl`` prende
407fdf0345eSFederico Vagaun argomento aggiuntivo per indicare che un programma in spazio utente
408fdf0345eSFederico Vagaa 32-bit, eseguito su un kernel a 64-bit, dovrebbe accedere tramite il punto
409fdf0345eSFederico Vagad'accesso compatibile::
410fdf0345eSFederico Vaga
411fdf0345eSFederico Vaga    380   i386     xyzzy     sys_xyzzy    __ia32_compat_sys_xyzzy
412fdf0345eSFederico Vaga
413fdf0345eSFederico VagaSecondo, dovete capire cosa dovrebbe succedere alla nuova chiamata di sistema
414fdf0345eSFederico Vagaper la versione dell'ABI x32.  Qui C'è una scelta da fare: gli argomenti
415fdf0345eSFederico Vagapossono corrisponde alla versione a 64-bit o a quella a 32-bit.
416fdf0345eSFederico Vaga
417fdf0345eSFederico VagaSe c'è un puntatore ad un puntatore, la decisione è semplice: x32 è ILP32,
418fdf0345eSFederico Vagaquindi gli argomenti dovrebbero corrispondere a quelli a 32-bit, e la voce in
419fdf0345eSFederico Vaga``arch/x86/entry/syscalls/syscall_64.tbl`` sarà divisa cosicché i programmi
420fdf0345eSFederico Vagax32 eseguano la chiamata *compatibile*::
421fdf0345eSFederico Vaga
422fdf0345eSFederico Vaga    333   64       xyzzy     sys_xyzzy
423fdf0345eSFederico Vaga    ...
424fdf0345eSFederico Vaga    555   x32      xyzzy     __x32_compat_sys_xyzzy
425fdf0345eSFederico Vaga
426fdf0345eSFederico VagaSe non ci sono puntatori, allora è preferibile riutilizzare la chiamata di
427fdf0345eSFederico Vagasistema a 64-bit per l'ABI x32 (e di conseguenza la voce in
428fdf0345eSFederico Vagaarch/x86/entry/syscalls/syscall_64.tbl rimane immutata).
429fdf0345eSFederico Vaga
430fdf0345eSFederico VagaIn ambo i casi, dovreste verificare che i tipi usati dagli argomenti
431fdf0345eSFederico Vagaabbiano un'esatta corrispondenza da x32 (-mx32) al loro equivalente a
432fdf0345eSFederico Vaga32-bit (-m32) o 64-bit (-m64).
433fdf0345eSFederico Vaga
434fdf0345eSFederico Vaga
435fdf0345eSFederico VagaChiamate di sistema che ritornano altrove
436fdf0345eSFederico Vaga-----------------------------------------
437fdf0345eSFederico Vaga
438fdf0345eSFederico VagaNella maggior parte delle chiamate di sistema, al termine della loro
439fdf0345eSFederico Vagaesecuzione, i programmi in spazio utente riprendono esattamente dal punto
440fdf0345eSFederico Vagain cui si erano interrotti -- quindi dall'istruzione successiva, con lo
441fdf0345eSFederico Vagastesso *stack* e con la maggior parte del registri com'erano stati
442fdf0345eSFederico Vagalasciati prima della chiamata di sistema, e anche con la stessa memoria
443fdf0345eSFederico Vagavirtuale.
444fdf0345eSFederico Vaga
445fdf0345eSFederico VagaTuttavia, alcune chiamata di sistema fanno le cose in modo differente.
446fdf0345eSFederico VagaPotrebbero ritornare ad un punto diverso (``rt_sigreturn``) o cambiare
447fdf0345eSFederico Vagala memoria in spazio utente (``fork``/``vfork``/``clone``) o perfino
448fdf0345eSFederico Vagal'architettura del programma (``execve``/``execveat``).
449fdf0345eSFederico Vaga
450fdf0345eSFederico VagaPer permettere tutto ciò, l'implementazione nel kernel di questo tipo di
451fdf0345eSFederico Vagachiamate di sistema potrebbero dover salvare e ripristinare registri
452fdf0345eSFederico Vagaaggiuntivi nello *stack* del kernel, permettendo così un controllo completo
453fdf0345eSFederico Vagasu dove e come l'esecuzione dovrà continuare dopo l'esecuzione della
454fdf0345eSFederico Vagachiamata di sistema.
455fdf0345eSFederico Vaga
456fdf0345eSFederico VagaQueste saranno specifiche per ogni architettura, ma tipicamente si definiscono
457fdf0345eSFederico Vagadei punti d'accesso in *assembly* per salvare/ripristinare i registri
458fdf0345eSFederico Vagaaggiuntivi e quindi chiamare il vero punto d'accesso per la chiamata di
459fdf0345eSFederico Vagasistema.
460fdf0345eSFederico Vaga
461fdf0345eSFederico VagaPer l'architettura x86_64, questo è implementato come un punto d'accesso
462fdf0345eSFederico Vaga``stub_xyzzy`` in ``arch/x86/entry/entry_64.S``, e la voce nella tabella
463fdf0345eSFederico Vagadi syscall (``arch/x86/entry/syscalls/syscall_64.tbl``) verrà corretta di
464fdf0345eSFederico Vagaconseguenza::
465fdf0345eSFederico Vaga
466fdf0345eSFederico Vaga    333   common   xyzzy     stub_xyzzy
467fdf0345eSFederico Vaga
468fdf0345eSFederico VagaL'equivalente per programmi a 32-bit eseguiti su un kernel a 64-bit viene
469fdf0345eSFederico Vaganormalmente chiamato ``stub32_xyzzy`` e implementato in
470fdf0345eSFederico Vaga``arch/x86/entry/entry_64_compat.S`` con la corrispondente voce nella tabella
471fdf0345eSFederico Vagadi syscall ``arch/x86/entry/syscalls/syscall_32.tbl`` corretta nel
472fdf0345eSFederico Vagaseguente modo::
473fdf0345eSFederico Vaga
474fdf0345eSFederico Vaga    380   i386     xyzzy     sys_xyzzy    stub32_xyzzy
475fdf0345eSFederico Vaga
476fdf0345eSFederico VagaSe una chiamata di sistema necessita di un livello di compatibilità (come
477fdf0345eSFederico Vaganella sezione precedente), allora la versione ``stub32_`` deve invocare
478fdf0345eSFederico Vagala versione ``compat_sys_`` piuttosto che quella nativa a 64-bit.  In aggiunta,
479fdf0345eSFederico Vagase l'implementazione dell'ABI x32 è diversa da quella x86_64, allora la sua
480fdf0345eSFederico Vagavoce nella tabella di syscall dovrà chiamare uno *stub* che invoca la versione
481fdf0345eSFederico Vaga``compat_sys_``,
482fdf0345eSFederico Vaga
483fdf0345eSFederico VagaPer completezza, sarebbe carino impostare una mappatura cosicché
484fdf0345eSFederico Vaga*user-mode* Linux (UML) continui a funzionare -- la sua tabella di syscall
485fdf0345eSFederico Vagafarà riferimento a stub_xyzzy, ma UML non include l'implementazione
486fdf0345eSFederico Vagain ``arch/x86/entry/entry_64.S`` (perché UML simula i registri eccetera).
487fdf0345eSFederico VagaCorreggerlo è semplice, basta aggiungere una #define in
488fdf0345eSFederico Vaga``arch/x86/um/sys_call_table_64.c``::
489fdf0345eSFederico Vaga
490fdf0345eSFederico Vaga    #define stub_xyzzy sys_xyzzy
491fdf0345eSFederico Vaga
492fdf0345eSFederico Vaga
493fdf0345eSFederico VagaAltri dettagli
494fdf0345eSFederico Vaga--------------
495fdf0345eSFederico Vaga
496fdf0345eSFederico VagaLa maggior parte dei kernel tratta le chiamate di sistema allo stesso modo,
497fdf0345eSFederico Vagama possono esserci rare eccezioni per le quali potrebbe essere necessario
498fdf0345eSFederico Vagal'aggiornamento della vostra chiamata di sistema.
499fdf0345eSFederico Vaga
500fdf0345eSFederico VagaIl sotto-sistema di controllo (*audit subsystem*) è uno di questi casi
501fdf0345eSFederico Vagaspeciali; esso include (per architettura) funzioni che classificano alcuni
502fdf0345eSFederico Vagatipi di chiamate di sistema -- in particolare apertura dei file
503fdf0345eSFederico Vaga(``open``/``openat``), esecuzione dei programmi (``execve``/``exeveat``)
504fdf0345eSFederico Vagaoppure multiplatori di socket (``socketcall``). Se la vostra nuova chiamata
505fdf0345eSFederico Vagadi sistema è simile ad una di queste, allora il sistema di controllo dovrebbe
506fdf0345eSFederico Vagaessere aggiornato.
507fdf0345eSFederico Vaga
508fdf0345eSFederico VagaPiù in generale, se esiste una chiamata di sistema che è simile alla vostra,
509fdf0345eSFederico Vagavale la pena fare una ricerca con ``grep`` su tutto il kernel per la chiamata
510fdf0345eSFederico Vagadi sistema esistente per verificare che non ci siano altri casi speciali.
511fdf0345eSFederico Vaga
512fdf0345eSFederico Vaga
513fdf0345eSFederico VagaVerifica
514fdf0345eSFederico Vaga--------
515fdf0345eSFederico Vaga
516fdf0345eSFederico VagaUna nuova chiamata di sistema dev'essere, ovviamente, provata; è utile fornire
517fdf0345eSFederico Vagaai revisori un programma in spazio utente che mostri l'uso della chiamata di
518fdf0345eSFederico Vagasistema.  Un buon modo per combinare queste cose è quello di aggiungere un
519fdf0345eSFederico Vagasemplice programma di auto-verifica in una nuova cartella in
520fdf0345eSFederico Vaga``tools/testing/selftests/``.
521fdf0345eSFederico Vaga
522fdf0345eSFederico VagaPer una nuova chiamata di sistema, ovviamente, non ci sarà alcuna funzione
523fdf0345eSFederico Vagain libc e quindi il programma di verifica dovrà invocarla usando ``syscall()``;
524fdf0345eSFederico Vagainoltre, se la nuova chiamata di sistema prevede un nuova struttura dati
525fdf0345eSFederico Vagavisibile in spazio utente, il file d'intestazione necessario dev'essere
526fdf0345eSFederico Vagainstallato al fine di compilare il programma.
527fdf0345eSFederico Vaga
528fdf0345eSFederico VagaAssicuratevi che il programma di auto-verifica possa essere eseguito
529fdf0345eSFederico Vagacorrettamente su tutte le architetture supportate.  Per esempio, verificate che
530fdf0345eSFederico Vagafunzioni quando viene compilato per x86_64 (-m64), x86_32 (-m32) e x32 (-mx32).
531fdf0345eSFederico Vaga
532fdf0345eSFederico VagaAl fine di una più meticolosa ed estesa verifica della nuova funzionalità,
533fdf0345eSFederico Vagadovreste considerare l'aggiunta di nuove verifica al progetto 'Linux Test',
534fdf0345eSFederico Vagaoppure al progetto xfstests per cambiamenti relativi al filesystem.
535fdf0345eSFederico Vaga
536fdf0345eSFederico Vaga - https://linux-test-project.github.io/
537fdf0345eSFederico Vaga - git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git
538fdf0345eSFederico Vaga
539fdf0345eSFederico Vaga
540fdf0345eSFederico VagaPagine man
541fdf0345eSFederico Vaga----------
542fdf0345eSFederico Vaga
543fdf0345eSFederico VagaTutte le nuove chiamate di sistema dovrebbero avere una pagina man completa,
544fdf0345eSFederico Vagaidealmente usando i marcatori groff, ma anche il puro testo può andare.  Se
545fdf0345eSFederico Vagastate usando groff, è utile che includiate nella email di presentazione una
546fdf0345eSFederico Vagaversione già convertita in formato ASCII: semplificherà la vita dei revisori.
547fdf0345eSFederico Vaga
548fdf0345eSFederico VagaLe pagine man dovrebbero essere in copia-conoscenza verso
549fdf0345eSFederico Vagalinux-man@vger.kernel.org
550fdf0345eSFederico VagaPer maggiori dettagli, leggere
551fdf0345eSFederico Vagahttps://www.kernel.org/doc/man-pages/patches.html
552fdf0345eSFederico Vaga
553fdf0345eSFederico Vaga
554fdf0345eSFederico VagaNon invocate chiamate di sistema dal kernel
555fdf0345eSFederico Vaga-------------------------------------------
556fdf0345eSFederico Vaga
557fdf0345eSFederico VagaLe chiamate di sistema sono, come già detto prima, punti di interazione fra
558fdf0345eSFederico Vagalo spazio utente e il kernel.  Perciò, le chiamate di sistema come
559fdf0345eSFederico Vaga``sys_xyzzy()`` o ``compat_sys_xyzzy()`` dovrebbero essere chiamate solo dallo
560fdf0345eSFederico Vagaspazio utente attraverso la tabella syscall, ma non da nessun altro punto nel
561fdf0345eSFederico Vagakernel.  Se la nuova funzionalità è utile all'interno del kernel, per esempio
562fdf0345eSFederico Vagadev'essere condivisa fra una vecchia e una nuova chiamata di sistema o
563fdf0345eSFederico Vagadev'essere utilizzata da una chiamata di sistema e la sua variante compatibile,
564fdf0345eSFederico Vagaallora dev'essere implementata come una funzione di supporto
565*511aaf2bSFederico Vaga(*helper function*) (per esempio ``ksys_xyzzy()``).  Questa funzione potrà
566fdf0345eSFederico Vagaessere chiamata dallo *stub* (``sys_xyzzy()``), dalla variante compatibile
567fdf0345eSFederico Vaga(``compat_sys_xyzzy()``), e/o da altri parti del kernel.
568fdf0345eSFederico Vaga
569fdf0345eSFederico VagaSui sistemi x86 a 64-bit, a partire dalla versione v4.17 è un requisito
570fdf0345eSFederico Vagafondamentale quello di non invocare chiamate di sistema all'interno del kernel.
571fdf0345eSFederico VagaEsso usa una diversa convenzione per l'invocazione di chiamate di sistema dove
572fdf0345eSFederico Vaga``struct pt_regs`` viene decodificata al volo in una funzione che racchiude
573fdf0345eSFederico Vagala chiamata di sistema la quale verrà eseguita successivamente.
574fdf0345eSFederico VagaQuesto significa che verranno passati solo i parametri che sono davvero
575fdf0345eSFederico Vaganecessari ad una specifica chiamata di sistema, invece che riempire ogni volta
576fdf0345eSFederico Vaga6 registri del processore con contenuti presi dallo spazio utente (potrebbe
577fdf0345eSFederico Vagacausare seri problemi nella sequenza di chiamate).
578fdf0345eSFederico Vaga
579fdf0345eSFederico VagaInoltre, le regole su come i dati possano essere usati potrebbero differire
580fdf0345eSFederico Vagafra il kernel e l'utente.  Questo è un altro motivo per cui invocare
581fdf0345eSFederico Vaga``sys_xyzzy()`` è generalmente una brutta idea.
582fdf0345eSFederico Vaga
583fdf0345eSFederico VagaEccezioni a questa regola vengono accettate solo per funzioni d'architetture
584fdf0345eSFederico Vagache surclassano quelle generiche, per funzioni d'architettura di compatibilità,
585fdf0345eSFederico Vagao per altro codice in arch/
586fdf0345eSFederico Vaga
587fdf0345eSFederico Vaga
588fdf0345eSFederico VagaRiferimenti e fonti
589fdf0345eSFederico Vaga-------------------
590fdf0345eSFederico Vaga
591fdf0345eSFederico Vaga - Articolo di Michael Kerris su LWN sull'uso dell'argomento flags nelle
592fdf0345eSFederico Vaga   chiamate di sistema: https://lwn.net/Articles/585415/
593fdf0345eSFederico Vaga - Articolo di Michael Kerris su LWN su come gestire flag sconosciuti in
594fdf0345eSFederico Vaga   una chiamata di sistema: https://lwn.net/Articles/588444/
595fdf0345eSFederico Vaga - Articolo di Jake Edge su LWN che descrive i limiti degli argomenti a 64-bit
596fdf0345eSFederico Vaga   delle chiamate di sistema: https://lwn.net/Articles/311630/
597fdf0345eSFederico Vaga - Una coppia di articoli di David Drysdale che descrivono i dettagli del
598fdf0345eSFederico Vaga   percorso implementativo di una chiamata di sistema per la versione v3.14:
599fdf0345eSFederico Vaga
600fdf0345eSFederico Vaga    - https://lwn.net/Articles/604287/
601fdf0345eSFederico Vaga    - https://lwn.net/Articles/604515/
602fdf0345eSFederico Vaga
603fdf0345eSFederico Vaga - Requisiti specifici alle architetture sono discussi nella pagina man
604fdf0345eSFederico Vaga   :manpage:`syscall(2)` :
605fdf0345eSFederico Vaga   http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES
606fdf0345eSFederico Vaga - Collezione di email di Linux Torvalds sui problemi relativi a ``ioctl()``:
607fdf0345eSFederico Vaga   http://yarchive.net/comp/linux/ioctl.html
608fdf0345eSFederico Vaga - "Come non inventare interfacce del kernel", Arnd Bergmann,
609fdf0345eSFederico Vaga   http://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf
610fdf0345eSFederico Vaga - Articolo di Michael Kerris su LWN sull'evitare nuovi usi di CAP_SYS_ADMIN:
611fdf0345eSFederico Vaga   https://lwn.net/Articles/486306/
612fdf0345eSFederico Vaga - Raccomandazioni da Andrew Morton circa il fatto che tutte le informazioni
613fdf0345eSFederico Vaga   su una nuova chiamata di sistema dovrebbero essere contenute nello stesso
61405a5f51cSJoe Perches   filone di discussione di email: https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org
615fdf0345eSFederico Vaga - Raccomandazioni da Michael Kerrisk circa il fatto che le nuove chiamate di
61605a5f51cSJoe Perches   sistema dovrebbero avere una pagina man: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com
617fdf0345eSFederico Vaga - Consigli da Thomas Gleixner sul fatto che il collegamento all'architettura
618fdf0345eSFederico Vaga   x86 dovrebbe avvenire in un *commit* differente:
61905a5f51cSJoe Perches   https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos
620fdf0345eSFederico Vaga - Consigli da Greg Kroah-Hartman circa la bontà d'avere una pagina man e un
621fdf0345eSFederico Vaga   programma di auto-verifica per le nuove chiamate di sistema:
62205a5f51cSJoe Perches   https://lore.kernel.org/r/20140320025530.GA25469@kroah.com
623fdf0345eSFederico Vaga - Discussione di Michael Kerrisk sulle nuove chiamate di sistema contro
62405a5f51cSJoe Perches   le estensioni :manpage:`prctl(2)`: https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com
625fdf0345eSFederico Vaga - Consigli da Ingo Molnar che le chiamate di sistema con più argomenti
626fdf0345eSFederico Vaga   dovrebbero incapsularli in una struttura che includa un argomento
627fdf0345eSFederico Vaga   *size* per garantire l'estensibilità futura:
62805a5f51cSJoe Perches   https://lore.kernel.org/r/20150730083831.GA22182@gmail.com
629fdf0345eSFederico Vaga - Un certo numero di casi strani emersi dall'uso (riuso) dei flag O_*:
630fdf0345eSFederico Vaga
631fdf0345eSFederico Vaga    - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness
632fdf0345eSFederico Vaga      check")
633fdf0345eSFederico Vaga    - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc
634fdf0345eSFederico Vaga      conflict")
635fdf0345eSFederico Vaga    - commit bb458c644a59 ("Safer ABI for O_TMPFILE")
636fdf0345eSFederico Vaga
637fdf0345eSFederico Vaga - Discussion from Matthew Wilcox about restrictions on 64-bit arguments:
63805a5f51cSJoe Perches   https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org
639fdf0345eSFederico Vaga - Raccomandazioni da Greg Kroah-Hartman sul fatto che i flag sconosciuti dovrebbero
64005a5f51cSJoe Perches   essere controllati: https://lore.kernel.org/r/20140717193330.GB4703@kroah.com
641fdf0345eSFederico Vaga - Raccomandazioni da Linus Torvalds che le chiamate di sistema x32 dovrebbero
642fdf0345eSFederico Vaga   favorire la compatibilità con le versioni a 64-bit piuttosto che quelle a 32-bit:
64305a5f51cSJoe Perches   https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.com
644