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