18c2ecf20Sopenharmony_ci.. include:: ../disclaimer-ita.rst
28c2ecf20Sopenharmony_ci
38c2ecf20Sopenharmony_ci:Original: :ref:`Documentation/process/adding-syscalls.rst <addsyscalls>`
48c2ecf20Sopenharmony_ci:Translator: Federico Vaga <federico.vaga@vaga.pv.it>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci.. _it_addsyscalls:
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ciAggiungere una nuova chiamata di sistema
98c2ecf20Sopenharmony_ci========================================
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ciQuesto documento descrive quello che è necessario sapere per aggiungere
128c2ecf20Sopenharmony_cinuove chiamate di sistema al kernel Linux; questo è da considerarsi come
138c2ecf20Sopenharmony_ciun'aggiunta ai soliti consigli su come proporre nuove modifiche
148c2ecf20Sopenharmony_ci:ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`.
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ciAlternative alle chiamate di sistema
188c2ecf20Sopenharmony_ci------------------------------------
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ciLa prima considerazione da fare quando si aggiunge una nuova chiamata di
218c2ecf20Sopenharmony_cisistema è quella di valutare le alternative.  Nonostante le chiamate di sistema
228c2ecf20Sopenharmony_cisiano il punto di interazione fra spazio utente e kernel più tradizionale ed
238c2ecf20Sopenharmony_ciovvio, esistono altre possibilità - scegliete quella che meglio si adatta alle
248c2ecf20Sopenharmony_civostra interfaccia.
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci - Se le operazioni coinvolte possono rassomigliare a quelle di un filesystem,
278c2ecf20Sopenharmony_ci   allora potrebbe avere molto più senso la creazione di un nuovo filesystem o
288c2ecf20Sopenharmony_ci   dispositivo.  Inoltre, questo rende più facile incapsulare la nuova
298c2ecf20Sopenharmony_ci   funzionalità in un modulo kernel piuttosto che essere sviluppata nel cuore
308c2ecf20Sopenharmony_ci   del kernel.
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci     - Se la nuova funzionalità prevede operazioni dove il kernel notifica
338c2ecf20Sopenharmony_ci       lo spazio utente su un avvenimento, allora restituire un descrittore
348c2ecf20Sopenharmony_ci       di file all'oggetto corrispondente permette allo spazio utente di
358c2ecf20Sopenharmony_ci       utilizzare ``poll``/``select``/``epoll`` per ricevere quelle notifiche.
368c2ecf20Sopenharmony_ci     - Tuttavia, le operazioni che non si sposano bene con operazioni tipo
378c2ecf20Sopenharmony_ci       :manpage:`read(2)`/:manpage:`write(2)` dovrebbero essere implementate
388c2ecf20Sopenharmony_ci       come chiamate :manpage:`ioctl(2)`, il che potrebbe portare ad un'API in
398c2ecf20Sopenharmony_ci       un qualche modo opaca.
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci - Se dovete esporre solo delle informazioni sul sistema, un nuovo nodo in
428c2ecf20Sopenharmony_ci   sysfs (vedere ``Documentation/filesystems/sysfs.rst``) o
438c2ecf20Sopenharmony_ci   in procfs potrebbe essere sufficiente.  Tuttavia, l'accesso a questi
448c2ecf20Sopenharmony_ci   meccanismi richiede che il filesystem sia montato, il che potrebbe non
458c2ecf20Sopenharmony_ci   essere sempre vero (per esempio, in ambienti come namespace/sandbox/chroot).
468c2ecf20Sopenharmony_ci   Evitate d'aggiungere nuove API in debugfs perché questo non viene
478c2ecf20Sopenharmony_ci   considerata un'interfaccia di 'produzione' verso lo spazio utente.
488c2ecf20Sopenharmony_ci - Se l'operazione è specifica ad un particolare file o descrittore, allora
498c2ecf20Sopenharmony_ci   potrebbe essere appropriata l'aggiunta di un comando :manpage:`fcntl(2)`.
508c2ecf20Sopenharmony_ci   Tuttavia, :manpage:`fcntl(2)` è una chiamata di sistema multiplatrice che
518c2ecf20Sopenharmony_ci   nasconde una notevole complessità, quindi è ottima solo quando la nuova
528c2ecf20Sopenharmony_ci   funzione assomiglia a quelle già esistenti in :manpage:`fcntl(2)`, oppure
538c2ecf20Sopenharmony_ci   la nuova funzionalità è veramente semplice (per esempio, leggere/scrivere
548c2ecf20Sopenharmony_ci   un semplice flag associato ad un descrittore di file).
558c2ecf20Sopenharmony_ci - Se l'operazione è specifica ad un particolare processo, allora
568c2ecf20Sopenharmony_ci   potrebbe essere appropriata l'aggiunta di un comando :manpage:`prctl(2)`.
578c2ecf20Sopenharmony_ci   Come per :manpage:`fcntl(2)`, questa chiamata di sistema è un complesso
588c2ecf20Sopenharmony_ci   multiplatore quindi è meglio usarlo per cose molto simili a quelle esistenti
598c2ecf20Sopenharmony_ci   nel comando ``prctl`` oppure per leggere/scrivere un semplice flag relativo
608c2ecf20Sopenharmony_ci   al processo.
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ciProgettare l'API: pianificare le estensioni
648c2ecf20Sopenharmony_ci-------------------------------------------
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ciUna nuova chiamata di sistema diventerà parte dell'API del kernel, e
678c2ecf20Sopenharmony_cidev'essere supportata per un periodo indefinito.  Per questo, è davvero
688c2ecf20Sopenharmony_ciun'ottima idea quella di discutere apertamente l'interfaccia sulla lista
698c2ecf20Sopenharmony_cidi discussione del kernel, ed è altrettanto importante pianificarne eventuali
708c2ecf20Sopenharmony_ciestensioni future.
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci(Nella tabella delle chiamate di sistema sono disseminati esempi dove questo
738c2ecf20Sopenharmony_cinon fu fatto, assieme ai corrispondenti aggiornamenti -
748c2ecf20Sopenharmony_ci``eventfd``/``eventfd2``, ``dup2``/``dup3``, ``inotify_init``/``inotify_init1``,
758c2ecf20Sopenharmony_ci``pipe``/``pipe2``, ``renameat``/``renameat2`` --quindi imparate dalla storia
768c2ecf20Sopenharmony_cidel kernel e pianificate le estensioni fin dall'inizio)
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ciPer semplici chiamate di sistema che accettano solo un paio di argomenti,
798c2ecf20Sopenharmony_ciil modo migliore di permettere l'estensibilità è quello di includere un
808c2ecf20Sopenharmony_ciargomento *flags* alla chiamata di sistema.  Per assicurarsi che i programmi
818c2ecf20Sopenharmony_cidello spazio utente possano usare in sicurezza *flags* con diverse versioni
828c2ecf20Sopenharmony_cidel kernel, verificate se *flags* contiene un qualsiasi valore sconosciuto,
838c2ecf20Sopenharmony_ciin qual caso rifiutate la chiamata di sistema (con ``EINVAL``)::
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci    if (flags & ~(THING_FLAG1 | THING_FLAG2 | THING_FLAG3))
868c2ecf20Sopenharmony_ci        return -EINVAL;
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci(Se *flags* non viene ancora utilizzato, verificate che l'argomento sia zero)
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_ciPer chiamate di sistema più sofisticate che coinvolgono un numero più grande di
918c2ecf20Sopenharmony_ciargomenti, il modo migliore è quello di incapsularne la maggior parte in una
928c2ecf20Sopenharmony_cistruttura dati che verrà passata per puntatore.  Questa struttura potrà
938c2ecf20Sopenharmony_cifunzionare con future estensioni includendo un campo *size*::
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci    struct xyzzy_params {
968c2ecf20Sopenharmony_ci        u32 size; /* userspace sets p->size = sizeof(struct xyzzy_params) */
978c2ecf20Sopenharmony_ci        u32 param_1;
988c2ecf20Sopenharmony_ci        u64 param_2;
998c2ecf20Sopenharmony_ci        u64 param_3;
1008c2ecf20Sopenharmony_ci    };
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ciFintanto che un qualsiasi campo nuovo, diciamo ``param_4``, è progettato per
1038c2ecf20Sopenharmony_cioffrire il comportamento precedente quando vale zero, allora questo permetterà
1048c2ecf20Sopenharmony_cidi gestire un conflitto di versione in entrambe le direzioni:
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ci - un vecchio kernel può gestire l'accesso di una versione moderna di un
1078c2ecf20Sopenharmony_ci   programma in spazio utente verificando che la memoria oltre la dimensione
1088c2ecf20Sopenharmony_ci   della struttura dati attesa sia zero (in pratica verificare che
1098c2ecf20Sopenharmony_ci   ``param_4 == 0``).
1108c2ecf20Sopenharmony_ci - un nuovo kernel può gestire l'accesso di una versione vecchia di un
1118c2ecf20Sopenharmony_ci   programma in spazio utente estendendo la struttura dati con zeri (in pratica
1128c2ecf20Sopenharmony_ci   ``param_4 = 0``).
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_ciVedere :manpage:`perf_event_open(2)` e la funzione ``perf_copy_attr()`` (in
1158c2ecf20Sopenharmony_ci``kernel/events/core.c``) per un esempio pratico di questo approccio.
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ciProgettare l'API: altre considerazioni
1198c2ecf20Sopenharmony_ci--------------------------------------
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ciSe la vostra nuova chiamata di sistema permette allo spazio utente di fare
1228c2ecf20Sopenharmony_ciriferimento ad un oggetto del kernel, allora questa dovrebbe usare un
1238c2ecf20Sopenharmony_cidescrittore di file per accesso all'oggetto - non inventatevi nuovi tipi di
1248c2ecf20Sopenharmony_ciaccesso da spazio utente quando il kernel ha già dei meccanismi e una semantica
1258c2ecf20Sopenharmony_ciben definita per utilizzare i descrittori di file.
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ritorna un nuovo
1288c2ecf20Sopenharmony_cidescrittore di file, allora l'argomento *flags* dovrebbe includere un valore
1298c2ecf20Sopenharmony_ciequivalente a ``O_CLOEXEC`` per i nuovi descrittori.  Questo rende possibile,
1308c2ecf20Sopenharmony_cinello spazio utente, la chiusura della finestra temporale fra le chiamate a
1318c2ecf20Sopenharmony_ci``xyzzy()`` e ``fcntl(fd, F_SETFD, FD_CLOEXEC)``, dove un inaspettato
1328c2ecf20Sopenharmony_ci``fork()`` o ``execve()`` potrebbe trasferire il descrittore al programma
1338c2ecf20Sopenharmony_cieseguito (Comunque, resistete alla tentazione di riutilizzare il valore di
1348c2ecf20Sopenharmony_ci``O_CLOEXEC`` dato che è specifico dell'architettura e fa parte di una
1358c2ecf20Sopenharmony_cienumerazione di flag ``O_*`` che è abbastanza ricca).
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ciSe la vostra nuova chiamata di sistema ritorna un nuovo descrittore di file,
1388c2ecf20Sopenharmony_cidovreste considerare che significato avrà l'uso delle chiamate di sistema
1398c2ecf20Sopenharmony_cidella famiglia di :manpage:`poll(2)`. Rendere un descrittore di file pronto
1408c2ecf20Sopenharmony_ciper la lettura o la scrittura è il tipico modo del kernel per notificare lo
1418c2ecf20Sopenharmony_cispazio utente circa un evento associato all'oggetto del kernel.
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ha un argomento
1448c2ecf20Sopenharmony_ciche è il percorso ad un file::
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci    int sys_xyzzy(const char __user *path, ..., unsigned int flags);
1478c2ecf20Sopenharmony_ci
1488c2ecf20Sopenharmony_cidovreste anche considerare se non sia più appropriata una versione
1498c2ecf20Sopenharmony_ci:manpage:`xyzzyat(2)`::
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci    int sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags);
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_ciQuesto permette più flessibilità su come lo spazio utente specificherà il file
1548c2ecf20Sopenharmony_ciin questione; in particolare, permette allo spazio utente di richiedere la
1558c2ecf20Sopenharmony_cifunzionalità su un descrittore di file già aperto utilizzando il *flag*
1568c2ecf20Sopenharmony_ci``AT_EMPTY_PATH``, in pratica otterremmo gratuitamente l'operazione
1578c2ecf20Sopenharmony_ci:manpage:`fxyzzy(3)`::
1588c2ecf20Sopenharmony_ci
1598c2ecf20Sopenharmony_ci - xyzzyat(AT_FDCWD, path, ..., 0) is equivalent to xyzzy(path,...)
1608c2ecf20Sopenharmony_ci - xyzzyat(fd, "", ..., AT_EMPTY_PATH) is equivalent to fxyzzy(fd, ...)
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci(Per maggiori dettagli sulla logica delle chiamate \*at(), leggete la pagina
1638c2ecf20Sopenharmony_ciman :manpage:`openat(2)`; per un esempio di AT_EMPTY_PATH, leggere la pagina
1648c2ecf20Sopenharmony_ciman :manpage:`fstatat(2)`).
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede un parametro
1678c2ecf20Sopenharmony_ciper descrivere uno scostamento all'interno di un file, usate ``loff_t`` come
1688c2ecf20Sopenharmony_citipo cosicché scostamenti a 64-bit potranno essere supportati anche su
1698c2ecf20Sopenharmony_ciarchitetture a 32-bit.
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede l'uso di
1728c2ecf20Sopenharmony_cifunzioni riservate, allora dev'essere gestita da un opportuno bit di privilegio
1738c2ecf20Sopenharmony_ci(verificato con una chiamata a ``capable()``), come descritto nella pagina man
1748c2ecf20Sopenharmony_ci:manpage:`capabilities(7)`.  Scegliete un bit di privilegio già esistente per
1758c2ecf20Sopenharmony_cigestire la funzionalità associata, ma evitate la combinazione di diverse
1768c2ecf20Sopenharmony_cifunzionalità vagamente collegate dietro lo stesso bit, in quanto va contro il
1778c2ecf20Sopenharmony_ciprincipio di *capabilities* di separare i poteri di root.  In particolare,
1788c2ecf20Sopenharmony_cievitate di aggiungere nuovi usi al fin-troppo-generico privilegio
1798c2ecf20Sopenharmony_ci``CAP_SYS_ADMIN``.
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` manipola altri
1828c2ecf20Sopenharmony_ciprocessi oltre a quello chiamato, allora dovrebbe essere limitata (usando
1838c2ecf20Sopenharmony_cila chiamata ``ptrace_may_access()``) di modo che solo un processo chiamante
1848c2ecf20Sopenharmony_cicon gli stessi permessi del processo in oggetto, o con i necessari privilegi,
1858c2ecf20Sopenharmony_cipossa manipolarlo.
1868c2ecf20Sopenharmony_ci
1878c2ecf20Sopenharmony_ciInfine, state attenti che in alcune architetture non-x86 la vita delle chiamate
1888c2ecf20Sopenharmony_cidi sistema con argomenti a 64-bit viene semplificata se questi argomenti
1898c2ecf20Sopenharmony_ciricadono in posizioni dispari (pratica, i parametri 1, 3, 5); questo permette
1908c2ecf20Sopenharmony_cil'uso di coppie contigue di registri a 32-bit.  (Questo non conta se gli
1918c2ecf20Sopenharmony_ciargomenti sono parte di una struttura dati che viene passata per puntatore).
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ciProporre l'API
1958c2ecf20Sopenharmony_ci--------------
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ciAl fine di rendere le nuove chiamate di sistema di facile revisione, è meglio
1988c2ecf20Sopenharmony_ciche dividiate le modifiche i pezzi separati.  Questi dovrebbero includere
1998c2ecf20Sopenharmony_cialmeno le seguenti voci in *commit* distinti (ognuno dei quali sarà descritto
2008c2ecf20Sopenharmony_cipiù avanti):
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ci - l'essenza dell'implementazione della chiamata di sistema, con i prototipi,
2038c2ecf20Sopenharmony_ci   i numeri generici, le modifiche al Kconfig e l'implementazione *stub* di
2048c2ecf20Sopenharmony_ci   ripiego.
2058c2ecf20Sopenharmony_ci - preparare la nuova chiamata di sistema per un'architettura specifica,
2068c2ecf20Sopenharmony_ci   solitamente x86 (ovvero tutti: x86_64, x86_32 e x32).
2078c2ecf20Sopenharmony_ci - un programma di auto-verifica da mettere in ``tools/testing/selftests/``
2088c2ecf20Sopenharmony_ci   che mostri l'uso della chiamata di sistema.
2098c2ecf20Sopenharmony_ci - una bozza di pagina man per la nuova chiamata di sistema. Può essere
2108c2ecf20Sopenharmony_ci   scritta nell'email di presentazione, oppure come modifica vera e propria
2118c2ecf20Sopenharmony_ci   al repositorio delle pagine man.
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ciLe proposte di nuove chiamate di sistema, come ogni altro modifica all'API del
2148c2ecf20Sopenharmony_cikernel, deve essere sottomessa alla lista di discussione
2158c2ecf20Sopenharmony_cilinux-api@vger.kernel.org.
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ciImplementazione di chiamate di sistema generiche
2198c2ecf20Sopenharmony_ci------------------------------------------------
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ciIl principale punto d'accesso alla vostra nuova chiamata di sistema
2228c2ecf20Sopenharmony_ci:manpage:`xyzzy(2)` verrà chiamato ``sys_xyzzy()``; ma, piuttosto che in modo
2238c2ecf20Sopenharmony_ciesplicito, lo aggiungerete tramite la macro ``SYSCALL_DEFINEn``. La 'n'
2248c2ecf20Sopenharmony_ciindica il numero di argomenti della chiamata di sistema; la macro ha come
2258c2ecf20Sopenharmony_ciargomento il nome della chiamata di sistema, seguito dalle coppie (tipo, nome)
2268c2ecf20Sopenharmony_ciper definire i suoi parametri.  L'uso di questa macro permette di avere
2278c2ecf20Sopenharmony_cii metadati della nuova chiamata di sistema disponibili anche per altri
2288c2ecf20Sopenharmony_cistrumenti.
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_ciIl nuovo punto d'accesso necessita anche del suo prototipo di funzione in
2318c2ecf20Sopenharmony_ci``include/linux/syscalls.h``, marcato come asmlinkage di modo da abbinargli
2328c2ecf20Sopenharmony_ciil modo in cui quelle chiamate di sistema verranno invocate::
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ci    asmlinkage long sys_xyzzy(...);
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_ciAlcune architetture (per esempio x86) hanno le loro specifiche tabelle di
2378c2ecf20Sopenharmony_cichiamate di sistema (syscall), ma molte altre architetture condividono una
2388c2ecf20Sopenharmony_citabella comune di syscall. Aggiungete alla lista generica la vostra nuova
2398c2ecf20Sopenharmony_cichiamata di sistema aggiungendo un nuovo elemento alla lista in
2408c2ecf20Sopenharmony_ci``include/uapi/asm-generic/unistd.h``::
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_ci    #define __NR_xyzzy 292
2438c2ecf20Sopenharmony_ci    __SYSCALL(__NR_xyzzy, sys_xyzzy)
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_ciAggiornate anche il contatore __NR_syscalls di modo che sia coerente con
2468c2ecf20Sopenharmony_cil'aggiunta della nuove chiamate di sistema; va notato che se più di una nuova
2478c2ecf20Sopenharmony_cichiamata di sistema viene aggiunga nella stessa finestra di sviluppo, il numero
2488c2ecf20Sopenharmony_cidella vostra nuova syscall potrebbe essere aggiustato al fine di risolvere i
2498c2ecf20Sopenharmony_ciconflitti.
2508c2ecf20Sopenharmony_ci
2518c2ecf20Sopenharmony_ciIl file ``kernel/sys_ni.c`` fornisce le implementazioni *stub* di ripiego che
2528c2ecf20Sopenharmony_ciritornano ``-ENOSYS``.  Aggiungete la vostra nuova chiamata di sistema anche
2538c2ecf20Sopenharmony_ciqui::
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_ci    COND_SYSCALL(xyzzy);
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_ciLa vostra nuova funzionalità del kernel, e la chiamata di sistema che la
2588c2ecf20Sopenharmony_cicontrolla, dovrebbero essere opzionali. Quindi, aggiungete un'opzione
2598c2ecf20Sopenharmony_ci``CONFIG`` (solitamente in ``init/Kconfig``).  Come al solito per le nuove
2608c2ecf20Sopenharmony_ciopzioni ``CONFIG``:
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci - Includete una descrizione della nuova funzionalità e della chiamata di
2638c2ecf20Sopenharmony_ci   sistema che la controlla.
2648c2ecf20Sopenharmony_ci - Rendete l'opzione dipendente da EXPERT se dev'essere nascosta agli utenti
2658c2ecf20Sopenharmony_ci   normali.
2668c2ecf20Sopenharmony_ci - Nel Makefile, rendere tutti i nuovi file sorgenti, che implementano la
2678c2ecf20Sopenharmony_ci   nuova funzionalità, dipendenti dall'opzione CONFIG (per esempio
2688c2ecf20Sopenharmony_ci   ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``).
2698c2ecf20Sopenharmony_ci - Controllate due volte che sia possibile generare il kernel con la nuova
2708c2ecf20Sopenharmony_ci   opzione CONFIG disabilitata.
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ciPer riassumere, vi serve un *commit* che includa:
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_ci - un'opzione ``CONFIG``per la nuova funzione, normalmente in ``init/Kconfig``
2758c2ecf20Sopenharmony_ci - ``SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso
2768c2ecf20Sopenharmony_ci - il corrispondente prototipo in ``include/linux/syscalls.h``
2778c2ecf20Sopenharmony_ci - un elemento nella tabella generica in ``include/uapi/asm-generic/unistd.h``
2788c2ecf20Sopenharmony_ci - *stub* di ripiego in ``kernel/sys_ni.c``
2798c2ecf20Sopenharmony_ci
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ciImplementazione delle chiamate di sistema x86
2828c2ecf20Sopenharmony_ci---------------------------------------------
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_ciPer collegare la vostra nuova chiamate di sistema alle piattaforme x86,
2858c2ecf20Sopenharmony_cidovete aggiornate la tabella principale di syscall.  Assumendo che la vostra
2868c2ecf20Sopenharmony_cinuova chiamata di sistema non sia particolarmente speciale (vedere sotto),
2878c2ecf20Sopenharmony_cidovete aggiungere un elemento *common* (per x86_64 e x32) in
2888c2ecf20Sopenharmony_ciarch/x86/entry/syscalls/syscall_64.tbl::
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci    333   common   xyzzy     sys_xyzzy
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_cie un elemento per *i386* ``arch/x86/entry/syscalls/syscall_32.tbl``::
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_ci    380   i386     xyzzy     sys_xyzzy
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_ciAncora una volta, questi numeri potrebbero essere cambiati se generano
2978c2ecf20Sopenharmony_ciconflitti durante la finestra di integrazione.
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ci
3008c2ecf20Sopenharmony_ciChiamate di sistema compatibili (generico)
3018c2ecf20Sopenharmony_ci------------------------------------------
3028c2ecf20Sopenharmony_ci
3038c2ecf20Sopenharmony_ciPer molte chiamate di sistema, la stessa implementazione a 64-bit può essere
3048c2ecf20Sopenharmony_ciinvocata anche quando il programma in spazio utente è a 32-bit; anche se la
3058c2ecf20Sopenharmony_cichiamata di sistema include esplicitamente un puntatore, questo viene gestito
3068c2ecf20Sopenharmony_ciin modo trasparente.
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ciTuttavia, ci sono un paio di situazione dove diventa necessario avere un
3098c2ecf20Sopenharmony_cilivello di gestione della compatibilità per risolvere le differenze di
3108c2ecf20Sopenharmony_cidimensioni fra 32-bit e 64-bit.
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_ciIl primo caso è quando un kernel a 64-bit supporta anche programmi in spazio
3138c2ecf20Sopenharmony_ciutente a 32-bit, perciò dovrà ispezionare aree della memoria (``__user``) che
3148c2ecf20Sopenharmony_cipotrebbero contenere valori a 32-bit o a 64-bit.  In particolar modo, questo
3158c2ecf20Sopenharmony_ciè necessario quando un argomento di una chiamata di sistema è:
3168c2ecf20Sopenharmony_ci
3178c2ecf20Sopenharmony_ci - un puntatore ad un puntatore
3188c2ecf20Sopenharmony_ci - un puntatore ad una struttura dati contenente a sua volta un puntatore
3198c2ecf20Sopenharmony_ci   ( ad esempio ``struct iovec __user *``)
3208c2ecf20Sopenharmony_ci - un puntatore ad un tipo intero di dimensione variabile (``time_t``,
3218c2ecf20Sopenharmony_ci   ``off_t``, ``long``, ...)
3228c2ecf20Sopenharmony_ci - un puntatore ad una struttura dati contenente un tipo intero di dimensione
3238c2ecf20Sopenharmony_ci   variabile.
3248c2ecf20Sopenharmony_ci
3258c2ecf20Sopenharmony_ciIl secondo caso che richiede un livello di gestione della compatibilità è
3268c2ecf20Sopenharmony_ciquando uno degli argomenti di una chiamata a sistema è esplicitamente un tipo
3278c2ecf20Sopenharmony_cia 64-bit anche su architetture a 32-bit, per esempio ``loff_t`` o ``__u64``.
3288c2ecf20Sopenharmony_ciIn questo caso, un valore che arriva ad un kernel a 64-bit da un'applicazione
3298c2ecf20Sopenharmony_cia 32-bit verrà diviso in due valori a 32-bit che dovranno essere riassemblati
3308c2ecf20Sopenharmony_ciin questo livello di compatibilità.
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci(Da notare che non serve questo livello di compatibilità per argomenti che
3338c2ecf20Sopenharmony_cisono puntatori ad un tipo esplicitamente a 64-bit; per esempio, in
3348c2ecf20Sopenharmony_ci:manpage:`splice(2)` l'argomento di tipo ``loff_t __user *`` non necessita
3358c2ecf20Sopenharmony_cidi una chiamata di sistema ``compat_``)
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ciLa versione compatibile della nostra chiamata di sistema si chiamerà
3388c2ecf20Sopenharmony_ci``compat_sys_xyzzy()``, e viene aggiunta utilizzando la macro
3398c2ecf20Sopenharmony_ci``COMPAT_SYSCALL_DEFINEn()`` (simile a SYSCALL_DEFINEn).  Questa versione
3408c2ecf20Sopenharmony_cidell'implementazione è parte del kernel a 64-bit ma accetta parametri a 32-bit
3418c2ecf20Sopenharmony_ciche trasformerà secondo le necessità (tipicamente, la versione
3428c2ecf20Sopenharmony_ci``compat_sys_`` converte questi valori nello loro corrispondente a 64-bit e
3438c2ecf20Sopenharmony_cipuò chiamare la versione ``sys_`` oppure invocare una funzione che implementa
3448c2ecf20Sopenharmony_cile parti comuni).
3458c2ecf20Sopenharmony_ci
3468c2ecf20Sopenharmony_ciIl punto d'accesso *compat* deve avere il corrispondente prototipo di funzione
3478c2ecf20Sopenharmony_ciin ``include/linux/compat.h``, marcato come asmlinkage di modo da abbinargli
3488c2ecf20Sopenharmony_ciil modo in cui quelle chiamate di sistema verranno invocate::
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ci    asmlinkage long compat_sys_xyzzy(...);
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_ciSe la chiamata di sistema prevede una struttura dati organizzata in modo
3538c2ecf20Sopenharmony_cidiverso per sistemi a 32-bit e per quelli a 64-bit, diciamo
3548c2ecf20Sopenharmony_ci``struct xyzzy_args``, allora il file d'intestazione
3558c2ecf20Sopenharmony_ci``then the include/linux/compat.h`` deve includere la sua versione
3568c2ecf20Sopenharmony_ci*compatibile* (``struct compat_xyzzy_args``); ogni variabile con
3578c2ecf20Sopenharmony_cidimensione variabile deve avere il proprio tipo ``compat_`` corrispondente
3588c2ecf20Sopenharmony_cia quello in ``struct xyzzy_args``.  La funzione ``compat_sys_xyzzy()``
3598c2ecf20Sopenharmony_cipuò usare la struttura ``compat_`` per analizzare gli argomenti ricevuti
3608c2ecf20Sopenharmony_cida una chiamata a 32-bit.
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_ciPer esempio, se avete i seguenti campi::
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_ci    struct xyzzy_args {
3658c2ecf20Sopenharmony_ci        const char __user *ptr;
3668c2ecf20Sopenharmony_ci        __kernel_long_t varying_val;
3678c2ecf20Sopenharmony_ci        u64 fixed_val;
3688c2ecf20Sopenharmony_ci        /* ... */
3698c2ecf20Sopenharmony_ci    };
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_cinella struttura ``struct xyzzy_args``, allora la struttura
3728c2ecf20Sopenharmony_ci``struct compat_xyzzy_args`` dovrebbe avere::
3738c2ecf20Sopenharmony_ci
3748c2ecf20Sopenharmony_ci    struct compat_xyzzy_args {
3758c2ecf20Sopenharmony_ci        compat_uptr_t ptr;
3768c2ecf20Sopenharmony_ci        compat_long_t varying_val;
3778c2ecf20Sopenharmony_ci        u64 fixed_val;
3788c2ecf20Sopenharmony_ci        /* ... */
3798c2ecf20Sopenharmony_ci    };
3808c2ecf20Sopenharmony_ci
3818c2ecf20Sopenharmony_ciLa lista generica delle chiamate di sistema ha bisogno di essere
3828c2ecf20Sopenharmony_ciaggiustata al fine di permettere l'uso della versione *compatibile*;
3838c2ecf20Sopenharmony_cila voce in ``include/uapi/asm-generic/unistd.h`` dovrebbero usare
3848c2ecf20Sopenharmony_ci``__SC_COMP`` piuttosto di ``__SYSCALL``::
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ci    #define __NR_xyzzy 292
3878c2ecf20Sopenharmony_ci    __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy)
3888c2ecf20Sopenharmony_ci
3898c2ecf20Sopenharmony_ciRiassumendo, vi serve:
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_ci - un ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso
3928c2ecf20Sopenharmony_ci   *compatibile*
3938c2ecf20Sopenharmony_ci - un prototipo in ``include/linux/compat.h``
3948c2ecf20Sopenharmony_ci - (se necessario) una struttura di compatibilità a 32-bit in
3958c2ecf20Sopenharmony_ci   ``include/linux/compat.h``
3968c2ecf20Sopenharmony_ci - una voce ``__SC_COMP``, e non ``__SYSCALL``, in
3978c2ecf20Sopenharmony_ci   ``include/uapi/asm-generic/unistd.h``
3988c2ecf20Sopenharmony_ci
3998c2ecf20Sopenharmony_ciCompatibilità delle chiamate di sistema (x86)
4008c2ecf20Sopenharmony_ci---------------------------------------------
4018c2ecf20Sopenharmony_ci
4028c2ecf20Sopenharmony_ciPer collegare una chiamata di sistema, su un'architettura x86, con la sua
4038c2ecf20Sopenharmony_civersione *compatibile*, è necessario aggiustare la voce nella tabella
4048c2ecf20Sopenharmony_cidelle syscall.
4058c2ecf20Sopenharmony_ci
4068c2ecf20Sopenharmony_ciPer prima cosa, la voce in ``arch/x86/entry/syscalls/syscall_32.tbl`` prende
4078c2ecf20Sopenharmony_ciun argomento aggiuntivo per indicare che un programma in spazio utente
4088c2ecf20Sopenharmony_cia 32-bit, eseguito su un kernel a 64-bit, dovrebbe accedere tramite il punto
4098c2ecf20Sopenharmony_cid'accesso compatibile::
4108c2ecf20Sopenharmony_ci
4118c2ecf20Sopenharmony_ci    380   i386     xyzzy     sys_xyzzy    __ia32_compat_sys_xyzzy
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ciSecondo, dovete capire cosa dovrebbe succedere alla nuova chiamata di sistema
4148c2ecf20Sopenharmony_ciper la versione dell'ABI x32.  Qui C'è una scelta da fare: gli argomenti
4158c2ecf20Sopenharmony_cipossono corrisponde alla versione a 64-bit o a quella a 32-bit.
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ciSe c'è un puntatore ad un puntatore, la decisione è semplice: x32 è ILP32,
4188c2ecf20Sopenharmony_ciquindi gli argomenti dovrebbero corrispondere a quelli a 32-bit, e la voce in
4198c2ecf20Sopenharmony_ci``arch/x86/entry/syscalls/syscall_64.tbl`` sarà divisa cosicché i programmi
4208c2ecf20Sopenharmony_cix32 eseguano la chiamata *compatibile*::
4218c2ecf20Sopenharmony_ci
4228c2ecf20Sopenharmony_ci    333   64       xyzzy     sys_xyzzy
4238c2ecf20Sopenharmony_ci    ...
4248c2ecf20Sopenharmony_ci    555   x32      xyzzy     __x32_compat_sys_xyzzy
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ciSe non ci sono puntatori, allora è preferibile riutilizzare la chiamata di
4278c2ecf20Sopenharmony_cisistema a 64-bit per l'ABI x32 (e di conseguenza la voce in
4288c2ecf20Sopenharmony_ciarch/x86/entry/syscalls/syscall_64.tbl rimane immutata).
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ciIn ambo i casi, dovreste verificare che i tipi usati dagli argomenti
4318c2ecf20Sopenharmony_ciabbiano un'esatta corrispondenza da x32 (-mx32) al loro equivalente a
4328c2ecf20Sopenharmony_ci32-bit (-m32) o 64-bit (-m64).
4338c2ecf20Sopenharmony_ci
4348c2ecf20Sopenharmony_ci
4358c2ecf20Sopenharmony_ciChiamate di sistema che ritornano altrove
4368c2ecf20Sopenharmony_ci-----------------------------------------
4378c2ecf20Sopenharmony_ci
4388c2ecf20Sopenharmony_ciNella maggior parte delle chiamate di sistema, al termine della loro
4398c2ecf20Sopenharmony_ciesecuzione, i programmi in spazio utente riprendono esattamente dal punto
4408c2ecf20Sopenharmony_ciin cui si erano interrotti -- quindi dall'istruzione successiva, con lo
4418c2ecf20Sopenharmony_cistesso *stack* e con la maggior parte del registri com'erano stati
4428c2ecf20Sopenharmony_cilasciati prima della chiamata di sistema, e anche con la stessa memoria
4438c2ecf20Sopenharmony_civirtuale.
4448c2ecf20Sopenharmony_ci
4458c2ecf20Sopenharmony_ciTuttavia, alcune chiamata di sistema fanno le cose in modo differente.
4468c2ecf20Sopenharmony_ciPotrebbero ritornare ad un punto diverso (``rt_sigreturn``) o cambiare
4478c2ecf20Sopenharmony_cila memoria in spazio utente (``fork``/``vfork``/``clone``) o perfino
4488c2ecf20Sopenharmony_cil'architettura del programma (``execve``/``execveat``).
4498c2ecf20Sopenharmony_ci
4508c2ecf20Sopenharmony_ciPer permettere tutto ciò, l'implementazione nel kernel di questo tipo di
4518c2ecf20Sopenharmony_cichiamate di sistema potrebbero dover salvare e ripristinare registri
4528c2ecf20Sopenharmony_ciaggiuntivi nello *stack* del kernel, permettendo così un controllo completo
4538c2ecf20Sopenharmony_cisu dove e come l'esecuzione dovrà continuare dopo l'esecuzione della
4548c2ecf20Sopenharmony_cichiamata di sistema.
4558c2ecf20Sopenharmony_ci
4568c2ecf20Sopenharmony_ciQueste saranno specifiche per ogni architettura, ma tipicamente si definiscono
4578c2ecf20Sopenharmony_cidei punti d'accesso in *assembly* per salvare/ripristinare i registri
4588c2ecf20Sopenharmony_ciaggiuntivi e quindi chiamare il vero punto d'accesso per la chiamata di
4598c2ecf20Sopenharmony_cisistema.
4608c2ecf20Sopenharmony_ci
4618c2ecf20Sopenharmony_ciPer l'architettura x86_64, questo è implementato come un punto d'accesso
4628c2ecf20Sopenharmony_ci``stub_xyzzy`` in ``arch/x86/entry/entry_64.S``, e la voce nella tabella
4638c2ecf20Sopenharmony_cidi syscall (``arch/x86/entry/syscalls/syscall_64.tbl``) verrà corretta di
4648c2ecf20Sopenharmony_ciconseguenza::
4658c2ecf20Sopenharmony_ci
4668c2ecf20Sopenharmony_ci    333   common   xyzzy     stub_xyzzy
4678c2ecf20Sopenharmony_ci
4688c2ecf20Sopenharmony_ciL'equivalente per programmi a 32-bit eseguiti su un kernel a 64-bit viene
4698c2ecf20Sopenharmony_cinormalmente chiamato ``stub32_xyzzy`` e implementato in
4708c2ecf20Sopenharmony_ci``arch/x86/entry/entry_64_compat.S`` con la corrispondente voce nella tabella
4718c2ecf20Sopenharmony_cidi syscall ``arch/x86/entry/syscalls/syscall_32.tbl`` corretta nel
4728c2ecf20Sopenharmony_ciseguente modo::
4738c2ecf20Sopenharmony_ci
4748c2ecf20Sopenharmony_ci    380   i386     xyzzy     sys_xyzzy    stub32_xyzzy
4758c2ecf20Sopenharmony_ci
4768c2ecf20Sopenharmony_ciSe una chiamata di sistema necessita di un livello di compatibilità (come
4778c2ecf20Sopenharmony_cinella sezione precedente), allora la versione ``stub32_`` deve invocare
4788c2ecf20Sopenharmony_cila versione ``compat_sys_`` piuttosto che quella nativa a 64-bit.  In aggiunta,
4798c2ecf20Sopenharmony_cise l'implementazione dell'ABI x32 è diversa da quella x86_64, allora la sua
4808c2ecf20Sopenharmony_civoce nella tabella di syscall dovrà chiamare uno *stub* che invoca la versione
4818c2ecf20Sopenharmony_ci``compat_sys_``,
4828c2ecf20Sopenharmony_ci
4838c2ecf20Sopenharmony_ciPer completezza, sarebbe carino impostare una mappatura cosicché
4848c2ecf20Sopenharmony_ci*user-mode* Linux (UML) continui a funzionare -- la sua tabella di syscall
4858c2ecf20Sopenharmony_cifarà riferimento a stub_xyzzy, ma UML non include l'implementazione
4868c2ecf20Sopenharmony_ciin ``arch/x86/entry/entry_64.S`` (perché UML simula i registri eccetera).
4878c2ecf20Sopenharmony_ciCorreggerlo è semplice, basta aggiungere una #define in
4888c2ecf20Sopenharmony_ci``arch/x86/um/sys_call_table_64.c``::
4898c2ecf20Sopenharmony_ci
4908c2ecf20Sopenharmony_ci    #define stub_xyzzy sys_xyzzy
4918c2ecf20Sopenharmony_ci
4928c2ecf20Sopenharmony_ci
4938c2ecf20Sopenharmony_ciAltri dettagli
4948c2ecf20Sopenharmony_ci--------------
4958c2ecf20Sopenharmony_ci
4968c2ecf20Sopenharmony_ciLa maggior parte dei kernel tratta le chiamate di sistema allo stesso modo,
4978c2ecf20Sopenharmony_cima possono esserci rare eccezioni per le quali potrebbe essere necessario
4988c2ecf20Sopenharmony_cil'aggiornamento della vostra chiamata di sistema.
4998c2ecf20Sopenharmony_ci
5008c2ecf20Sopenharmony_ciIl sotto-sistema di controllo (*audit subsystem*) è uno di questi casi
5018c2ecf20Sopenharmony_cispeciali; esso include (per architettura) funzioni che classificano alcuni
5028c2ecf20Sopenharmony_citipi di chiamate di sistema -- in particolare apertura dei file
5038c2ecf20Sopenharmony_ci(``open``/``openat``), esecuzione dei programmi (``execve``/``exeveat``)
5048c2ecf20Sopenharmony_cioppure multiplatori di socket (``socketcall``). Se la vostra nuova chiamata
5058c2ecf20Sopenharmony_cidi sistema è simile ad una di queste, allora il sistema di controllo dovrebbe
5068c2ecf20Sopenharmony_ciessere aggiornato.
5078c2ecf20Sopenharmony_ci
5088c2ecf20Sopenharmony_ciPiù in generale, se esiste una chiamata di sistema che è simile alla vostra,
5098c2ecf20Sopenharmony_civale la pena fare una ricerca con ``grep`` su tutto il kernel per la chiamata
5108c2ecf20Sopenharmony_cidi sistema esistente per verificare che non ci siano altri casi speciali.
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_ci
5138c2ecf20Sopenharmony_ciVerifica
5148c2ecf20Sopenharmony_ci--------
5158c2ecf20Sopenharmony_ci
5168c2ecf20Sopenharmony_ciUna nuova chiamata di sistema dev'essere, ovviamente, provata; è utile fornire
5178c2ecf20Sopenharmony_ciai revisori un programma in spazio utente che mostri l'uso della chiamata di
5188c2ecf20Sopenharmony_cisistema.  Un buon modo per combinare queste cose è quello di aggiungere un
5198c2ecf20Sopenharmony_cisemplice programma di auto-verifica in una nuova cartella in
5208c2ecf20Sopenharmony_ci``tools/testing/selftests/``.
5218c2ecf20Sopenharmony_ci
5228c2ecf20Sopenharmony_ciPer una nuova chiamata di sistema, ovviamente, non ci sarà alcuna funzione
5238c2ecf20Sopenharmony_ciin libc e quindi il programma di verifica dovrà invocarla usando ``syscall()``;
5248c2ecf20Sopenharmony_ciinoltre, se la nuova chiamata di sistema prevede un nuova struttura dati
5258c2ecf20Sopenharmony_civisibile in spazio utente, il file d'intestazione necessario dev'essere
5268c2ecf20Sopenharmony_ciinstallato al fine di compilare il programma.
5278c2ecf20Sopenharmony_ci
5288c2ecf20Sopenharmony_ciAssicuratevi che il programma di auto-verifica possa essere eseguito
5298c2ecf20Sopenharmony_cicorrettamente su tutte le architetture supportate.  Per esempio, verificate che
5308c2ecf20Sopenharmony_cifunzioni quando viene compilato per x86_64 (-m64), x86_32 (-m32) e x32 (-mx32).
5318c2ecf20Sopenharmony_ci
5328c2ecf20Sopenharmony_ciAl fine di una più meticolosa ed estesa verifica della nuova funzionalità,
5338c2ecf20Sopenharmony_cidovreste considerare l'aggiunta di nuove verifica al progetto 'Linux Test',
5348c2ecf20Sopenharmony_cioppure al progetto xfstests per cambiamenti relativi al filesystem.
5358c2ecf20Sopenharmony_ci
5368c2ecf20Sopenharmony_ci - https://linux-test-project.github.io/
5378c2ecf20Sopenharmony_ci - git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git
5388c2ecf20Sopenharmony_ci
5398c2ecf20Sopenharmony_ci
5408c2ecf20Sopenharmony_ciPagine man
5418c2ecf20Sopenharmony_ci----------
5428c2ecf20Sopenharmony_ci
5438c2ecf20Sopenharmony_ciTutte le nuove chiamate di sistema dovrebbero avere una pagina man completa,
5448c2ecf20Sopenharmony_ciidealmente usando i marcatori groff, ma anche il puro testo può andare.  Se
5458c2ecf20Sopenharmony_cistate usando groff, è utile che includiate nella email di presentazione una
5468c2ecf20Sopenharmony_civersione già convertita in formato ASCII: semplificherà la vita dei revisori.
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ciLe pagine man dovrebbero essere in copia-conoscenza verso
5498c2ecf20Sopenharmony_cilinux-man@vger.kernel.org
5508c2ecf20Sopenharmony_ciPer maggiori dettagli, leggere
5518c2ecf20Sopenharmony_cihttps://www.kernel.org/doc/man-pages/patches.html
5528c2ecf20Sopenharmony_ci
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_ciNon invocate chiamate di sistema dal kernel
5558c2ecf20Sopenharmony_ci-------------------------------------------
5568c2ecf20Sopenharmony_ci
5578c2ecf20Sopenharmony_ciLe chiamate di sistema sono, come già detto prima, punti di interazione fra
5588c2ecf20Sopenharmony_cilo spazio utente e il kernel.  Perciò, le chiamate di sistema come
5598c2ecf20Sopenharmony_ci``sys_xyzzy()`` o ``compat_sys_xyzzy()`` dovrebbero essere chiamate solo dallo
5608c2ecf20Sopenharmony_cispazio utente attraverso la tabella syscall, ma non da nessun altro punto nel
5618c2ecf20Sopenharmony_cikernel.  Se la nuova funzionalità è utile all'interno del kernel, per esempio
5628c2ecf20Sopenharmony_cidev'essere condivisa fra una vecchia e una nuova chiamata di sistema o
5638c2ecf20Sopenharmony_cidev'essere utilizzata da una chiamata di sistema e la sua variante compatibile,
5648c2ecf20Sopenharmony_ciallora dev'essere implementata come una funzione di supporto
5658c2ecf20Sopenharmony_ci(*helper function*) (per esempio ``kern_xyzzy()``).  Questa funzione potrà
5668c2ecf20Sopenharmony_ciessere chiamata dallo *stub* (``sys_xyzzy()``), dalla variante compatibile
5678c2ecf20Sopenharmony_ci(``compat_sys_xyzzy()``), e/o da altri parti del kernel.
5688c2ecf20Sopenharmony_ci
5698c2ecf20Sopenharmony_ciSui sistemi x86 a 64-bit, a partire dalla versione v4.17 è un requisito
5708c2ecf20Sopenharmony_cifondamentale quello di non invocare chiamate di sistema all'interno del kernel.
5718c2ecf20Sopenharmony_ciEsso usa una diversa convenzione per l'invocazione di chiamate di sistema dove
5728c2ecf20Sopenharmony_ci``struct pt_regs`` viene decodificata al volo in una funzione che racchiude
5738c2ecf20Sopenharmony_cila chiamata di sistema la quale verrà eseguita successivamente.
5748c2ecf20Sopenharmony_ciQuesto significa che verranno passati solo i parametri che sono davvero
5758c2ecf20Sopenharmony_cinecessari ad una specifica chiamata di sistema, invece che riempire ogni volta
5768c2ecf20Sopenharmony_ci6 registri del processore con contenuti presi dallo spazio utente (potrebbe
5778c2ecf20Sopenharmony_cicausare seri problemi nella sequenza di chiamate).
5788c2ecf20Sopenharmony_ci
5798c2ecf20Sopenharmony_ciInoltre, le regole su come i dati possano essere usati potrebbero differire
5808c2ecf20Sopenharmony_cifra il kernel e l'utente.  Questo è un altro motivo per cui invocare
5818c2ecf20Sopenharmony_ci``sys_xyzzy()`` è generalmente una brutta idea.
5828c2ecf20Sopenharmony_ci
5838c2ecf20Sopenharmony_ciEccezioni a questa regola vengono accettate solo per funzioni d'architetture
5848c2ecf20Sopenharmony_ciche surclassano quelle generiche, per funzioni d'architettura di compatibilità,
5858c2ecf20Sopenharmony_cio per altro codice in arch/
5868c2ecf20Sopenharmony_ci
5878c2ecf20Sopenharmony_ci
5888c2ecf20Sopenharmony_ciRiferimenti e fonti
5898c2ecf20Sopenharmony_ci-------------------
5908c2ecf20Sopenharmony_ci
5918c2ecf20Sopenharmony_ci - Articolo di Michael Kerris su LWN sull'uso dell'argomento flags nelle
5928c2ecf20Sopenharmony_ci   chiamate di sistema: https://lwn.net/Articles/585415/
5938c2ecf20Sopenharmony_ci - Articolo di Michael Kerris su LWN su come gestire flag sconosciuti in
5948c2ecf20Sopenharmony_ci   una chiamata di sistema: https://lwn.net/Articles/588444/
5958c2ecf20Sopenharmony_ci - Articolo di Jake Edge su LWN che descrive i limiti degli argomenti a 64-bit
5968c2ecf20Sopenharmony_ci   delle chiamate di sistema: https://lwn.net/Articles/311630/
5978c2ecf20Sopenharmony_ci - Una coppia di articoli di David Drysdale che descrivono i dettagli del
5988c2ecf20Sopenharmony_ci   percorso implementativo di una chiamata di sistema per la versione v3.14:
5998c2ecf20Sopenharmony_ci
6008c2ecf20Sopenharmony_ci    - https://lwn.net/Articles/604287/
6018c2ecf20Sopenharmony_ci    - https://lwn.net/Articles/604515/
6028c2ecf20Sopenharmony_ci
6038c2ecf20Sopenharmony_ci - Requisiti specifici alle architetture sono discussi nella pagina man
6048c2ecf20Sopenharmony_ci   :manpage:`syscall(2)` :
6058c2ecf20Sopenharmony_ci   http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES
6068c2ecf20Sopenharmony_ci - Collezione di email di Linux Torvalds sui problemi relativi a ``ioctl()``:
6078c2ecf20Sopenharmony_ci   http://yarchive.net/comp/linux/ioctl.html
6088c2ecf20Sopenharmony_ci - "Come non inventare interfacce del kernel", Arnd Bergmann,
6098c2ecf20Sopenharmony_ci   http://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf
6108c2ecf20Sopenharmony_ci - Articolo di Michael Kerris su LWN sull'evitare nuovi usi di CAP_SYS_ADMIN:
6118c2ecf20Sopenharmony_ci   https://lwn.net/Articles/486306/
6128c2ecf20Sopenharmony_ci - Raccomandazioni da Andrew Morton circa il fatto che tutte le informazioni
6138c2ecf20Sopenharmony_ci   su una nuova chiamata di sistema dovrebbero essere contenute nello stesso
6148c2ecf20Sopenharmony_ci   filone di discussione di email: https://lkml.org/lkml/2014/7/24/641
6158c2ecf20Sopenharmony_ci - Raccomandazioni da Michael Kerrisk circa il fatto che le nuove chiamate di
6168c2ecf20Sopenharmony_ci   sistema dovrebbero avere una pagina man: https://lkml.org/lkml/2014/6/13/309
6178c2ecf20Sopenharmony_ci - Consigli da Thomas Gleixner sul fatto che il collegamento all'architettura
6188c2ecf20Sopenharmony_ci   x86 dovrebbe avvenire in un *commit* differente:
6198c2ecf20Sopenharmony_ci   https://lkml.org/lkml/2014/11/19/254
6208c2ecf20Sopenharmony_ci - Consigli da Greg Kroah-Hartman circa la bontà d'avere una pagina man e un
6218c2ecf20Sopenharmony_ci   programma di auto-verifica per le nuove chiamate di sistema:
6228c2ecf20Sopenharmony_ci   https://lkml.org/lkml/2014/3/19/710
6238c2ecf20Sopenharmony_ci - Discussione di Michael Kerrisk sulle nuove chiamate di sistema contro
6248c2ecf20Sopenharmony_ci   le estensioni :manpage:`prctl(2)`: https://lkml.org/lkml/2014/6/3/411
6258c2ecf20Sopenharmony_ci - Consigli da Ingo Molnar che le chiamate di sistema con più argomenti
6268c2ecf20Sopenharmony_ci   dovrebbero incapsularli in una struttura che includa un argomento
6278c2ecf20Sopenharmony_ci   *size* per garantire l'estensibilità futura:
6288c2ecf20Sopenharmony_ci   https://lkml.org/lkml/2015/7/30/117
6298c2ecf20Sopenharmony_ci - Un certo numero di casi strani emersi dall'uso (riuso) dei flag O_*:
6308c2ecf20Sopenharmony_ci
6318c2ecf20Sopenharmony_ci    - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness
6328c2ecf20Sopenharmony_ci      check")
6338c2ecf20Sopenharmony_ci    - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc
6348c2ecf20Sopenharmony_ci      conflict")
6358c2ecf20Sopenharmony_ci    - commit bb458c644a59 ("Safer ABI for O_TMPFILE")
6368c2ecf20Sopenharmony_ci
6378c2ecf20Sopenharmony_ci - Discussion from Matthew Wilcox about restrictions on 64-bit arguments:
6388c2ecf20Sopenharmony_ci   https://lkml.org/lkml/2008/12/12/187
6398c2ecf20Sopenharmony_ci - Raccomandazioni da Greg Kroah-Hartman sul fatto che i flag sconosciuti dovrebbero
6408c2ecf20Sopenharmony_ci   essere controllati: https://lkml.org/lkml/2014/7/17/577
6418c2ecf20Sopenharmony_ci - Raccomandazioni da Linus Torvalds che le chiamate di sistema x32 dovrebbero
6428c2ecf20Sopenharmony_ci   favorire la compatibilità con le versioni a 64-bit piuttosto che quelle a 32-bit:
6438c2ecf20Sopenharmony_ci   https://lkml.org/lkml/2011/8/31/244
644