162306a36Sopenharmony_ci.. include:: ../disclaimer-ita.rst 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci:Original: :ref:`Documentation/process/adding-syscalls.rst <addsyscalls>` 462306a36Sopenharmony_ci:Translator: Federico Vaga <federico.vaga@vaga.pv.it> 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci.. _it_addsyscalls: 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciAggiungere una nuova chiamata di sistema 962306a36Sopenharmony_ci======================================== 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ciQuesto documento descrive quello che è necessario sapere per aggiungere 1262306a36Sopenharmony_cinuove chiamate di sistema al kernel Linux; questo è da considerarsi come 1362306a36Sopenharmony_ciun'aggiunta ai soliti consigli su come proporre nuove modifiche 1462306a36Sopenharmony_ci:ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`. 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ciAlternative alle chiamate di sistema 1862306a36Sopenharmony_ci------------------------------------ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ciLa prima considerazione da fare quando si aggiunge una nuova chiamata di 2162306a36Sopenharmony_cisistema è quella di valutare le alternative. Nonostante le chiamate di sistema 2262306a36Sopenharmony_cisiano il punto di interazione fra spazio utente e kernel più tradizionale ed 2362306a36Sopenharmony_ciovvio, esistono altre possibilità - scegliete quella che meglio si adatta alle 2462306a36Sopenharmony_civostra interfaccia. 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci - Se le operazioni coinvolte possono rassomigliare a quelle di un filesystem, 2762306a36Sopenharmony_ci allora potrebbe avere molto più senso la creazione di un nuovo filesystem o 2862306a36Sopenharmony_ci dispositivo. Inoltre, questo rende più facile incapsulare la nuova 2962306a36Sopenharmony_ci funzionalità in un modulo kernel piuttosto che essere sviluppata nel cuore 3062306a36Sopenharmony_ci del kernel. 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci - Se la nuova funzionalità prevede operazioni dove il kernel notifica 3362306a36Sopenharmony_ci lo spazio utente su un avvenimento, allora restituire un descrittore 3462306a36Sopenharmony_ci di file all'oggetto corrispondente permette allo spazio utente di 3562306a36Sopenharmony_ci utilizzare ``poll``/``select``/``epoll`` per ricevere quelle notifiche. 3662306a36Sopenharmony_ci - Tuttavia, le operazioni che non si sposano bene con operazioni tipo 3762306a36Sopenharmony_ci :manpage:`read(2)`/:manpage:`write(2)` dovrebbero essere implementate 3862306a36Sopenharmony_ci come chiamate :manpage:`ioctl(2)`, il che potrebbe portare ad un'API in 3962306a36Sopenharmony_ci un qualche modo opaca. 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci - Se dovete esporre solo delle informazioni sul sistema, un nuovo nodo in 4262306a36Sopenharmony_ci sysfs (vedere ``Documentation/filesystems/sysfs.rst``) o 4362306a36Sopenharmony_ci in procfs potrebbe essere sufficiente. Tuttavia, l'accesso a questi 4462306a36Sopenharmony_ci meccanismi richiede che il filesystem sia montato, il che potrebbe non 4562306a36Sopenharmony_ci essere sempre vero (per esempio, in ambienti come namespace/sandbox/chroot). 4662306a36Sopenharmony_ci Evitate d'aggiungere nuove API in debugfs perché questo non viene 4762306a36Sopenharmony_ci considerata un'interfaccia di 'produzione' verso lo spazio utente. 4862306a36Sopenharmony_ci - Se l'operazione è specifica ad un particolare file o descrittore, allora 4962306a36Sopenharmony_ci potrebbe essere appropriata l'aggiunta di un comando :manpage:`fcntl(2)`. 5062306a36Sopenharmony_ci Tuttavia, :manpage:`fcntl(2)` è una chiamata di sistema multiplatrice che 5162306a36Sopenharmony_ci nasconde una notevole complessità, quindi è ottima solo quando la nuova 5262306a36Sopenharmony_ci funzione assomiglia a quelle già esistenti in :manpage:`fcntl(2)`, oppure 5362306a36Sopenharmony_ci la nuova funzionalità è veramente semplice (per esempio, leggere/scrivere 5462306a36Sopenharmony_ci un semplice flag associato ad un descrittore di file). 5562306a36Sopenharmony_ci - Se l'operazione è specifica ad un particolare processo, allora 5662306a36Sopenharmony_ci potrebbe essere appropriata l'aggiunta di un comando :manpage:`prctl(2)`. 5762306a36Sopenharmony_ci Come per :manpage:`fcntl(2)`, questa chiamata di sistema è un complesso 5862306a36Sopenharmony_ci multiplatore quindi è meglio usarlo per cose molto simili a quelle esistenti 5962306a36Sopenharmony_ci nel comando ``prctl`` oppure per leggere/scrivere un semplice flag relativo 6062306a36Sopenharmony_ci al processo. 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciProgettare l'API: pianificare le estensioni 6462306a36Sopenharmony_ci------------------------------------------- 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ciUna nuova chiamata di sistema diventerà parte dell'API del kernel, e 6762306a36Sopenharmony_cidev'essere supportata per un periodo indefinito. Per questo, è davvero 6862306a36Sopenharmony_ciun'ottima idea quella di discutere apertamente l'interfaccia sulla lista 6962306a36Sopenharmony_cidi discussione del kernel, ed è altrettanto importante pianificarne eventuali 7062306a36Sopenharmony_ciestensioni future. 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci(Nella tabella delle chiamate di sistema sono disseminati esempi dove questo 7362306a36Sopenharmony_cinon fu fatto, assieme ai corrispondenti aggiornamenti - 7462306a36Sopenharmony_ci``eventfd``/``eventfd2``, ``dup2``/``dup3``, ``inotify_init``/``inotify_init1``, 7562306a36Sopenharmony_ci``pipe``/``pipe2``, ``renameat``/``renameat2`` --quindi imparate dalla storia 7662306a36Sopenharmony_cidel kernel e pianificate le estensioni fin dall'inizio) 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ciPer semplici chiamate di sistema che accettano solo un paio di argomenti, 7962306a36Sopenharmony_ciil modo migliore di permettere l'estensibilità è quello di includere un 8062306a36Sopenharmony_ciargomento *flags* alla chiamata di sistema. Per assicurarsi che i programmi 8162306a36Sopenharmony_cidello spazio utente possano usare in sicurezza *flags* con diverse versioni 8262306a36Sopenharmony_cidel kernel, verificate se *flags* contiene un qualsiasi valore sconosciuto, 8362306a36Sopenharmony_ciin qual caso rifiutate la chiamata di sistema (con ``EINVAL``):: 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci if (flags & ~(THING_FLAG1 | THING_FLAG2 | THING_FLAG3)) 8662306a36Sopenharmony_ci return -EINVAL; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci(Se *flags* non viene ancora utilizzato, verificate che l'argomento sia zero) 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ciPer chiamate di sistema più sofisticate che coinvolgono un numero più grande di 9162306a36Sopenharmony_ciargomenti, il modo migliore è quello di incapsularne la maggior parte in una 9262306a36Sopenharmony_cistruttura dati che verrà passata per puntatore. Questa struttura potrà 9362306a36Sopenharmony_cifunzionare con future estensioni includendo un campo *size*:: 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci struct xyzzy_params { 9662306a36Sopenharmony_ci u32 size; /* userspace sets p->size = sizeof(struct xyzzy_params) */ 9762306a36Sopenharmony_ci u32 param_1; 9862306a36Sopenharmony_ci u64 param_2; 9962306a36Sopenharmony_ci u64 param_3; 10062306a36Sopenharmony_ci }; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ciFintanto che un qualsiasi campo nuovo, diciamo ``param_4``, è progettato per 10362306a36Sopenharmony_cioffrire il comportamento precedente quando vale zero, allora questo permetterà 10462306a36Sopenharmony_cidi gestire un conflitto di versione in entrambe le direzioni: 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci - un vecchio kernel può gestire l'accesso di una versione moderna di un 10762306a36Sopenharmony_ci programma in spazio utente verificando che la memoria oltre la dimensione 10862306a36Sopenharmony_ci della struttura dati attesa sia zero (in pratica verificare che 10962306a36Sopenharmony_ci ``param_4 == 0``). 11062306a36Sopenharmony_ci - un nuovo kernel può gestire l'accesso di una versione vecchia di un 11162306a36Sopenharmony_ci programma in spazio utente estendendo la struttura dati con zeri (in pratica 11262306a36Sopenharmony_ci ``param_4 = 0``). 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ciVedere :manpage:`perf_event_open(2)` e la funzione ``perf_copy_attr()`` (in 11562306a36Sopenharmony_ci``kernel/events/core.c``) per un esempio pratico di questo approccio. 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ciProgettare l'API: altre considerazioni 11962306a36Sopenharmony_ci-------------------------------------- 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ciSe la vostra nuova chiamata di sistema permette allo spazio utente di fare 12262306a36Sopenharmony_ciriferimento ad un oggetto del kernel, allora questa dovrebbe usare un 12362306a36Sopenharmony_cidescrittore di file per accesso all'oggetto - non inventatevi nuovi tipi di 12462306a36Sopenharmony_ciaccesso da spazio utente quando il kernel ha già dei meccanismi e una semantica 12562306a36Sopenharmony_ciben definita per utilizzare i descrittori di file. 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ritorna un nuovo 12862306a36Sopenharmony_cidescrittore di file, allora l'argomento *flags* dovrebbe includere un valore 12962306a36Sopenharmony_ciequivalente a ``O_CLOEXEC`` per i nuovi descrittori. Questo rende possibile, 13062306a36Sopenharmony_cinello spazio utente, la chiusura della finestra temporale fra le chiamate a 13162306a36Sopenharmony_ci``xyzzy()`` e ``fcntl(fd, F_SETFD, FD_CLOEXEC)``, dove un inaspettato 13262306a36Sopenharmony_ci``fork()`` o ``execve()`` potrebbe trasferire il descrittore al programma 13362306a36Sopenharmony_cieseguito (Comunque, resistete alla tentazione di riutilizzare il valore di 13462306a36Sopenharmony_ci``O_CLOEXEC`` dato che è specifico dell'architettura e fa parte di una 13562306a36Sopenharmony_cienumerazione di flag ``O_*`` che è abbastanza ricca). 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ciSe la vostra nuova chiamata di sistema ritorna un nuovo descrittore di file, 13862306a36Sopenharmony_cidovreste considerare che significato avrà l'uso delle chiamate di sistema 13962306a36Sopenharmony_cidella famiglia di :manpage:`poll(2)`. Rendere un descrittore di file pronto 14062306a36Sopenharmony_ciper la lettura o la scrittura è il tipico modo del kernel per notificare lo 14162306a36Sopenharmony_cispazio utente circa un evento associato all'oggetto del kernel. 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ha un argomento 14462306a36Sopenharmony_ciche è il percorso ad un file:: 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci int sys_xyzzy(const char __user *path, ..., unsigned int flags); 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cidovreste anche considerare se non sia più appropriata una versione 14962306a36Sopenharmony_ci:manpage:`xyzzyat(2)`:: 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci int sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags); 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ciQuesto permette più flessibilità su come lo spazio utente specificherà il file 15462306a36Sopenharmony_ciin questione; in particolare, permette allo spazio utente di richiedere la 15562306a36Sopenharmony_cifunzionalità su un descrittore di file già aperto utilizzando il *flag* 15662306a36Sopenharmony_ci``AT_EMPTY_PATH``, in pratica otterremmo gratuitamente l'operazione 15762306a36Sopenharmony_ci:manpage:`fxyzzy(3)`:: 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci - xyzzyat(AT_FDCWD, path, ..., 0) is equivalent to xyzzy(path,...) 16062306a36Sopenharmony_ci - xyzzyat(fd, "", ..., AT_EMPTY_PATH) is equivalent to fxyzzy(fd, ...) 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci(Per maggiori dettagli sulla logica delle chiamate \*at(), leggete la pagina 16362306a36Sopenharmony_ciman :manpage:`openat(2)`; per un esempio di AT_EMPTY_PATH, leggere la pagina 16462306a36Sopenharmony_ciman :manpage:`fstatat(2)`). 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede un parametro 16762306a36Sopenharmony_ciper descrivere uno scostamento all'interno di un file, usate ``loff_t`` come 16862306a36Sopenharmony_citipo cosicché scostamenti a 64-bit potranno essere supportati anche su 16962306a36Sopenharmony_ciarchitetture a 32-bit. 17062306a36Sopenharmony_ci 17162306a36Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede l'uso di 17262306a36Sopenharmony_cifunzioni riservate, allora dev'essere gestita da un opportuno bit di privilegio 17362306a36Sopenharmony_ci(verificato con una chiamata a ``capable()``), come descritto nella pagina man 17462306a36Sopenharmony_ci:manpage:`capabilities(7)`. Scegliete un bit di privilegio già esistente per 17562306a36Sopenharmony_cigestire la funzionalità associata, ma evitate la combinazione di diverse 17662306a36Sopenharmony_cifunzionalità vagamente collegate dietro lo stesso bit, in quanto va contro il 17762306a36Sopenharmony_ciprincipio di *capabilities* di separare i poteri di root. In particolare, 17862306a36Sopenharmony_cievitate di aggiungere nuovi usi al fin-troppo-generico privilegio 17962306a36Sopenharmony_ci``CAP_SYS_ADMIN``. 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ciSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` manipola altri 18262306a36Sopenharmony_ciprocessi oltre a quello chiamato, allora dovrebbe essere limitata (usando 18362306a36Sopenharmony_cila chiamata ``ptrace_may_access()``) di modo che solo un processo chiamante 18462306a36Sopenharmony_cicon gli stessi permessi del processo in oggetto, o con i necessari privilegi, 18562306a36Sopenharmony_cipossa manipolarlo. 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ciInfine, state attenti che in alcune architetture non-x86 la vita delle chiamate 18862306a36Sopenharmony_cidi sistema con argomenti a 64-bit viene semplificata se questi argomenti 18962306a36Sopenharmony_ciricadono in posizioni dispari (pratica, i parametri 1, 3, 5); questo permette 19062306a36Sopenharmony_cil'uso di coppie contigue di registri a 32-bit. (Questo non conta se gli 19162306a36Sopenharmony_ciargomenti sono parte di una struttura dati che viene passata per puntatore). 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ciProporre l'API 19562306a36Sopenharmony_ci-------------- 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ciAl fine di rendere le nuove chiamate di sistema di facile revisione, è meglio 19862306a36Sopenharmony_ciche dividiate le modifiche i pezzi separati. Questi dovrebbero includere 19962306a36Sopenharmony_cialmeno le seguenti voci in *commit* distinti (ognuno dei quali sarà descritto 20062306a36Sopenharmony_cipiù avanti): 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci - l'essenza dell'implementazione della chiamata di sistema, con i prototipi, 20362306a36Sopenharmony_ci i numeri generici, le modifiche al Kconfig e l'implementazione *stub* di 20462306a36Sopenharmony_ci ripiego. 20562306a36Sopenharmony_ci - preparare la nuova chiamata di sistema per un'architettura specifica, 20662306a36Sopenharmony_ci solitamente x86 (ovvero tutti: x86_64, x86_32 e x32). 20762306a36Sopenharmony_ci - un programma di auto-verifica da mettere in ``tools/testing/selftests/`` 20862306a36Sopenharmony_ci che mostri l'uso della chiamata di sistema. 20962306a36Sopenharmony_ci - una bozza di pagina man per la nuova chiamata di sistema. Può essere 21062306a36Sopenharmony_ci scritta nell'email di presentazione, oppure come modifica vera e propria 21162306a36Sopenharmony_ci al repositorio delle pagine man. 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ciLe proposte di nuove chiamate di sistema, come ogni altro modifica all'API del 21462306a36Sopenharmony_cikernel, deve essere sottomessa alla lista di discussione 21562306a36Sopenharmony_cilinux-api@vger.kernel.org. 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ciImplementazione di chiamate di sistema generiche 21962306a36Sopenharmony_ci------------------------------------------------ 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ciIl principale punto d'accesso alla vostra nuova chiamata di sistema 22262306a36Sopenharmony_ci:manpage:`xyzzy(2)` verrà chiamato ``sys_xyzzy()``; ma, piuttosto che in modo 22362306a36Sopenharmony_ciesplicito, lo aggiungerete tramite la macro ``SYSCALL_DEFINEn``. La 'n' 22462306a36Sopenharmony_ciindica il numero di argomenti della chiamata di sistema; la macro ha come 22562306a36Sopenharmony_ciargomento il nome della chiamata di sistema, seguito dalle coppie (tipo, nome) 22662306a36Sopenharmony_ciper definire i suoi parametri. L'uso di questa macro permette di avere 22762306a36Sopenharmony_cii metadati della nuova chiamata di sistema disponibili anche per altri 22862306a36Sopenharmony_cistrumenti. 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ciIl nuovo punto d'accesso necessita anche del suo prototipo di funzione in 23162306a36Sopenharmony_ci``include/linux/syscalls.h``, marcato come asmlinkage di modo da abbinargli 23262306a36Sopenharmony_ciil modo in cui quelle chiamate di sistema verranno invocate:: 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci asmlinkage long sys_xyzzy(...); 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ciAlcune architetture (per esempio x86) hanno le loro specifiche tabelle di 23762306a36Sopenharmony_cichiamate di sistema (syscall), ma molte altre architetture condividono una 23862306a36Sopenharmony_citabella comune di syscall. Aggiungete alla lista generica la vostra nuova 23962306a36Sopenharmony_cichiamata di sistema aggiungendo un nuovo elemento alla lista in 24062306a36Sopenharmony_ci``include/uapi/asm-generic/unistd.h``:: 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci #define __NR_xyzzy 292 24362306a36Sopenharmony_ci __SYSCALL(__NR_xyzzy, sys_xyzzy) 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ciAggiornate anche il contatore __NR_syscalls di modo che sia coerente con 24662306a36Sopenharmony_cil'aggiunta della nuove chiamate di sistema; va notato che se più di una nuova 24762306a36Sopenharmony_cichiamata di sistema viene aggiunga nella stessa finestra di sviluppo, il numero 24862306a36Sopenharmony_cidella vostra nuova syscall potrebbe essere aggiustato al fine di risolvere i 24962306a36Sopenharmony_ciconflitti. 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ciIl file ``kernel/sys_ni.c`` fornisce le implementazioni *stub* di ripiego che 25262306a36Sopenharmony_ciritornano ``-ENOSYS``. Aggiungete la vostra nuova chiamata di sistema anche 25362306a36Sopenharmony_ciqui:: 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci COND_SYSCALL(xyzzy); 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ciLa vostra nuova funzionalità del kernel, e la chiamata di sistema che la 25862306a36Sopenharmony_cicontrolla, dovrebbero essere opzionali. Quindi, aggiungete un'opzione 25962306a36Sopenharmony_ci``CONFIG`` (solitamente in ``init/Kconfig``). Come al solito per le nuove 26062306a36Sopenharmony_ciopzioni ``CONFIG``: 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci - Includete una descrizione della nuova funzionalità e della chiamata di 26362306a36Sopenharmony_ci sistema che la controlla. 26462306a36Sopenharmony_ci - Rendete l'opzione dipendente da EXPERT se dev'essere nascosta agli utenti 26562306a36Sopenharmony_ci normali. 26662306a36Sopenharmony_ci - Nel Makefile, rendere tutti i nuovi file sorgenti, che implementano la 26762306a36Sopenharmony_ci nuova funzionalità, dipendenti dall'opzione CONFIG (per esempio 26862306a36Sopenharmony_ci ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``). 26962306a36Sopenharmony_ci - Controllate due volte che sia possibile generare il kernel con la nuova 27062306a36Sopenharmony_ci opzione CONFIG disabilitata. 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ciPer riassumere, vi serve un *commit* che includa: 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci - un'opzione ``CONFIG``per la nuova funzione, normalmente in ``init/Kconfig`` 27562306a36Sopenharmony_ci - ``SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso 27662306a36Sopenharmony_ci - il corrispondente prototipo in ``include/linux/syscalls.h`` 27762306a36Sopenharmony_ci - un elemento nella tabella generica in ``include/uapi/asm-generic/unistd.h`` 27862306a36Sopenharmony_ci - *stub* di ripiego in ``kernel/sys_ni.c`` 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ciImplementazione delle chiamate di sistema x86 28262306a36Sopenharmony_ci--------------------------------------------- 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ciPer collegare la vostra nuova chiamate di sistema alle piattaforme x86, 28562306a36Sopenharmony_cidovete aggiornate la tabella principale di syscall. Assumendo che la vostra 28662306a36Sopenharmony_cinuova chiamata di sistema non sia particolarmente speciale (vedere sotto), 28762306a36Sopenharmony_cidovete aggiungere un elemento *common* (per x86_64 e x32) in 28862306a36Sopenharmony_ciarch/x86/entry/syscalls/syscall_64.tbl:: 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci 333 common xyzzy sys_xyzzy 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cie un elemento per *i386* ``arch/x86/entry/syscalls/syscall_32.tbl``:: 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci 380 i386 xyzzy sys_xyzzy 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ciAncora una volta, questi numeri potrebbero essere cambiati se generano 29762306a36Sopenharmony_ciconflitti durante la finestra di integrazione. 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ciChiamate di sistema compatibili (generico) 30162306a36Sopenharmony_ci------------------------------------------ 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ciPer molte chiamate di sistema, la stessa implementazione a 64-bit può essere 30462306a36Sopenharmony_ciinvocata anche quando il programma in spazio utente è a 32-bit; anche se la 30562306a36Sopenharmony_cichiamata di sistema include esplicitamente un puntatore, questo viene gestito 30662306a36Sopenharmony_ciin modo trasparente. 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_ciTuttavia, ci sono un paio di situazione dove diventa necessario avere un 30962306a36Sopenharmony_cilivello di gestione della compatibilità per risolvere le differenze di 31062306a36Sopenharmony_cidimensioni fra 32-bit e 64-bit. 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_ciIl primo caso è quando un kernel a 64-bit supporta anche programmi in spazio 31362306a36Sopenharmony_ciutente a 32-bit, perciò dovrà ispezionare aree della memoria (``__user``) che 31462306a36Sopenharmony_cipotrebbero contenere valori a 32-bit o a 64-bit. In particolar modo, questo 31562306a36Sopenharmony_ciè necessario quando un argomento di una chiamata di sistema è: 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci - un puntatore ad un puntatore 31862306a36Sopenharmony_ci - un puntatore ad una struttura dati contenente a sua volta un puntatore 31962306a36Sopenharmony_ci ( ad esempio ``struct iovec __user *``) 32062306a36Sopenharmony_ci - un puntatore ad un tipo intero di dimensione variabile (``time_t``, 32162306a36Sopenharmony_ci ``off_t``, ``long``, ...) 32262306a36Sopenharmony_ci - un puntatore ad una struttura dati contenente un tipo intero di dimensione 32362306a36Sopenharmony_ci variabile. 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ciIl secondo caso che richiede un livello di gestione della compatibilità è 32662306a36Sopenharmony_ciquando uno degli argomenti di una chiamata a sistema è esplicitamente un tipo 32762306a36Sopenharmony_cia 64-bit anche su architetture a 32-bit, per esempio ``loff_t`` o ``__u64``. 32862306a36Sopenharmony_ciIn questo caso, un valore che arriva ad un kernel a 64-bit da un'applicazione 32962306a36Sopenharmony_cia 32-bit verrà diviso in due valori a 32-bit che dovranno essere riassemblati 33062306a36Sopenharmony_ciin questo livello di compatibilità. 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci(Da notare che non serve questo livello di compatibilità per argomenti che 33362306a36Sopenharmony_cisono puntatori ad un tipo esplicitamente a 64-bit; per esempio, in 33462306a36Sopenharmony_ci:manpage:`splice(2)` l'argomento di tipo ``loff_t __user *`` non necessita 33562306a36Sopenharmony_cidi una chiamata di sistema ``compat_``) 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ciLa versione compatibile della nostra chiamata di sistema si chiamerà 33862306a36Sopenharmony_ci``compat_sys_xyzzy()``, e viene aggiunta utilizzando la macro 33962306a36Sopenharmony_ci``COMPAT_SYSCALL_DEFINEn()`` (simile a SYSCALL_DEFINEn). Questa versione 34062306a36Sopenharmony_cidell'implementazione è parte del kernel a 64-bit ma accetta parametri a 32-bit 34162306a36Sopenharmony_ciche trasformerà secondo le necessità (tipicamente, la versione 34262306a36Sopenharmony_ci``compat_sys_`` converte questi valori nello loro corrispondente a 64-bit e 34362306a36Sopenharmony_cipuò chiamare la versione ``sys_`` oppure invocare una funzione che implementa 34462306a36Sopenharmony_cile parti comuni). 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_ciIl punto d'accesso *compat* deve avere il corrispondente prototipo di funzione 34762306a36Sopenharmony_ciin ``include/linux/compat.h``, marcato come asmlinkage di modo da abbinargli 34862306a36Sopenharmony_ciil modo in cui quelle chiamate di sistema verranno invocate:: 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci asmlinkage long compat_sys_xyzzy(...); 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ciSe la chiamata di sistema prevede una struttura dati organizzata in modo 35362306a36Sopenharmony_cidiverso per sistemi a 32-bit e per quelli a 64-bit, diciamo 35462306a36Sopenharmony_ci``struct xyzzy_args``, allora il file d'intestazione 35562306a36Sopenharmony_ci``then the include/linux/compat.h`` deve includere la sua versione 35662306a36Sopenharmony_ci*compatibile* (``struct compat_xyzzy_args``); ogni variabile con 35762306a36Sopenharmony_cidimensione variabile deve avere il proprio tipo ``compat_`` corrispondente 35862306a36Sopenharmony_cia quello in ``struct xyzzy_args``. La funzione ``compat_sys_xyzzy()`` 35962306a36Sopenharmony_cipuò usare la struttura ``compat_`` per analizzare gli argomenti ricevuti 36062306a36Sopenharmony_cida una chiamata a 32-bit. 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ciPer esempio, se avete i seguenti campi:: 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci struct xyzzy_args { 36562306a36Sopenharmony_ci const char __user *ptr; 36662306a36Sopenharmony_ci __kernel_long_t varying_val; 36762306a36Sopenharmony_ci u64 fixed_val; 36862306a36Sopenharmony_ci /* ... */ 36962306a36Sopenharmony_ci }; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cinella struttura ``struct xyzzy_args``, allora la struttura 37262306a36Sopenharmony_ci``struct compat_xyzzy_args`` dovrebbe avere:: 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci struct compat_xyzzy_args { 37562306a36Sopenharmony_ci compat_uptr_t ptr; 37662306a36Sopenharmony_ci compat_long_t varying_val; 37762306a36Sopenharmony_ci u64 fixed_val; 37862306a36Sopenharmony_ci /* ... */ 37962306a36Sopenharmony_ci }; 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ciLa lista generica delle chiamate di sistema ha bisogno di essere 38262306a36Sopenharmony_ciaggiustata al fine di permettere l'uso della versione *compatibile*; 38362306a36Sopenharmony_cila voce in ``include/uapi/asm-generic/unistd.h`` dovrebbero usare 38462306a36Sopenharmony_ci``__SC_COMP`` piuttosto di ``__SYSCALL``:: 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci #define __NR_xyzzy 292 38762306a36Sopenharmony_ci __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy) 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ciRiassumendo, vi serve: 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci - un ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso 39262306a36Sopenharmony_ci *compatibile* 39362306a36Sopenharmony_ci - un prototipo in ``include/linux/compat.h`` 39462306a36Sopenharmony_ci - (se necessario) una struttura di compatibilità a 32-bit in 39562306a36Sopenharmony_ci ``include/linux/compat.h`` 39662306a36Sopenharmony_ci - una voce ``__SC_COMP``, e non ``__SYSCALL``, in 39762306a36Sopenharmony_ci ``include/uapi/asm-generic/unistd.h`` 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ciCompatibilità delle chiamate di sistema (x86) 40062306a36Sopenharmony_ci--------------------------------------------- 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ciPer collegare una chiamata di sistema, su un'architettura x86, con la sua 40362306a36Sopenharmony_civersione *compatibile*, è necessario aggiustare la voce nella tabella 40462306a36Sopenharmony_cidelle syscall. 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ciPer prima cosa, la voce in ``arch/x86/entry/syscalls/syscall_32.tbl`` prende 40762306a36Sopenharmony_ciun argomento aggiuntivo per indicare che un programma in spazio utente 40862306a36Sopenharmony_cia 32-bit, eseguito su un kernel a 64-bit, dovrebbe accedere tramite il punto 40962306a36Sopenharmony_cid'accesso compatibile:: 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci 380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzy 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ciSecondo, dovete capire cosa dovrebbe succedere alla nuova chiamata di sistema 41462306a36Sopenharmony_ciper la versione dell'ABI x32. Qui C'è una scelta da fare: gli argomenti 41562306a36Sopenharmony_cipossono corrisponde alla versione a 64-bit o a quella a 32-bit. 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ciSe c'è un puntatore ad un puntatore, la decisione è semplice: x32 è ILP32, 41862306a36Sopenharmony_ciquindi gli argomenti dovrebbero corrispondere a quelli a 32-bit, e la voce in 41962306a36Sopenharmony_ci``arch/x86/entry/syscalls/syscall_64.tbl`` sarà divisa cosicché i programmi 42062306a36Sopenharmony_cix32 eseguano la chiamata *compatibile*:: 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci 333 64 xyzzy sys_xyzzy 42362306a36Sopenharmony_ci ... 42462306a36Sopenharmony_ci 555 x32 xyzzy __x32_compat_sys_xyzzy 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ciSe non ci sono puntatori, allora è preferibile riutilizzare la chiamata di 42762306a36Sopenharmony_cisistema a 64-bit per l'ABI x32 (e di conseguenza la voce in 42862306a36Sopenharmony_ciarch/x86/entry/syscalls/syscall_64.tbl rimane immutata). 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ciIn ambo i casi, dovreste verificare che i tipi usati dagli argomenti 43162306a36Sopenharmony_ciabbiano un'esatta corrispondenza da x32 (-mx32) al loro equivalente a 43262306a36Sopenharmony_ci32-bit (-m32) o 64-bit (-m64). 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ciChiamate di sistema che ritornano altrove 43662306a36Sopenharmony_ci----------------------------------------- 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ciNella maggior parte delle chiamate di sistema, al termine della loro 43962306a36Sopenharmony_ciesecuzione, i programmi in spazio utente riprendono esattamente dal punto 44062306a36Sopenharmony_ciin cui si erano interrotti -- quindi dall'istruzione successiva, con lo 44162306a36Sopenharmony_cistesso *stack* e con la maggior parte del registri com'erano stati 44262306a36Sopenharmony_cilasciati prima della chiamata di sistema, e anche con la stessa memoria 44362306a36Sopenharmony_civirtuale. 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ciTuttavia, alcune chiamata di sistema fanno le cose in modo differente. 44662306a36Sopenharmony_ciPotrebbero ritornare ad un punto diverso (``rt_sigreturn``) o cambiare 44762306a36Sopenharmony_cila memoria in spazio utente (``fork``/``vfork``/``clone``) o perfino 44862306a36Sopenharmony_cil'architettura del programma (``execve``/``execveat``). 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ciPer permettere tutto ciò, l'implementazione nel kernel di questo tipo di 45162306a36Sopenharmony_cichiamate di sistema potrebbero dover salvare e ripristinare registri 45262306a36Sopenharmony_ciaggiuntivi nello *stack* del kernel, permettendo così un controllo completo 45362306a36Sopenharmony_cisu dove e come l'esecuzione dovrà continuare dopo l'esecuzione della 45462306a36Sopenharmony_cichiamata di sistema. 45562306a36Sopenharmony_ci 45662306a36Sopenharmony_ciQueste saranno specifiche per ogni architettura, ma tipicamente si definiscono 45762306a36Sopenharmony_cidei punti d'accesso in *assembly* per salvare/ripristinare i registri 45862306a36Sopenharmony_ciaggiuntivi e quindi chiamare il vero punto d'accesso per la chiamata di 45962306a36Sopenharmony_cisistema. 46062306a36Sopenharmony_ci 46162306a36Sopenharmony_ciPer l'architettura x86_64, questo è implementato come un punto d'accesso 46262306a36Sopenharmony_ci``stub_xyzzy`` in ``arch/x86/entry/entry_64.S``, e la voce nella tabella 46362306a36Sopenharmony_cidi syscall (``arch/x86/entry/syscalls/syscall_64.tbl``) verrà corretta di 46462306a36Sopenharmony_ciconseguenza:: 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci 333 common xyzzy stub_xyzzy 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ciL'equivalente per programmi a 32-bit eseguiti su un kernel a 64-bit viene 46962306a36Sopenharmony_cinormalmente chiamato ``stub32_xyzzy`` e implementato in 47062306a36Sopenharmony_ci``arch/x86/entry/entry_64_compat.S`` con la corrispondente voce nella tabella 47162306a36Sopenharmony_cidi syscall ``arch/x86/entry/syscalls/syscall_32.tbl`` corretta nel 47262306a36Sopenharmony_ciseguente modo:: 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci 380 i386 xyzzy sys_xyzzy stub32_xyzzy 47562306a36Sopenharmony_ci 47662306a36Sopenharmony_ciSe una chiamata di sistema necessita di un livello di compatibilità (come 47762306a36Sopenharmony_cinella sezione precedente), allora la versione ``stub32_`` deve invocare 47862306a36Sopenharmony_cila versione ``compat_sys_`` piuttosto che quella nativa a 64-bit. In aggiunta, 47962306a36Sopenharmony_cise l'implementazione dell'ABI x32 è diversa da quella x86_64, allora la sua 48062306a36Sopenharmony_civoce nella tabella di syscall dovrà chiamare uno *stub* che invoca la versione 48162306a36Sopenharmony_ci``compat_sys_``, 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ciPer completezza, sarebbe carino impostare una mappatura cosicché 48462306a36Sopenharmony_ci*user-mode* Linux (UML) continui a funzionare -- la sua tabella di syscall 48562306a36Sopenharmony_cifarà riferimento a stub_xyzzy, ma UML non include l'implementazione 48662306a36Sopenharmony_ciin ``arch/x86/entry/entry_64.S`` (perché UML simula i registri eccetera). 48762306a36Sopenharmony_ciCorreggerlo è semplice, basta aggiungere una #define in 48862306a36Sopenharmony_ci``arch/x86/um/sys_call_table_64.c``:: 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci #define stub_xyzzy sys_xyzzy 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ciAltri dettagli 49462306a36Sopenharmony_ci-------------- 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ciLa maggior parte dei kernel tratta le chiamate di sistema allo stesso modo, 49762306a36Sopenharmony_cima possono esserci rare eccezioni per le quali potrebbe essere necessario 49862306a36Sopenharmony_cil'aggiornamento della vostra chiamata di sistema. 49962306a36Sopenharmony_ci 50062306a36Sopenharmony_ciIl sotto-sistema di controllo (*audit subsystem*) è uno di questi casi 50162306a36Sopenharmony_cispeciali; esso include (per architettura) funzioni che classificano alcuni 50262306a36Sopenharmony_citipi di chiamate di sistema -- in particolare apertura dei file 50362306a36Sopenharmony_ci(``open``/``openat``), esecuzione dei programmi (``execve``/``exeveat``) 50462306a36Sopenharmony_cioppure multiplatori di socket (``socketcall``). Se la vostra nuova chiamata 50562306a36Sopenharmony_cidi sistema è simile ad una di queste, allora il sistema di controllo dovrebbe 50662306a36Sopenharmony_ciessere aggiornato. 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ciPiù in generale, se esiste una chiamata di sistema che è simile alla vostra, 50962306a36Sopenharmony_civale la pena fare una ricerca con ``grep`` su tutto il kernel per la chiamata 51062306a36Sopenharmony_cidi sistema esistente per verificare che non ci siano altri casi speciali. 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ciVerifica 51462306a36Sopenharmony_ci-------- 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ciUna nuova chiamata di sistema dev'essere, ovviamente, provata; è utile fornire 51762306a36Sopenharmony_ciai revisori un programma in spazio utente che mostri l'uso della chiamata di 51862306a36Sopenharmony_cisistema. Un buon modo per combinare queste cose è quello di aggiungere un 51962306a36Sopenharmony_cisemplice programma di auto-verifica in una nuova cartella in 52062306a36Sopenharmony_ci``tools/testing/selftests/``. 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ciPer una nuova chiamata di sistema, ovviamente, non ci sarà alcuna funzione 52362306a36Sopenharmony_ciin libc e quindi il programma di verifica dovrà invocarla usando ``syscall()``; 52462306a36Sopenharmony_ciinoltre, se la nuova chiamata di sistema prevede un nuova struttura dati 52562306a36Sopenharmony_civisibile in spazio utente, il file d'intestazione necessario dev'essere 52662306a36Sopenharmony_ciinstallato al fine di compilare il programma. 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ciAssicuratevi che il programma di auto-verifica possa essere eseguito 52962306a36Sopenharmony_cicorrettamente su tutte le architetture supportate. Per esempio, verificate che 53062306a36Sopenharmony_cifunzioni quando viene compilato per x86_64 (-m64), x86_32 (-m32) e x32 (-mx32). 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_ciAl fine di una più meticolosa ed estesa verifica della nuova funzionalità, 53362306a36Sopenharmony_cidovreste considerare l'aggiunta di nuove verifica al progetto 'Linux Test', 53462306a36Sopenharmony_cioppure al progetto xfstests per cambiamenti relativi al filesystem. 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci - https://linux-test-project.github.io/ 53762306a36Sopenharmony_ci - git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ciPagine man 54162306a36Sopenharmony_ci---------- 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ciTutte le nuove chiamate di sistema dovrebbero avere una pagina man completa, 54462306a36Sopenharmony_ciidealmente usando i marcatori groff, ma anche il puro testo può andare. Se 54562306a36Sopenharmony_cistate usando groff, è utile che includiate nella email di presentazione una 54662306a36Sopenharmony_civersione già convertita in formato ASCII: semplificherà la vita dei revisori. 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_ciLe pagine man dovrebbero essere in copia-conoscenza verso 54962306a36Sopenharmony_cilinux-man@vger.kernel.org 55062306a36Sopenharmony_ciPer maggiori dettagli, leggere 55162306a36Sopenharmony_cihttps://www.kernel.org/doc/man-pages/patches.html 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ciNon invocate chiamate di sistema dal kernel 55562306a36Sopenharmony_ci------------------------------------------- 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ciLe chiamate di sistema sono, come già detto prima, punti di interazione fra 55862306a36Sopenharmony_cilo spazio utente e il kernel. Perciò, le chiamate di sistema come 55962306a36Sopenharmony_ci``sys_xyzzy()`` o ``compat_sys_xyzzy()`` dovrebbero essere chiamate solo dallo 56062306a36Sopenharmony_cispazio utente attraverso la tabella syscall, ma non da nessun altro punto nel 56162306a36Sopenharmony_cikernel. Se la nuova funzionalità è utile all'interno del kernel, per esempio 56262306a36Sopenharmony_cidev'essere condivisa fra una vecchia e una nuova chiamata di sistema o 56362306a36Sopenharmony_cidev'essere utilizzata da una chiamata di sistema e la sua variante compatibile, 56462306a36Sopenharmony_ciallora dev'essere implementata come una funzione di supporto 56562306a36Sopenharmony_ci(*helper function*) (per esempio ``ksys_xyzzy()``). Questa funzione potrà 56662306a36Sopenharmony_ciessere chiamata dallo *stub* (``sys_xyzzy()``), dalla variante compatibile 56762306a36Sopenharmony_ci(``compat_sys_xyzzy()``), e/o da altri parti del kernel. 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ciSui sistemi x86 a 64-bit, a partire dalla versione v4.17 è un requisito 57062306a36Sopenharmony_cifondamentale quello di non invocare chiamate di sistema all'interno del kernel. 57162306a36Sopenharmony_ciEsso usa una diversa convenzione per l'invocazione di chiamate di sistema dove 57262306a36Sopenharmony_ci``struct pt_regs`` viene decodificata al volo in una funzione che racchiude 57362306a36Sopenharmony_cila chiamata di sistema la quale verrà eseguita successivamente. 57462306a36Sopenharmony_ciQuesto significa che verranno passati solo i parametri che sono davvero 57562306a36Sopenharmony_cinecessari ad una specifica chiamata di sistema, invece che riempire ogni volta 57662306a36Sopenharmony_ci6 registri del processore con contenuti presi dallo spazio utente (potrebbe 57762306a36Sopenharmony_cicausare seri problemi nella sequenza di chiamate). 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ciInoltre, le regole su come i dati possano essere usati potrebbero differire 58062306a36Sopenharmony_cifra il kernel e l'utente. Questo è un altro motivo per cui invocare 58162306a36Sopenharmony_ci``sys_xyzzy()`` è generalmente una brutta idea. 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ciEccezioni a questa regola vengono accettate solo per funzioni d'architetture 58462306a36Sopenharmony_ciche surclassano quelle generiche, per funzioni d'architettura di compatibilità, 58562306a36Sopenharmony_cio per altro codice in arch/ 58662306a36Sopenharmony_ci 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ciRiferimenti e fonti 58962306a36Sopenharmony_ci------------------- 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci - Articolo di Michael Kerris su LWN sull'uso dell'argomento flags nelle 59262306a36Sopenharmony_ci chiamate di sistema: https://lwn.net/Articles/585415/ 59362306a36Sopenharmony_ci - Articolo di Michael Kerris su LWN su come gestire flag sconosciuti in 59462306a36Sopenharmony_ci una chiamata di sistema: https://lwn.net/Articles/588444/ 59562306a36Sopenharmony_ci - Articolo di Jake Edge su LWN che descrive i limiti degli argomenti a 64-bit 59662306a36Sopenharmony_ci delle chiamate di sistema: https://lwn.net/Articles/311630/ 59762306a36Sopenharmony_ci - Una coppia di articoli di David Drysdale che descrivono i dettagli del 59862306a36Sopenharmony_ci percorso implementativo di una chiamata di sistema per la versione v3.14: 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci - https://lwn.net/Articles/604287/ 60162306a36Sopenharmony_ci - https://lwn.net/Articles/604515/ 60262306a36Sopenharmony_ci 60362306a36Sopenharmony_ci - Requisiti specifici alle architetture sono discussi nella pagina man 60462306a36Sopenharmony_ci :manpage:`syscall(2)` : 60562306a36Sopenharmony_ci http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES 60662306a36Sopenharmony_ci - Collezione di email di Linux Torvalds sui problemi relativi a ``ioctl()``: 60762306a36Sopenharmony_ci http://yarchive.net/comp/linux/ioctl.html 60862306a36Sopenharmony_ci - "Come non inventare interfacce del kernel", Arnd Bergmann, 60962306a36Sopenharmony_ci http://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf 61062306a36Sopenharmony_ci - Articolo di Michael Kerris su LWN sull'evitare nuovi usi di CAP_SYS_ADMIN: 61162306a36Sopenharmony_ci https://lwn.net/Articles/486306/ 61262306a36Sopenharmony_ci - Raccomandazioni da Andrew Morton circa il fatto che tutte le informazioni 61362306a36Sopenharmony_ci su una nuova chiamata di sistema dovrebbero essere contenute nello stesso 61462306a36Sopenharmony_ci filone di discussione di email: https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org 61562306a36Sopenharmony_ci - Raccomandazioni da Michael Kerrisk circa il fatto che le nuove chiamate di 61662306a36Sopenharmony_ci sistema dovrebbero avere una pagina man: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com 61762306a36Sopenharmony_ci - Consigli da Thomas Gleixner sul fatto che il collegamento all'architettura 61862306a36Sopenharmony_ci x86 dovrebbe avvenire in un *commit* differente: 61962306a36Sopenharmony_ci https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos 62062306a36Sopenharmony_ci - Consigli da Greg Kroah-Hartman circa la bontà d'avere una pagina man e un 62162306a36Sopenharmony_ci programma di auto-verifica per le nuove chiamate di sistema: 62262306a36Sopenharmony_ci https://lore.kernel.org/r/20140320025530.GA25469@kroah.com 62362306a36Sopenharmony_ci - Discussione di Michael Kerrisk sulle nuove chiamate di sistema contro 62462306a36Sopenharmony_ci le estensioni :manpage:`prctl(2)`: https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com 62562306a36Sopenharmony_ci - Consigli da Ingo Molnar che le chiamate di sistema con più argomenti 62662306a36Sopenharmony_ci dovrebbero incapsularli in una struttura che includa un argomento 62762306a36Sopenharmony_ci *size* per garantire l'estensibilità futura: 62862306a36Sopenharmony_ci https://lore.kernel.org/r/20150730083831.GA22182@gmail.com 62962306a36Sopenharmony_ci - Un certo numero di casi strani emersi dall'uso (riuso) dei flag O_*: 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness 63262306a36Sopenharmony_ci check") 63362306a36Sopenharmony_ci - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc 63462306a36Sopenharmony_ci conflict") 63562306a36Sopenharmony_ci - commit bb458c644a59 ("Safer ABI for O_TMPFILE") 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ci - Discussion from Matthew Wilcox about restrictions on 64-bit arguments: 63862306a36Sopenharmony_ci https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org 63962306a36Sopenharmony_ci - Raccomandazioni da Greg Kroah-Hartman sul fatto che i flag sconosciuti dovrebbero 64062306a36Sopenharmony_ci essere controllati: https://lore.kernel.org/r/20140717193330.GB4703@kroah.com 64162306a36Sopenharmony_ci - Raccomandazioni da Linus Torvalds che le chiamate di sistema x32 dovrebbero 64262306a36Sopenharmony_ci favorire la compatibilità con le versioni a 64-bit piuttosto che quelle a 32-bit: 64362306a36Sopenharmony_ci https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.com 644