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