sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/process/adding-syscallsmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Simplified)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_CN/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hChinese (Traditional)}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/zh_TW/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ja_JP/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/ko_KR/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget+/translations/sp_SP/process/adding-syscallsmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageItalianuh1h hh _documenthsourceNlineNubhwarning)}(hIn caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.h]h paragraph)}(hIn caso di dubbi sulla correttezza del contenuto di questa traduzione, l'unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le :ref:`avvertenze `.h](hIn caso di dubbi sulla correttezza del contenuto di questa traduzione, l’unico riferimento valido è la documentazione ufficiale in inglese. Per maggiori informazioni consultate le }(hhhhhNhNubh)}(h!:ref:`avvertenze `h]hinline)}(hhh]h avvertenze}(hhhhhNhNubah}(h]h ](xrefstdstd-refeh"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]refdoc*translations/it_IT/process/adding-syscalls refdomainhŒreftyperef refexplicitrefwarn reftarget it_disclaimeruh1hh3Documentation/translations/it_IT/disclaimer-ita.rsthKhhubh.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhX/var/lib/git/docbuild/linux/Documentation/translations/it_IT/process/adding-syscalls.rsthKubh field_body)}(h>:ref:`Documentation/process/adding-syscalls.rst `h]h)}(hjh]h)}(hjh]h)}(hjh]h)Documentation/process/adding-syscalls.rst}(hjhhhNhNubah}(h]h ](hstdstd-refeh"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]refdochΌ refdomainjreftyperef refexplicitrefwarnhԌ addsyscallsuh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhhubeh}(h]h ]h"]h$]h&]uh1hhjhKhhhhubh)}(hhh](h)}(h Translatorh]h Translator}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hjhKubj)}(h)Federico Vaga h]h)}(h(Federico Vaga h](hFederico Vaga <}(hjQhhhNhNubh reference)}(hfederico.vaga@vaga.pv.ith]hfederico.vaga@vaga.pv.it}(hj[hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:federico.vaga@vaga.pv.ituh1jYhjQubh>}(hjQhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjMubah}(h]h ]h"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]uh1hhjhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhjhKubhtarget)}(h.. _it_addsyscalls:h]h}(h]h ]h"]h$]h&]refidit-addsyscallsuh1jhKhhhhhjubhsection)}(hhh](htitle)}(h(Aggiungere una nuova chiamata di sistemah]h(Aggiungere una nuova chiamata di sistema}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK ubh)}(hX1Questo documento descrive quello che è necessario sapere per aggiungere nuove chiamate di sistema al kernel Linux; questo è da considerarsi come un'aggiunta ai soliti consigli su come proporre nuove modifiche :ref:`Documentation/translations/it_IT/process/submitting-patches.rst `.h](hQuesto documento descrive quello che è necessario sapere per aggiungere nuove chiamate di sistema al kernel Linux; questo è da considerarsi come un’aggiunta ai soliti consigli su come proporre nuove modifiche }(hjhhhNhNubh)}(h]:ref:`Documentation/translations/it_IT/process/submitting-patches.rst `h]h)}(hjh]h?Documentation/translations/it_IT/process/submitting-patches.rst}(hjhhhNhNubah}(h]h ](hstdstd-refeh"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]refdochΌ refdomainjreftyperef refexplicitrefwarnhԌit_submittingpatchesuh1hhjhK hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK hjhhubj)}(hhh](j)}(h$Alternative alle chiamate di sistemah]h$Alternative alle chiamate di sistema}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubh)}(hXKLa prima considerazione da fare quando si aggiunge una nuova chiamata di sistema è quella di valutare le alternative. Nonostante le chiamate di sistema siano il punto di interazione fra spazio utente e kernel più tradizionale ed ovvio, esistono altre possibilità - scegliete quella che meglio si adatta alle vostra interfaccia.h]hXKLa prima considerazione da fare quando si aggiunge una nuova chiamata di sistema è quella di valutare le alternative. Nonostante le chiamate di sistema siano il punto di interazione fra spazio utente e kernel più tradizionale ed ovvio, esistono altre possibilità - scegliete quella che meglio si adatta alle vostra interfaccia.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjhhubh block_quote)}(hX- Se le operazioni coinvolte possono rassomigliare a quelle di un filesystem, allora potrebbe avere molto più senso la creazione di un nuovo filesystem o dispositivo. Inoltre, questo rende più facile incapsulare la nuova funzionalità in un modulo kernel piuttosto che essere sviluppata nel cuore del kernel. - Se la nuova funzionalità prevede operazioni dove il kernel notifica lo spazio utente su un avvenimento, allora restituire un descrittore di file all'oggetto corrispondente permette allo spazio utente di utilizzare ``poll``/``select``/``epoll`` per ricevere quelle notifiche. - Tuttavia, le operazioni che non si sposano bene con operazioni tipo :manpage:`read(2)`/:manpage:`write(2)` dovrebbero essere implementate come chiamate :manpage:`ioctl(2)`, il che potrebbe portare ad un'API in un qualche modo opaca. - Se dovete esporre solo delle informazioni sul sistema, un nuovo nodo in sysfs (vedere ``Documentation/filesystems/sysfs.rst``) o in procfs potrebbe essere sufficiente. Tuttavia, l'accesso a questi meccanismi richiede che il filesystem sia montato, il che potrebbe non essere sempre vero (per esempio, in ambienti come namespace/sandbox/chroot). Evitate d'aggiungere nuove API in debugfs perché questo non viene considerata un'interfaccia di 'produzione' verso lo spazio utente. - Se l'operazione è specifica ad un particolare file o descrittore, allora potrebbe essere appropriata l'aggiunta di un comando :manpage:`fcntl(2)`. Tuttavia, :manpage:`fcntl(2)` è una chiamata di sistema multiplatrice che nasconde una notevole complessità, quindi è ottima solo quando la nuova funzione assomiglia a quelle già esistenti in :manpage:`fcntl(2)`, oppure la nuova funzionalità è veramente semplice (per esempio, leggere/scrivere un semplice flag associato ad un descrittore di file). - Se l'operazione è specifica ad un particolare processo, allora potrebbe essere appropriata l'aggiunta di un comando :manpage:`prctl(2)`. Come per :manpage:`fcntl(2)`, questa chiamata di sistema è un complesso multiplatore quindi è meglio usarlo per cose molto simili a quelle esistenti nel comando ``prctl`` oppure per leggere/scrivere un semplice flag relativo al processo. h]h bullet_list)}(hhh](h list_item)}(hXTSe le operazioni coinvolte possono rassomigliare a quelle di un filesystem, allora potrebbe avere molto più senso la creazione di un nuovo filesystem o dispositivo. Inoltre, questo rende più facile incapsulare la nuova funzionalità in un modulo kernel piuttosto che essere sviluppata nel cuore del kernel. - Se la nuova funzionalità prevede operazioni dove il kernel notifica lo spazio utente su un avvenimento, allora restituire un descrittore di file all'oggetto corrispondente permette allo spazio utente di utilizzare ``poll``/``select``/``epoll`` per ricevere quelle notifiche. - Tuttavia, le operazioni che non si sposano bene con operazioni tipo :manpage:`read(2)`/:manpage:`write(2)` dovrebbero essere implementate come chiamate :manpage:`ioctl(2)`, il che potrebbe portare ad un'API in un qualche modo opaca. h](h)}(hX5Se le operazioni coinvolte possono rassomigliare a quelle di un filesystem, allora potrebbe avere molto più senso la creazione di un nuovo filesystem o dispositivo. Inoltre, questo rende più facile incapsulare la nuova funzionalità in un modulo kernel piuttosto che essere sviluppata nel cuore del kernel.h]hX5Se le operazioni coinvolte possono rassomigliare a quelle di un filesystem, allora potrebbe avere molto più senso la creazione di un nuovo filesystem o dispositivo. Inoltre, questo rende più facile incapsulare la nuova funzionalità in un modulo kernel piuttosto che essere sviluppata nel cuore del kernel.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubj)}(hX - Se la nuova funzionalità prevede operazioni dove il kernel notifica lo spazio utente su un avvenimento, allora restituire un descrittore di file all'oggetto corrispondente permette allo spazio utente di utilizzare ``poll``/``select``/``epoll`` per ricevere quelle notifiche. - Tuttavia, le operazioni che non si sposano bene con operazioni tipo :manpage:`read(2)`/:manpage:`write(2)` dovrebbero essere implementate come chiamate :manpage:`ioctl(2)`, il che potrebbe portare ad un'API in un qualche modo opaca. h]j)}(hhh](j)}(hXSe la nuova funzionalità prevede operazioni dove il kernel notifica lo spazio utente su un avvenimento, allora restituire un descrittore di file all'oggetto corrispondente permette allo spazio utente di utilizzare ``poll``/``select``/``epoll`` per ricevere quelle notifiche.h]h)}(hXSe la nuova funzionalità prevede operazioni dove il kernel notifica lo spazio utente su un avvenimento, allora restituire un descrittore di file all'oggetto corrispondente permette allo spazio utente di utilizzare ``poll``/``select``/``epoll`` per ricevere quelle notifiche.h](hSe la nuova funzionalità prevede operazioni dove il kernel notifica lo spazio utente su un avvenimento, allora restituire un descrittore di file all’oggetto corrispondente permette allo spazio utente di utilizzare }(hj%hhhNhNubhliteral)}(h``poll``h]hpoll}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj%ubh/}(hj%hhhNhNubj.)}(h ``select``h]hselect}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj%ubh/}hj%sbj.)}(h ``epoll``h]hepoll}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj%ubh per ricevere quelle notifiche.}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK hj!ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hTuttavia, le operazioni che non si sposano bene con operazioni tipo :manpage:`read(2)`/:manpage:`write(2)` dovrebbero essere implementate come chiamate :manpage:`ioctl(2)`, il che potrebbe portare ad un'API in un qualche modo opaca. h]h)}(hTuttavia, le operazioni che non si sposano bene con operazioni tipo :manpage:`read(2)`/:manpage:`write(2)` dovrebbero essere implementate come chiamate :manpage:`ioctl(2)`, il che potrebbe portare ad un'API in un qualche modo opaca.h](hDTuttavia, le operazioni che non si sposano bene con operazioni tipo }(hjuhhhNhNubhmanpage)}(h:manpage:`read(2)`h]hread(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&] xml:spacepreservepathread(2)pagereadsection2uh1j}hjuubh/}(hjuhhhNhNubj~)}(h:manpage:`write(2)`h]hwrite(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjwrite(2)jwritejjuh1j}hjuubh. dovrebbero essere implementate come chiamate }(hjuhhhNhNubj~)}(h:manpage:`ioctl(2)`h]hioctl(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjioctl(2)jioctljjuh1j}hjuubh?, il che potrebbe portare ad un’API in un qualche modo opaca.}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK$hjqubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhjhK hjubah}(h]h ]h"]h$]h&]uh1jhjhK hjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hXSe dovete esporre solo delle informazioni sul sistema, un nuovo nodo in sysfs (vedere ``Documentation/filesystems/sysfs.rst``) o in procfs potrebbe essere sufficiente. Tuttavia, l'accesso a questi meccanismi richiede che il filesystem sia montato, il che potrebbe non essere sempre vero (per esempio, in ambienti come namespace/sandbox/chroot). Evitate d'aggiungere nuove API in debugfs perché questo non viene considerata un'interfaccia di 'produzione' verso lo spazio utente.h]h)}(hXSe dovete esporre solo delle informazioni sul sistema, un nuovo nodo in sysfs (vedere ``Documentation/filesystems/sysfs.rst``) o in procfs potrebbe essere sufficiente. Tuttavia, l'accesso a questi meccanismi richiede che il filesystem sia montato, il che potrebbe non essere sempre vero (per esempio, in ambienti come namespace/sandbox/chroot). Evitate d'aggiungere nuove API in debugfs perché questo non viene considerata un'interfaccia di 'produzione' verso lo spazio utente.h](hVSe dovete esporre solo delle informazioni sul sistema, un nuovo nodo in sysfs (vedere }(hjhhhNhNubj.)}(h'``Documentation/filesystems/sysfs.rst``h]h#Documentation/filesystems/sysfs.rst}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubhXl) o in procfs potrebbe essere sufficiente. Tuttavia, l’accesso a questi meccanismi richiede che il filesystem sia montato, il che potrebbe non essere sempre vero (per esempio, in ambienti come namespace/sandbox/chroot). Evitate d’aggiungere nuove API in debugfs perché questo non viene considerata un’interfaccia di ‘produzione’ verso lo spazio utente.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK)hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hXSe l'operazione è specifica ad un particolare file o descrittore, allora potrebbe essere appropriata l'aggiunta di un comando :manpage:`fcntl(2)`. Tuttavia, :manpage:`fcntl(2)` è una chiamata di sistema multiplatrice che nasconde una notevole complessità, quindi è ottima solo quando la nuova funzione assomiglia a quelle già esistenti in :manpage:`fcntl(2)`, oppure la nuova funzionalità è veramente semplice (per esempio, leggere/scrivere un semplice flag associato ad un descrittore di file).h]h)}(hXSe l'operazione è specifica ad un particolare file o descrittore, allora potrebbe essere appropriata l'aggiunta di un comando :manpage:`fcntl(2)`. Tuttavia, :manpage:`fcntl(2)` è una chiamata di sistema multiplatrice che nasconde una notevole complessità, quindi è ottima solo quando la nuova funzione assomiglia a quelle già esistenti in :manpage:`fcntl(2)`, oppure la nuova funzionalità è veramente semplice (per esempio, leggere/scrivere un semplice flag associato ad un descrittore di file).h](hSe l’operazione è specifica ad un particolare file o descrittore, allora potrebbe essere appropriata l’aggiunta di un comando }(hjhhhNhNubj~)}(h:manpage:`fcntl(2)`h]hfcntl(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjfcntl(2)jfcntljjuh1j}hjubh . Tuttavia, }(hjhhhNhNubj~)}(h:manpage:`fcntl(2)`h]hfcntl(2)}(hj+hhhNhNubah}(h]h ]j}ah"]h$]h&]jjjfcntl(2)jfcntljjuh1j}hjubh è una chiamata di sistema multiplatrice che nasconde una notevole complessità, quindi è ottima solo quando la nuova funzione assomiglia a quelle già esistenti in }(hjhhhNhNubj~)}(h:manpage:`fcntl(2)`h]hfcntl(2)}(hj?hhhNhNubah}(h]h ]j}ah"]h$]h&]jjjfcntl(2)jfcntljjuh1j}hjubh, oppure la nuova funzionalità è veramente semplice (per esempio, leggere/scrivere un semplice flag associato ad un descrittore di file).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK0hj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hX{Se l'operazione è specifica ad un particolare processo, allora potrebbe essere appropriata l'aggiunta di un comando :manpage:`prctl(2)`. Come per :manpage:`fcntl(2)`, questa chiamata di sistema è un complesso multiplatore quindi è meglio usarlo per cose molto simili a quelle esistenti nel comando ``prctl`` oppure per leggere/scrivere un semplice flag relativo al processo. h]h)}(hXySe l'operazione è specifica ad un particolare processo, allora potrebbe essere appropriata l'aggiunta di un comando :manpage:`prctl(2)`. Come per :manpage:`fcntl(2)`, questa chiamata di sistema è un complesso multiplatore quindi è meglio usarlo per cose molto simili a quelle esistenti nel comando ``prctl`` oppure per leggere/scrivere un semplice flag relativo al processo.h](hySe l’operazione è specifica ad un particolare processo, allora potrebbe essere appropriata l’aggiunta di un comando }(hjchhhNhNubj~)}(h:manpage:`prctl(2)`h]hprctl(2)}(hjkhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjprctl(2)jprctljjuh1j}hjcubh . Come per }(hjchhhNhNubj~)}(h:manpage:`fcntl(2)`h]hfcntl(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjfcntl(2)jfcntljjuh1j}hjcubh, questa chiamata di sistema è un complesso multiplatore quindi è meglio usarlo per cose molto simili a quelle esistenti nel comando }(hjchhhNhNubj.)}(h ``prctl``h]hprctl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjcubhC oppure per leggere/scrivere un semplice flag relativo al processo.}(hjchhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK7hj_ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjhKhjhhubeh}(h]$alternative-alle-chiamate-di-sistemaah ]h"]$alternative alle chiamate di sistemaah$]h&]uh1jhjhhhjhKubj)}(hhh](j)}(h+Progettare l'API: pianificare le estensionih]h-Progettare l’API: pianificare le estensioni}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK@ubh)}(hX9Una nuova chiamata di sistema diventerà parte dell'API del kernel, e dev'essere supportata per un periodo indefinito. Per questo, è davvero un'ottima idea quella di discutere apertamente l'interfaccia sulla lista di discussione del kernel, ed è altrettanto importante pianificarne eventuali estensioni future.h]hXAUna nuova chiamata di sistema diventerà parte dell’API del kernel, e dev’essere supportata per un periodo indefinito. Per questo, è davvero un’ottima idea quella di discutere apertamente l’interfaccia sulla lista di discussione del kernel, ed è altrettanto importante pianificarne eventuali estensioni future.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKBhjhhubh)}(hX[(Nella tabella delle chiamate di sistema sono disseminati esempi dove questo non fu fatto, assieme ai corrispondenti aggiornamenti - ``eventfd``/``eventfd2``, ``dup2``/``dup3``, ``inotify_init``/``inotify_init1``, ``pipe``/``pipe2``, ``renameat``/``renameat2`` --quindi imparate dalla storia del kernel e pianificate le estensioni fin dall'inizio)h](h(Nella tabella delle chiamate di sistema sono disseminati esempi dove questo non fu fatto, assieme ai corrispondenti aggiornamenti - }(hjhhhNhNubj.)}(h ``eventfd``h]heventfd}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}(hjhhhNhNubj.)}(h ``eventfd2``h]heventfd2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh, }(hjhhhNhNubj.)}(h``dup2``h]hdup2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}hjsbj.)}(h``dup3``h]hdup3}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh, }hjsbj.)}(h``inotify_init``h]h inotify_init}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}hjsbj.)}(h``inotify_init1``h]h inotify_init1}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh, }(hjhhhNhNubj.)}(h``pipe``h]hpipe}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}hjsbj.)}(h ``pipe2``h]hpipe2}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh, }hjsbj.)}(h ``renameat``h]hrenameat}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}hjsbj.)}(h ``renameat2``h]h renameat2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubhY --quindi imparate dalla storia del kernel e pianificate le estensioni fin dall’inizio)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKHhjhhubh)}(hXPer semplici chiamate di sistema che accettano solo un paio di argomenti, il modo migliore di permettere l'estensibilità è quello di includere un argomento *flags* alla chiamata di sistema. Per assicurarsi che i programmi dello spazio utente possano usare in sicurezza *flags* con diverse versioni del kernel, verificate se *flags* contiene un qualsiasi valore sconosciuto, in qual caso rifiutate la chiamata di sistema (con ``EINVAL``)::h](hPer semplici chiamate di sistema che accettano solo un paio di argomenti, il modo migliore di permettere l’estensibilità è quello di includere un argomento }(hjhhhNhNubhemphasis)}(h*flags*h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhk alla chiamata di sistema. Per assicurarsi che i programmi dello spazio utente possano usare in sicurezza }(hjhhhNhNubj)}(h*flags*h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh0 con diverse versioni del kernel, verificate se }(hjhhhNhNubj)}(h*flags*h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh^ contiene un qualsiasi valore sconosciuto, in qual caso rifiutate la chiamata di sistema (con }(hjhhhNhNubj.)}(h ``EINVAL``h]hEINVAL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh):}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKNhjhhubh literal_block)}(hKif (flags & ~(THING_FLAG1 | THING_FLAG2 | THING_FLAG3)) return -EINVAL;h]hKif (flags & ~(THING_FLAG1 | THING_FLAG2 | THING_FLAG3)) return -EINVAL;}hjsbah}(h]h ]h"]h$]h&]jjuh1jhjhKUhjhhubh)}(hM(Se *flags* non viene ancora utilizzato, verificate che l'argomento sia zero)h](h(Se }(hjhhhNhNubj)}(h*flags*h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhD non viene ancora utilizzato, verificate che l’argomento sia zero)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKXhjhhubh)}(hX'Per chiamate di sistema più sofisticate che coinvolgono un numero più grande di argomenti, il modo migliore è quello di incapsularne la maggior parte in una struttura dati che verrà passata per puntatore. Questa struttura potrà funzionare con future estensioni includendo un campo *size*::h](hXPer chiamate di sistema più sofisticate che coinvolgono un numero più grande di argomenti, il modo migliore è quello di incapsularne la maggior parte in una struttura dati che verrà passata per puntatore. Questa struttura potrà funzionare con future estensioni includendo un campo }(hj.hhhNhNubj)}(h*size*h]hsize}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh:}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKZhjhhubj)}(hstruct xyzzy_params { u32 size; /* userspace sets p->size = sizeof(struct xyzzy_params) */ u32 param_1; u64 param_2; u64 param_3; };h]hstruct xyzzy_params { u32 size; /* userspace sets p->size = sizeof(struct xyzzy_params) */ u32 param_1; u64 param_2; u64 param_3; };}hjNsbah}(h]h ]h"]h$]h&]jjuh1jhjhK_hjhhubh)}(hFintanto che un qualsiasi campo nuovo, diciamo ``param_4``, è progettato per offrire il comportamento precedente quando vale zero, allora questo permetterà di gestire un conflitto di versione in entrambe le direzioni:h](h/Fintanto che un qualsiasi campo nuovo, diciamo }(hj\hhhNhNubj.)}(h ``param_4``h]hparam_4}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj\ubh, è progettato per offrire il comportamento precedente quando vale zero, allora questo permetterà di gestire un conflitto di versione in entrambe le direzioni:}(hj\hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKfhjhhubj)}(hX- un vecchio kernel può gestire l'accesso di una versione moderna di un programma in spazio utente verificando che la memoria oltre la dimensione della struttura dati attesa sia zero (in pratica verificare che ``param_4 == 0``). - un nuovo kernel può gestire l'accesso di una versione vecchia di un programma in spazio utente estendendo la struttura dati con zeri (in pratica ``param_4 = 0``). h]j)}(hhh](j)}(hun vecchio kernel può gestire l'accesso di una versione moderna di un programma in spazio utente verificando che la memoria oltre la dimensione della struttura dati attesa sia zero (in pratica verificare che ``param_4 == 0``).h]h)}(hun vecchio kernel può gestire l'accesso di una versione moderna di un programma in spazio utente verificando che la memoria oltre la dimensione della struttura dati attesa sia zero (in pratica verificare che ``param_4 == 0``).h](hun vecchio kernel può gestire l’accesso di una versione moderna di un programma in spazio utente verificando che la memoria oltre la dimensione della struttura dati attesa sia zero (in pratica verificare che }(hjhhhNhNubj.)}(h``param_4 == 0``h]h param_4 == 0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKjhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hun nuovo kernel può gestire l'accesso di una versione vecchia di un programma in spazio utente estendendo la struttura dati con zeri (in pratica ``param_4 = 0``). h]h)}(hun nuovo kernel può gestire l'accesso di una versione vecchia di un programma in spazio utente estendendo la struttura dati con zeri (in pratica ``param_4 = 0``).h](hun nuovo kernel può gestire l’accesso di una versione vecchia di un programma in spazio utente estendendo la struttura dati con zeri (in pratica }(hjhhhNhNubj.)}(h``param_4 = 0``h]h param_4 = 0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKnhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhKjhj|ubah}(h]h ]h"]h$]h&]uh1jhjhKjhjhhubh)}(hVedere :manpage:`perf_event_open(2)` e la funzione ``perf_copy_attr()`` (in ``kernel/events/core.c``) per un esempio pratico di questo approccio.h](hVedere }(hjhhhNhNubj~)}(h:manpage:`perf_event_open(2)`h]hperf_event_open(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjperf_event_open(2)jperf_event_openjjuh1j}hjubh e la funzione }(hjhhhNhNubj.)}(h``perf_copy_attr()``h]hperf_copy_attr()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh (in }(hjhhhNhNubj.)}(h``kernel/events/core.c``h]hkernel/events/core.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh-) per un esempio pratico di questo approccio.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKrhjhhubeh}(h]*progettare-l-api-pianificare-le-estensioniah ]h"]+progettare l'api: pianificare le estensioniah$]h&]uh1jhjhhhjhK@ubj)}(hhh](j)}(h&Progettare l'API: altre considerazionih]h(Progettare l’API: altre considerazioni}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1hhhjhKwubh)}(hX`Se la vostra nuova chiamata di sistema permette allo spazio utente di fare riferimento ad un oggetto del kernel, allora questa dovrebbe usare un descrittore di file per accesso all'oggetto - non inventatevi nuovi tipi di accesso da spazio utente quando il kernel ha già dei meccanismi e una semantica ben definita per utilizzare i descrittori di file.h]hXbSe la vostra nuova chiamata di sistema permette allo spazio utente di fare riferimento ad un oggetto del kernel, allora questa dovrebbe usare un descrittore di file per accesso all’oggetto - non inventatevi nuovi tipi di accesso da spazio utente quando il kernel ha già dei meccanismi e una semantica ben definita per utilizzare i descrittori di file.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKyhj1hhubh)}(hXSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ritorna un nuovo descrittore di file, allora l'argomento *flags* dovrebbe includere un valore equivalente a ``O_CLOEXEC`` per i nuovi descrittori. Questo rende possibile, nello spazio utente, la chiusura della finestra temporale fra le chiamate a ``xyzzy()`` e ``fcntl(fd, F_SETFD, FD_CLOEXEC)``, dove un inaspettato ``fork()`` o ``execve()`` potrebbe trasferire il descrittore al programma eseguito (Comunque, resistete alla tentazione di riutilizzare il valore di ``O_CLOEXEC`` dato che è specifico dell'architettura e fa parte di una enumerazione di flag ``O_*`` che è abbastanza ricca).h](h'Se la vostra nuova chiamata di sistema }(hjPhhhNhNubj~)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hjXhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjxyzzy(2)jxyzzyjjuh1j}hjPubh< ritorna un nuovo descrittore di file, allora l’argomento }(hjPhhhNhNubj)}(h*flags*h]hflags}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh, dovrebbe includere un valore equivalente a }(hjPhhhNhNubj.)}(h ``O_CLOEXEC``h]h O_CLOEXEC}(hj~hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjPubh per i nuovi descrittori. Questo rende possibile, nello spazio utente, la chiusura della finestra temporale fra le chiamate a }(hjPhhhNhNubj.)}(h ``xyzzy()``h]hxyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjPubh e }(hjPhhhNhNubj.)}(h"``fcntl(fd, F_SETFD, FD_CLOEXEC)``h]hfcntl(fd, F_SETFD, FD_CLOEXEC)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjPubh, dove un inaspettato }(hjPhhhNhNubj.)}(h ``fork()``h]hfork()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjPubh o }(hjPhhhNhNubj.)}(h ``execve()``h]hexecve()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjPubh| potrebbe trasferire il descrittore al programma eseguito (Comunque, resistete alla tentazione di riutilizzare il valore di }(hjPhhhNhNubj.)}(h ``O_CLOEXEC``h]h O_CLOEXEC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjPubhR dato che è specifico dell’architettura e fa parte di una enumerazione di flag }(hjPhhhNhNubj.)}(h``O_*``h]hO_*}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjPubh che è abbastanza ricca).}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubh)}(hXpSe la vostra nuova chiamata di sistema ritorna un nuovo descrittore di file, dovreste considerare che significato avrà l'uso delle chiamate di sistema della famiglia di :manpage:`poll(2)`. Rendere un descrittore di file pronto per la lettura o la scrittura è il tipico modo del kernel per notificare lo spazio utente circa un evento associato all'oggetto del kernel.h](hSe la vostra nuova chiamata di sistema ritorna un nuovo descrittore di file, dovreste considerare che significato avrà l’uso delle chiamate di sistema della famiglia di }(hjhhhNhNubj~)}(h:manpage:`poll(2)`h]hpoll(2)}(hj hhhNhNubah}(h]h ]j}ah"]h$]h&]jjjpoll(2)jpolljjuh1j}hjubh. Rendere un descrittore di file pronto per la lettura o la scrittura è il tipico modo del kernel per notificare lo spazio utente circa un evento associato all’oggetto del kernel.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubh)}(hjSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ha un argomento che è il percorso ad un file::h](h'Se la vostra nuova chiamata di sistema }(hj$hhhNhNubj~)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hj,hhhNhNubah}(h]h ]j}ah"]h$]h&]jjjxyzzy(2)jxyzzyjjuh1j}hj$ubh/ ha un argomento che è il percorso ad un file:}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubj)}(h@int sys_xyzzy(const char __user *path, ..., unsigned int flags);h]h@int sys_xyzzy(const char __user *path, ..., unsigned int flags);}hjFsbah}(h]h ]h"]h$]h&]jjuh1jhjhKhj1hhubh)}(h[dovreste anche considerare se non sia più appropriata una versione :manpage:`xyzzyat(2)`::h](hDdovreste anche considerare se non sia più appropriata una versione }(hjThhhNhNubj~)}(h:manpage:`xyzzyat(2)`h]h xyzzyat(2)}(hj\hhhNhNubah}(h]h ]j}ah"]h$]h&]jjj xyzzyat(2)jxyzzyatjjuh1j}hjTubh:}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubj)}(hKint sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags);h]hKint sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags);}hjvsbah}(h]h ]h"]h$]h&]jjuh1jhjhKhj1hhubh)}(hXAQuesto permette più flessibilità su come lo spazio utente specificherà il file in questione; in particolare, permette allo spazio utente di richiedere la funzionalità su un descrittore di file già aperto utilizzando il *flag* ``AT_EMPTY_PATH``, in pratica otterremmo gratuitamente l'operazione :manpage:`fxyzzy(3)`::h](hQuesto permette più flessibilità su come lo spazio utente specificherà il file in questione; in particolare, permette allo spazio utente di richiedere la funzionalità su un descrittore di file già aperto utilizzando il }(hjhhhNhNubj)}(h*flag*h]hflag}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh }(hjhhhNhNubj.)}(h``AT_EMPTY_PATH``h]h AT_EMPTY_PATH}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh5, in pratica otterremmo gratuitamente l’operazione }(hjhhhNhNubj~)}(h:manpage:`fxyzzy(3)`h]h fxyzzy(3)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjj fxyzzy(3)jfxyzzyj3uh1j}hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubj)}(h- xyzzyat(AT_FDCWD, path, ..., 0) is equivalent to xyzzy(path,...) - xyzzyat(fd, "", ..., AT_EMPTY_PATH) is equivalent to fxyzzy(fd, ...)h]h- xyzzyat(AT_FDCWD, path, ..., 0) is equivalent to xyzzy(path,...) - xyzzyat(fd, "", ..., AT_EMPTY_PATH) is equivalent to fxyzzy(fd, ...)}hjsbah}(h]h ]h"]h$]h&]jjuh1jhjhKhj1hhubh)}(h(Per maggiori dettagli sulla logica delle chiamate \*at(), leggete la pagina man :manpage:`openat(2)`; per un esempio di AT_EMPTY_PATH, leggere la pagina man :manpage:`fstatat(2)`).h](hQ(Per maggiori dettagli sulla logica delle chiamate *at(), leggete la pagina man }(hjhhhNhNubj~)}(h:manpage:`openat(2)`h]h openat(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjj openat(2)jopenatjjuh1j}hjubh9; per un esempio di AT_EMPTY_PATH, leggere la pagina man }(hjhhhNhNubj~)}(h:manpage:`fstatat(2)`h]h fstatat(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjj fstatat(2)jfstatatjjuh1j}hjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubh)}(hSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede un parametro per descrivere uno scostamento all'interno di un file, usate ``loff_t`` come tipo cosicché scostamenti a 64-bit potranno essere supportati anche su architetture a 32-bit.h](h'Se la vostra nuova chiamata di sistema }(hjhhhNhNubj~)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjxyzzy(2)jxyzzyjjuh1j}hjubhU prevede un parametro per descrivere uno scostamento all’interno di un file, usate }(hjhhhNhNubj.)}(h ``loff_t``h]hloff_t}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubhd come tipo cosicché scostamenti a 64-bit potranno essere supportati anche su architetture a 32-bit.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubh)}(hXrSe la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede l'uso di funzioni riservate, allora dev'essere gestita da un opportuno bit di privilegio (verificato con una chiamata a ``capable()``), come descritto nella pagina man :manpage:`capabilities(7)`. Scegliete un bit di privilegio già esistente per gestire la funzionalità associata, ma evitate la combinazione di diverse funzionalità vagamente collegate dietro lo stesso bit, in quanto va contro il principio di *capabilities* di separare i poteri di root. In particolare, evitate di aggiungere nuovi usi al fin-troppo-generico privilegio ``CAP_SYS_ADMIN``.h](h'Se la vostra nuova chiamata di sistema }(hjChhhNhNubj~)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hjKhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjxyzzy(2)jxyzzyjjuh1j}hjCubh prevede l’uso di funzioni riservate, allora dev’essere gestita da un opportuno bit di privilegio (verificato con una chiamata a }(hjChhhNhNubj.)}(h ``capable()``h]h capable()}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjCubh#), come descritto nella pagina man }(hjChhhNhNubj~)}(h:manpage:`capabilities(7)`h]hcapabilities(7)}(hjqhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjcapabilities(7)j capabilitiesj7uh1j}hjCubh. Scegliete un bit di privilegio già esistente per gestire la funzionalità associata, ma evitate la combinazione di diverse funzionalità vagamente collegate dietro lo stesso bit, in quanto va contro il principio di }(hjChhhNhNubj)}(h*capabilities*h]h capabilities}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubhr di separare i poteri di root. In particolare, evitate di aggiungere nuovi usi al fin-troppo-generico privilegio }(hjChhhNhNubj.)}(h``CAP_SYS_ADMIN``h]h CAP_SYS_ADMIN}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjCubh.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubh)}(hX@Se la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` manipola altri processi oltre a quello chiamato, allora dovrebbe essere limitata (usando la chiamata ``ptrace_may_access()``) di modo che solo un processo chiamante con gli stessi permessi del processo in oggetto, o con i necessari privilegi, possa manipolarlo.h](h'Se la vostra nuova chiamata di sistema }(hjhhhNhNubj~)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjxyzzy(2)jxyzzyjjuh1j}hjubhf manipola altri processi oltre a quello chiamato, allora dovrebbe essere limitata (usando la chiamata }(hjhhhNhNubj.)}(h``ptrace_may_access()``h]hptrace_may_access()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh) di modo che solo un processo chiamante con gli stessi permessi del processo in oggetto, o con i necessari privilegi, possa manipolarlo.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubh)}(hX|Infine, state attenti che in alcune architetture non-x86 la vita delle chiamate di sistema con argomenti a 64-bit viene semplificata se questi argomenti ricadono in posizioni dispari (pratica, i parametri 1, 3, 5); questo permette l'uso di coppie contigue di registri a 32-bit. (Questo non conta se gli argomenti sono parte di una struttura dati che viene passata per puntatore).h]hX~Infine, state attenti che in alcune architetture non-x86 la vita delle chiamate di sistema con argomenti a 64-bit viene semplificata se questi argomenti ricadono in posizioni dispari (pratica, i parametri 1, 3, 5); questo permette l’uso di coppie contigue di registri a 32-bit. (Questo non conta se gli argomenti sono parte di una struttura dati che viene passata per puntatore).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj1hhubeh}(h]%progettare-l-api-altre-considerazioniah ]h"]&progettare l'api: altre considerazioniah$]h&]uh1jhjhhhjhKwubj)}(hhh](j)}(hProporre l'APIh]hProporre l’API}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubh)}(hAl fine di rendere le nuove chiamate di sistema di facile revisione, è meglio che dividiate le modifiche i pezzi separati. Questi dovrebbero includere almeno le seguenti voci in *commit* distinti (ognuno dei quali sarà descritto più avanti):h](hAl fine di rendere le nuove chiamate di sistema di facile revisione, è meglio che dividiate le modifiche i pezzi separati. Questi dovrebbero includere almeno le seguenti voci in }(hj hhhNhNubj)}(h*commit*h]hcommit}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh9 distinti (ognuno dei quali sarà descritto più avanti):}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjhhubj)}(hXR- l'essenza dell'implementazione della chiamata di sistema, con i prototipi, i numeri generici, le modifiche al Kconfig e l'implementazione *stub* di ripiego. - preparare la nuova chiamata di sistema per un'architettura specifica, solitamente x86 (ovvero tutti: x86_64, x86_32 e x32). - un programma di auto-verifica da mettere in ``tools/testing/selftests/`` che mostri l'uso della chiamata di sistema. - una bozza di pagina man per la nuova chiamata di sistema. Può essere scritta nell'email di presentazione, oppure come modifica vera e propria al repositorio delle pagine man. h]j)}(hhh](j)}(hl'essenza dell'implementazione della chiamata di sistema, con i prototipi, i numeri generici, le modifiche al Kconfig e l'implementazione *stub* di ripiego.h]h)}(hl'essenza dell'implementazione della chiamata di sistema, con i prototipi, i numeri generici, le modifiche al Kconfig e l'implementazione *stub* di ripiego.h](hl’essenza dell’implementazione della chiamata di sistema, con i prototipi, i numeri generici, le modifiche al Kconfig e l’implementazione }(hj6 hhhNhNubj)}(h*stub*h]hstub}(hj> hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6 ubh di ripiego.}(hj6 hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj2 ubah}(h]h ]h"]h$]h&]uh1jhj/ ubj)}(h{preparare la nuova chiamata di sistema per un'architettura specifica, solitamente x86 (ovvero tutti: x86_64, x86_32 e x32).h]h)}(h{preparare la nuova chiamata di sistema per un'architettura specifica, solitamente x86 (ovvero tutti: x86_64, x86_32 e x32).h]h}preparare la nuova chiamata di sistema per un’architettura specifica, solitamente x86 (ovvero tutti: x86_64, x86_32 e x32).}(hj` hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj\ ubah}(h]h ]h"]h$]h&]uh1jhj/ ubj)}(htun programma di auto-verifica da mettere in ``tools/testing/selftests/`` che mostri l'uso della chiamata di sistema.h]h)}(htun programma di auto-verifica da mettere in ``tools/testing/selftests/`` che mostri l'uso della chiamata di sistema.h](h,un programma di auto-verifica da mettere in }(hjx hhhNhNubj.)}(h``tools/testing/selftests/``h]htools/testing/selftests/}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjx ubh. che mostri l’uso della chiamata di sistema.}(hjx hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjt ubah}(h]h ]h"]h$]h&]uh1jhj/ ubj)}(huna bozza di pagina man per la nuova chiamata di sistema. Può essere scritta nell'email di presentazione, oppure come modifica vera e propria al repositorio delle pagine man. h]h)}(huna bozza di pagina man per la nuova chiamata di sistema. Può essere scritta nell'email di presentazione, oppure come modifica vera e propria al repositorio delle pagine man.h]huna bozza di pagina man per la nuova chiamata di sistema. Può essere scritta nell’email di presentazione, oppure come modifica vera e propria al repositorio delle pagine man.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj ubah}(h]h ]h"]h$]h&]uh1jhj/ ubeh}(h]h ]h"]h$]h&]jjuh1jhjhKhj+ ubah}(h]h ]h"]h$]h&]uh1jhjhKhjhhubh)}(hLe proposte di nuove chiamate di sistema, come ogni altro modifica all'API del kernel, deve essere sottomessa alla lista di discussione linux-api@vger.kernel.org.h](hLe proposte di nuove chiamate di sistema, come ogni altro modifica all’API del kernel, deve essere sottomessa alla lista di discussione }(hj hhhNhNubjZ)}(hlinux-api@vger.kernel.orgh]hlinux-api@vger.kernel.org}(hj hhhNhNubah}(h]h ]h"]h$]h&]refuri mailto:linux-api@vger.kernel.orguh1jYhj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhjhhubeh}(h]proporre-l-apiah ]h"]proporre l'apiah$]h&]uh1jhjhhhjhKubj)}(hhh](j)}(h0Implementazione di chiamate di sistema genericheh]h0Implementazione di chiamate di sistema generiche}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hhhjhKubh)}(hX Il principale punto d'accesso alla vostra nuova chiamata di sistema :manpage:`xyzzy(2)` verrà chiamato ``sys_xyzzy()``; ma, piuttosto che in modo esplicito, lo aggiungerete tramite la macro ``SYSCALL_DEFINEn``. La 'n' indica il numero di argomenti della chiamata di sistema; la macro ha come argomento il nome della chiamata di sistema, seguito dalle coppie (tipo, nome) per definire i suoi parametri. L'uso di questa macro permette di avere i metadati della nuova chiamata di sistema disponibili anche per altri strumenti.h](hFIl principale punto d’accesso alla vostra nuova chiamata di sistema }(hj hhhNhNubj~)}(h:manpage:`xyzzy(2)`h]hxyzzy(2)}(hj hhhNhNubah}(h]h ]j}ah"]h$]h&]jjjxyzzy(2)jxyzzyjjuh1j}hj ubh verrà chiamato }(hj hhhNhNubj.)}(h``sys_xyzzy()``h]h sys_xyzzy()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubhH; ma, piuttosto che in modo esplicito, lo aggiungerete tramite la macro }(hj hhhNhNubj.)}(h``SYSCALL_DEFINEn``h]hSYSCALL_DEFINEn}(hj+ hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubhXA. La ‘n’ indica il numero di argomenti della chiamata di sistema; la macro ha come argomento il nome della chiamata di sistema, seguito dalle coppie (tipo, nome) per definire i suoi parametri. L’uso di questa macro permette di avere i metadati della nuova chiamata di sistema disponibili anche per altri strumenti.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj hhubh)}(hIl nuovo punto d'accesso necessita anche del suo prototipo di funzione in ``include/linux/syscalls.h``, marcato come asmlinkage di modo da abbinargli il modo in cui quelle chiamate di sistema verranno invocate::h](hLIl nuovo punto d’accesso necessita anche del suo prototipo di funzione in }(hjC hhhNhNubj.)}(h``include/linux/syscalls.h``h]hinclude/linux/syscalls.h}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjC ubhl, marcato come asmlinkage di modo da abbinargli il modo in cui quelle chiamate di sistema verranno invocate:}(hjC hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj hhubj)}(hasmlinkage long sys_xyzzy(...);h]hasmlinkage long sys_xyzzy(...);}hjc sbah}(h]h ]h"]h$]h&]jjuh1jhjhKhj hhubh)}(hXFAlcune architetture (per esempio x86) hanno le loro specifiche tabelle di chiamate di sistema (syscall), ma molte altre architetture condividono una tabella comune di syscall. Aggiungete alla lista generica la vostra nuova chiamata di sistema aggiungendo un nuovo elemento alla lista in ``include/uapi/asm-generic/unistd.h``::h](hXAlcune architetture (per esempio x86) hanno le loro specifiche tabelle di chiamate di sistema (syscall), ma molte altre architetture condividono una tabella comune di syscall. Aggiungete alla lista generica la vostra nuova chiamata di sistema aggiungendo un nuovo elemento alla lista in }(hjq hhhNhNubj.)}(h%``include/uapi/asm-generic/unistd.h``h]h!include/uapi/asm-generic/unistd.h}(hjy hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjq ubh:}(hjq hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj hhubj)}(h7#define __NR_xyzzy 292 __SYSCALL(__NR_xyzzy, sys_xyzzy)h]h7#define __NR_xyzzy 292 __SYSCALL(__NR_xyzzy, sys_xyzzy)}hj sbah}(h]h ]h"]h$]h&]jjuh1jhjhKhj hhubh)}(hX?Aggiornate anche il contatore __NR_syscalls di modo che sia coerente con l'aggiunta della nuove chiamate di sistema; va notato che se più di una nuova chiamata di sistema viene aggiunga nella stessa finestra di sviluppo, il numero della vostra nuova syscall potrebbe essere aggiustato al fine di risolvere i conflitti.h]hXAAggiornate anche il contatore __NR_syscalls di modo che sia coerente con l’aggiunta della nuove chiamate di sistema; va notato che se più di una nuova chiamata di sistema viene aggiunga nella stessa finestra di sviluppo, il numero della vostra nuova syscall potrebbe essere aggiustato al fine di risolvere i conflitti.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhj hhubh)}(hIl file ``kernel/sys_ni.c`` fornisce le implementazioni *stub* di ripiego che ritornano ``-ENOSYS``. Aggiungete la vostra nuova chiamata di sistema anche qui::h](hIl file }(hj hhhNhNubj.)}(h``kernel/sys_ni.c``h]hkernel/sys_ni.c}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh fornisce le implementazioni }(hj hhhNhNubj)}(h*stub*h]hstub}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh di ripiego che ritornano }(hj hhhNhNubj.)}(h ``-ENOSYS``h]h-ENOSYS}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh<. Aggiungete la vostra nuova chiamata di sistema anche qui:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhj hhubj)}(hCOND_SYSCALL(xyzzy);h]hCOND_SYSCALL(xyzzy);}hj sbah}(h]h ]h"]h$]h&]jjuh1jhjhKhj hhubh)}(hLa vostra nuova funzionalità del kernel, e la chiamata di sistema che la controlla, dovrebbero essere opzionali. Quindi, aggiungete un'opzione ``CONFIG`` (solitamente in ``init/Kconfig``). Come al solito per le nuove opzioni ``CONFIG``:h](hLa vostra nuova funzionalità del kernel, e la chiamata di sistema che la controlla, dovrebbero essere opzionali. Quindi, aggiungete un’opzione }(hj hhhNhNubj.)}(h ``CONFIG``h]hCONFIG}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh (solitamente in }(hj hhhNhNubj.)}(h``init/Kconfig``h]h init/Kconfig}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh(). Come al solito per le nuove opzioni }(hj hhhNhNubj.)}(h ``CONFIG``h]hCONFIG}(hj+ hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj hhubj)}(hX- Includete una descrizione della nuova funzionalità e della chiamata di sistema che la controlla. - Rendete l'opzione dipendente da EXPERT se dev'essere nascosta agli utenti normali. - Nel Makefile, rendere tutti i nuovi file sorgenti, che implementano la nuova funzionalità, dipendenti dall'opzione CONFIG (per esempio ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``). - Controllate due volte che sia possibile generare il kernel con la nuova opzione CONFIG disabilitata. h]j)}(hhh](j)}(haIncludete una descrizione della nuova funzionalità e della chiamata di sistema che la controlla.h]h)}(haIncludete una descrizione della nuova funzionalità e della chiamata di sistema che la controlla.h]haIncludete una descrizione della nuova funzionalità e della chiamata di sistema che la controlla.}(hjN hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjJ ubah}(h]h ]h"]h$]h&]uh1jhjG ubj)}(hRRendete l'opzione dipendente da EXPERT se dev'essere nascosta agli utenti normali.h]h)}(hRRendete l'opzione dipendente da EXPERT se dev'essere nascosta agli utenti normali.h]hVRendete l’opzione dipendente da EXPERT se dev’essere nascosta agli utenti normali.}(hjf hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjb ubah}(h]h ]h"]h$]h&]uh1jhjG ubj)}(hNel Makefile, rendere tutti i nuovi file sorgenti, che implementano la nuova funzionalità, dipendenti dall'opzione CONFIG (per esempio ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``).h]h)}(hNel Makefile, rendere tutti i nuovi file sorgenti, che implementano la nuova funzionalità, dipendenti dall'opzione CONFIG (per esempio ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``).h](hNel Makefile, rendere tutti i nuovi file sorgenti, che implementano la nuova funzionalità, dipendenti dall’opzione CONFIG (per esempio }(hj~ hhhNhNubj.)}(h*``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``h]h&obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj~ ubh).}(hj~ hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM hjz ubah}(h]h ]h"]h$]h&]uh1jhjG ubj)}(heControllate due volte che sia possibile generare il kernel con la nuova opzione CONFIG disabilitata. h]h)}(hdControllate due volte che sia possibile generare il kernel con la nuova opzione CONFIG disabilitata.h]hdControllate due volte che sia possibile generare il kernel con la nuova opzione CONFIG disabilitata.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM hj ubah}(h]h ]h"]h$]h&]uh1jhjG ubeh}(h]h ]h"]h$]h&]jjuh1jhjhMhjC ubah}(h]h ]h"]h$]h&]uh1jhjhMhj hhubh)}(h1Per riassumere, vi serve un *commit* che includa:h](hPer riassumere, vi serve un }(hj hhhNhNubj)}(h*commit*h]hcommit}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh che includa:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj hhubj)}(hX?- un'opzione ``CONFIG``per la nuova funzione, normalmente in ``init/Kconfig`` - ``SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso - il corrispondente prototipo in ``include/linux/syscalls.h`` - un elemento nella tabella generica in ``include/uapi/asm-generic/unistd.h`` - *stub* di ripiego in ``kernel/sys_ni.c`` h]j)}(hhh](j)}(hKun'opzione ``CONFIG``per la nuova funzione, normalmente in ``init/Kconfig``h]h)}(hj h](h un’opzione }(hj hhhNhNubj.)}(h@``CONFIG``per la nuova funzione, normalmente in ``init/Kconfig``h]h (per x86_64 e x32) in arch/x86/entry/syscalls/syscall_64.tbl:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhj hhubj)}(h"333 common xyzzy sys_xyzzyh]h"333 common xyzzy sys_xyzzy}hj sbah}(h]h ]h"]h$]h&]jjuh1jhjhM"hj hhubh)}(hEe un elemento per *i386* ``arch/x86/entry/syscalls/syscall_32.tbl``::h](he un elemento per }(hj hhhNhNubj)}(h*i386*h]hi386}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh }(hj hhhNhNubj.)}(h*``arch/x86/entry/syscalls/syscall_32.tbl``h]h&arch/x86/entry/syscalls/syscall_32.tbl}(hj$ hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM$hj hhubj)}(h"380 i386 xyzzy sys_xyzzyh]h"380 i386 xyzzy sys_xyzzy}hj< sbah}(h]h ]h"]h$]h&]jjuh1jhjhM&hj hhubh)}(huAncora una volta, questi numeri potrebbero essere cambiati se generano conflitti durante la finestra di integrazione.h]huAncora una volta, questi numeri potrebbero essere cambiati se generano conflitti durante la finestra di integrazione.}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM(hj hhubeh}(h]-implementazione-delle-chiamate-di-sistema-x86ah ]h"]-implementazione delle chiamate di sistema x86ah$]h&]uh1jhjhhhjhMubj)}(hhh](j)}(h*Chiamate di sistema compatibili (generico)h]h*Chiamate di sistema compatibili (generico)}(hjc hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj` hhhjhM-ubh)}(hPer molte chiamate di sistema, la stessa implementazione a 64-bit può essere invocata anche quando il programma in spazio utente è a 32-bit; anche se la chiamata di sistema include esplicitamente un puntatore, questo viene gestito in modo trasparente.h]hPer molte chiamate di sistema, la stessa implementazione a 64-bit può essere invocata anche quando il programma in spazio utente è a 32-bit; anche se la chiamata di sistema include esplicitamente un puntatore, questo viene gestito in modo trasparente.}(hjq 3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM/hj` hhubh)}(hTuttavia, ci sono un paio di situazione dove diventa necessario avere un livello di gestione della compatibilità per risolvere le differenze di dimensioni fra 32-bit e 64-bit.h]hTuttavia, ci sono un paio di situazione dove diventa necessario avere un livello di gestione della compatibilità per risolvere le differenze di dimensioni fra 32-bit e 64-bit.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM4hj` hhubh)}(hX+Il primo caso è quando un kernel a 64-bit supporta anche programmi in spazio utente a 32-bit, perciò dovrà ispezionare aree della memoria (``__user``) che potrebbero contenere valori a 32-bit o a 64-bit. In particolar modo, questo è necessario quando un argomento di una chiamata di sistema è:h](hIl primo caso è quando un kernel a 64-bit supporta anche programmi in spazio utente a 32-bit, perciò dovrà ispezionare aree della memoria (}(hj hhhNhNubj.)}(h ``__user``h]h__user}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh) che potrebbero contenere valori a 32-bit o a 64-bit. In particolar modo, questo è necessario quando un argomento di una chiamata di sistema è:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM8hj` hhubj)}(hXN- un puntatore ad un puntatore - un puntatore ad una struttura dati contenente a sua volta un puntatore ( ad esempio ``struct iovec __user *``) - un puntatore ad un tipo intero di dimensione variabile (``time_t``, ``off_t``, ``long``, ...) - un puntatore ad una struttura dati contenente un tipo intero di dimensione variabile. h]j)}(hhh](j)}(hun puntatore ad un puntatoreh]h)}(hj h]hun puntatore ad un puntatore}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM=hj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hnun puntatore ad una struttura dati contenente a sua volta un puntatore ( ad esempio ``struct iovec __user *``)h]h)}(hnun puntatore ad una struttura dati contenente a sua volta un puntatore ( ad esempio ``struct iovec __user *``)h](hTun puntatore ad una struttura dati contenente a sua volta un puntatore ( ad esempio }(hj hhhNhNubj.)}(h``struct iovec __user *``h]hstruct iovec __user *}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM>hj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h]un puntatore ad un tipo intero di dimensione variabile (``time_t``, ``off_t``, ``long``, ...)h]h)}(h]un puntatore ad un tipo intero di dimensione variabile (``time_t``, ``off_t``, ``long``, ...)h](h8un puntatore ad un tipo intero di dimensione variabile (}(hj hhhNhNubj.)}(h ``time_t``h]htime_t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh, }(hj hhhNhNubj.)}(h ``off_t``h]hoff_t}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh, }(hj hhhNhNubj.)}(h``long``h]hlong}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh, ...)}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM@hj ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hVun puntatore ad una struttura dati contenente un tipo intero di dimensione variabile. h]h)}(hUun puntatore ad una struttura dati contenente un tipo intero di dimensione variabile.h]hUun puntatore ad una struttura dati contenente un tipo intero di dimensione variabile.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMBhjCubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjhM=hj ubah}(h]h ]h"]h$]h&]uh1jhjhM=hj` hhubh)}(hXIl secondo caso che richiede un livello di gestione della compatibilità è quando uno degli argomenti di una chiamata a sistema è esplicitamente un tipo a 64-bit anche su architetture a 32-bit, per esempio ``loff_t`` o ``__u64``. In questo caso, un valore che arriva ad un kernel a 64-bit da un'applicazione a 32-bit verrà diviso in due valori a 32-bit che dovranno essere riassemblati in questo livello di compatibilità.h](hIl secondo caso che richiede un livello di gestione della compatibilità è quando uno degli argomenti di una chiamata a sistema è esplicitamente un tipo a 64-bit anche su architetture a 32-bit, per esempio }(hjghhhNhNubj.)}(h ``loff_t``h]hloff_t}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjgubh o }(hjghhhNhNubj.)}(h ``__u64``h]h__u64}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjgubh. In questo caso, un valore che arriva ad un kernel a 64-bit da un’applicazione a 32-bit verrà diviso in due valori a 32-bit che dovranno essere riassemblati in questo livello di compatibilità.}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMEhj` hhubh)}(hX(Da notare che non serve questo livello di compatibilità per argomenti che sono puntatori ad un tipo esplicitamente a 64-bit; per esempio, in :manpage:`splice(2)` l'argomento di tipo ``loff_t __user *`` non necessita di una chiamata di sistema ``compat_``)h](h(Da notare che non serve questo livello di compatibilità per argomenti che sono puntatori ad un tipo esplicitamente a 64-bit; per esempio, in }(hjhhhNhNubj~)}(h:manpage:`splice(2)`h]h splice(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjj splice(2)jsplicejjuh1j}hjubh l’argomento di tipo }(hjhhhNhNubj.)}(h``loff_t __user *``h]hloff_t __user *}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh* non necessita di una chiamata di sistema }(hjhhhNhNubj.)}(h ``compat_``h]hcompat_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMLhj` hhubh)}(hX La versione compatibile della nostra chiamata di sistema si chiamerà ``compat_sys_xyzzy()``, e viene aggiunta utilizzando la macro ``COMPAT_SYSCALL_DEFINEn()`` (simile a SYSCALL_DEFINEn). Questa versione dell'implementazione è parte del kernel a 64-bit ma accetta parametri a 32-bit che trasformerà secondo le necessità (tipicamente, la versione ``compat_sys_`` converte questi valori nello loro corrispondente a 64-bit e può chiamare la versione ``sys_`` oppure invocare una funzione che implementa le parti comuni).h](hFLa versione compatibile della nostra chiamata di sistema si chiamerà }(hjhhhNhNubj.)}(h``compat_sys_xyzzy()``h]hcompat_sys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh(, e viene aggiunta utilizzando la macro }(hjhhhNhNubj.)}(h``COMPAT_SYSCALL_DEFINEn()``h]hCOMPAT_SYSCALL_DEFINEn()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh (simile a SYSCALL_DEFINEn). Questa versione dell’implementazione è parte del kernel a 64-bit ma accetta parametri a 32-bit che trasformerà secondo le necessità (tipicamente, la versione }(hjhhhNhNubj.)}(h``compat_sys_``h]h compat_sys_}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubhW converte questi valori nello loro corrispondente a 64-bit e può chiamare la versione }(hjhhhNhNubj.)}(h``sys_``h]hsys_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh> oppure invocare una funzione che implementa le parti comuni).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMQhj` hhubh)}(hIl punto d'accesso *compat* deve avere il corrispondente prototipo di funzione in ``include/linux/compat.h``, marcato come asmlinkage di modo da abbinargli il modo in cui quelle chiamate di sistema verranno invocate::h](hIl punto d’accesso }(hj5hhhNhNubj)}(h*compat*h]hcompat}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh7 deve avere il corrispondente prototipo di funzione in }(hj5hhhNhNubj.)}(h``include/linux/compat.h``h]hinclude/linux/compat.h}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj5ubhl, marcato come asmlinkage di modo da abbinargli il modo in cui quelle chiamate di sistema verranno invocate:}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMZhj` hhubj)}(h&asmlinkage long compat_sys_xyzzy(...);h]h&asmlinkage long compat_sys_xyzzy(...);}hjgsbah}(h]h ]h"]h$]h&]jjuh1jhjhM^hj` hhubh)}(hX3Se la chiamata di sistema prevede una struttura dati organizzata in modo diverso per sistemi a 32-bit e per quelli a 64-bit, diciamo ``struct xyzzy_args``, allora il file d'intestazione ``then the include/linux/compat.h`` deve includere la sua versione *compatibile* (``struct compat_xyzzy_args``); ogni variabile con dimensione variabile deve avere il proprio tipo ``compat_`` corrispondente a quello in ``struct xyzzy_args``. La funzione ``compat_sys_xyzzy()`` può usare la struttura ``compat_`` per analizzare gli argomenti ricevuti da una chiamata a 32-bit.h](hSe la chiamata di sistema prevede una struttura dati organizzata in modo diverso per sistemi a 32-bit e per quelli a 64-bit, diciamo }(hjuhhhNhNubj.)}(h``struct xyzzy_args``h]hstruct xyzzy_args}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjuubh", allora il file d’intestazione }(hjuhhhNhNubj.)}(h#``then the include/linux/compat.h``h]hthen the include/linux/compat.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjuubh deve includere la sua versione }(hjuhhhNhNubj)}(h *compatibile*h]h compatibile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubh (}(hjuhhhNhNubj.)}(h``struct compat_xyzzy_args``h]hstruct compat_xyzzy_args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjuubhF); ogni variabile con dimensione variabile deve avere il proprio tipo }(hjuhhhNhNubj.)}(h ``compat_``h]hcompat_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjuubh corrispondente a quello in }(hjuhhhNhNubj.)}(h``struct xyzzy_args``h]hstruct xyzzy_args}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjuubh. La funzione }(hjuhhhNhNubj.)}(h``compat_sys_xyzzy()``h]hcompat_sys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjuubh può usare la struttura }(hjuhhhNhNubj.)}(h ``compat_``h]hcompat_}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjuubh@ per analizzare gli argomenti ricevuti da una chiamata a 32-bit.}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM`hj` hhubh)}(h(Per esempio, se avete i seguenti campi::h]h'Per esempio, se avete i seguenti campi:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMjhj` hhubj)}(htstruct xyzzy_args { const char __user *ptr; __kernel_long_t varying_val; u64 fixed_val; /* ... */ };h]htstruct xyzzy_args { const char __user *ptr; __kernel_long_t varying_val; u64 fixed_val; /* ... */ };}hj!sbah}(h]h ]h"]h$]h&]jjuh1jhjhMlhj` hhubh)}(hhnella struttura ``struct xyzzy_args``, allora la struttura ``struct compat_xyzzy_args`` dovrebbe avere::h](hnella struttura }(hj/hhhNhNubj.)}(h``struct xyzzy_args``h]hstruct xyzzy_args}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj/ubh, allora la struttura }(hj/hhhNhNubj.)}(h``struct compat_xyzzy_args``h]hstruct compat_xyzzy_args}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj/ubh dovrebbe avere:}(hj/hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMshj` hhubj)}(htstruct compat_xyzzy_args { compat_uptr_t ptr; compat_long_t varying_val; u64 fixed_val; /* ... */ };h]htstruct compat_xyzzy_args { compat_uptr_t ptr; compat_long_t varying_val; u64 fixed_val; /* ... */ };}hjasbah}(h]h ]h"]h$]h&]jjuh1jhjhMvhj` hhubh)}(hLa lista generica delle chiamate di sistema ha bisogno di essere aggiustata al fine di permettere l'uso della versione *compatibile*; la voce in ``include/uapi/asm-generic/unistd.h`` dovrebbero usare ``__SC_COMP`` piuttosto di ``__SYSCALL``::h](hyLa lista generica delle chiamate di sistema ha bisogno di essere aggiustata al fine di permettere l’uso della versione }(hjohhhNhNubj)}(h *compatibile*h]h compatibile}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubh ; la voce in }(hjohhhNhNubj.)}(h%``include/uapi/asm-generic/unistd.h``h]h!include/uapi/asm-generic/unistd.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjoubh dovrebbero usare }(hjohhhNhNubj.)}(h ``__SC_COMP``h]h __SC_COMP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjoubh piuttosto di }(hjohhhNhNubj.)}(h ``__SYSCALL``h]h __SYSCALL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjoubh:}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM}hj` hhubj)}(hI#define __NR_xyzzy 292 __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy)h]hI#define __NR_xyzzy 292 __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy)}hjsbah}(h]h ]h"]h$]h&]jjuh1jhjhMhj` hhubh)}(hRiassumendo, vi serve:h]hRiassumendo, vi serve:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhj` hhubj)}(hX5- un ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso *compatibile* - un prototipo in ``include/linux/compat.h`` - (se necessario) una struttura di compatibilità a 32-bit in ``include/linux/compat.h`` - una voce ``__SC_COMP``, e non ``__SYSCALL``, in ``include/uapi/asm-generic/unistd.h`` h]j)}(hhh](j)}(hNun ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso *compatibile*h]h)}(hNun ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso *compatibile*h](hun }(hjhhhNhNubj.)}(h&``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)``h]h"COMPAT_SYSCALL_DEFINEn(xyzzy, ...)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh per il punto d’accesso }(hjhhhNhNubj)}(h *compatibile*h]h compatibile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h*un prototipo in ``include/linux/compat.h``h]h)}(hj"h](hun prototipo in }(hj$hhhNhNubj.)}(h``include/linux/compat.h``h]hinclude/linux/compat.h}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj$ubeh}(h]h ]h"]h$]h&]uh1hhjhMhj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hV(se necessario) una struttura di compatibilità a 32-bit in ``include/linux/compat.h``h]h)}(hV(se necessario) una struttura di compatibilità a 32-bit in ``include/linux/compat.h``h](h<(se necessario) una struttura di compatibilità a 32-bit in }(hjIhhhNhNubj.)}(h``include/linux/compat.h``h]hinclude/linux/compat.h}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjIubeh}(h]h ]h"]h$]h&]uh1hhjhMhjEubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hVuna voce ``__SC_COMP``, e non ``__SYSCALL``, in ``include/uapi/asm-generic/unistd.h`` h]h)}(hUuna voce ``__SC_COMP``, e non ``__SYSCALL``, in ``include/uapi/asm-generic/unistd.h``h](h una voce }(hjohhhNhNubj.)}(h ``__SC_COMP``h]h __SC_COMP}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjoubh, e non }(hjohhhNhNubj.)}(h ``__SYSCALL``h]h __SYSCALL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjoubh, in }(hjohhhNhNubj.)}(h%``include/uapi/asm-generic/unistd.h``h]h!include/uapi/asm-generic/unistd.h}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjoubeh}(h]h ]h"]h$]h&]uh1hhjhMhjkubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhj` hhubeh}(h](chiamate-di-sistema-compatibili-genericoah ]h"]*chiamate di sistema compatibili (generico)ah$]h&]uh1jhjhhhjhM-ubj)}(hhh](j)}(h.Compatibilità delle chiamate di sistema (x86)h]h.Compatibilità delle chiamate di sistema (x86)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubh)}(hPer collegare una chiamata di sistema, su un'architettura x86, con la sua versione *compatibile*, è necessario aggiustare la voce nella tabella delle syscall.h](hUPer collegare una chiamata di sistema, su un’architettura x86, con la sua versione }(hjhhhNhNubj)}(h *compatibile*h]h compatibile}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh?, è necessario aggiustare la voce nella tabella delle syscall.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hPer prima cosa, la voce in ``arch/x86/entry/syscalls/syscall_32.tbl`` prende un argomento aggiuntivo per indicare che un programma in spazio utente a 32-bit, eseguito su un kernel a 64-bit, dovrebbe accedere tramite il punto d'accesso compatibile::h](hPer prima cosa, la voce in }(hjhhhNhNubj.)}(h*``arch/x86/entry/syscalls/syscall_32.tbl``h]h&arch/x86/entry/syscalls/syscall_32.tbl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh prende un argomento aggiuntivo per indicare che un programma in spazio utente a 32-bit, eseguito su un kernel a 64-bit, dovrebbe accedere tramite il punto d’accesso compatibile:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubj)}(h=380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzyh]h=380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzy}hjsbah}(h]h ]h"]h$]h&]jjuh1jhjhMhjhhubh)}(hSecondo, dovete capire cosa dovrebbe succedere alla nuova chiamata di sistema per la versione dell'ABI x32. Qui C'è una scelta da fare: gli argomenti possono corrisponde alla versione a 64-bit o a quella a 32-bit.h]hSecondo, dovete capire cosa dovrebbe succedere alla nuova chiamata di sistema per la versione dell’ABI x32. Qui C’è una scelta da fare: gli argomenti possono corrisponde alla versione a 64-bit o a quella a 32-bit.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hXSe c'è un puntatore ad un puntatore, la decisione è semplice: x32 è ILP32, quindi gli argomenti dovrebbero corrispondere a quelli a 32-bit, e la voce in ``arch/x86/entry/syscalls/syscall_64.tbl`` sarà divisa cosicché i programmi x32 eseguano la chiamata *compatibile*::h](hSe c’è un puntatore ad un puntatore, la decisione è semplice: x32 è ILP32, quindi gli argomenti dovrebbero corrispondere a quelli a 32-bit, e la voce in }(hj6hhhNhNubj.)}(h*``arch/x86/entry/syscalls/syscall_64.tbl``h]h&arch/x86/entry/syscalls/syscall_64.tbl}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj6ubh= sarà divisa cosicché i programmi x32 eseguano la chiamata }(hj6hhhNhNubj)}(h *compatibile*h]h compatibile}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubh:}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubj)}(hV333 64 xyzzy sys_xyzzy ... 555 x32 xyzzy __x32_compat_sys_xyzzyh]hV333 64 xyzzy sys_xyzzy ... 555 x32 xyzzy __x32_compat_sys_xyzzy}hjhsbah}(h]h ]h"]h$]h&]jjuh1jhjhMhjhhubh)}(hSe non ci sono puntatori, allora è preferibile riutilizzare la chiamata di sistema a 64-bit per l'ABI x32 (e di conseguenza la voce in arch/x86/entry/syscalls/syscall_64.tbl rimane immutata).h]hSe non ci sono puntatori, allora è preferibile riutilizzare la chiamata di sistema a 64-bit per l’ABI x32 (e di conseguenza la voce in arch/x86/entry/syscalls/syscall_64.tbl rimane immutata).}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hIn ambo i casi, dovreste verificare che i tipi usati dagli argomenti abbiano un'esatta corrispondenza da x32 (-mx32) al loro equivalente a 32-bit (-m32) o 64-bit (-m64).h]hIn ambo i casi, dovreste verificare che i tipi usati dagli argomenti abbiano un’esatta corrispondenza da x32 (-mx32) al loro equivalente a 32-bit (-m32) o 64-bit (-m64).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjhhubeh}(h]+compatibilita-delle-chiamate-di-sistema-x86ah ]h"].compatibilità delle chiamate di sistema (x86)ah$]h&]uh1jhjhhhjhMubj)}(hhh](j)}(h)Chiamate di sistema che ritornano altroveh]h)Chiamate di sistema che ritornano altrove}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubh)}(hXkNella maggior parte delle chiamate di sistema, al termine della loro esecuzione, i programmi in spazio utente riprendono esattamente dal punto in cui si erano interrotti -- quindi dall'istruzione successiva, con lo stesso *stack* e con la maggior parte del registri com'erano stati lasciati prima della chiamata di sistema, e anche con la stessa memoria virtuale.h](hNella maggior parte delle chiamate di sistema, al termine della loro esecuzione, i programmi in spazio utente riprendono esattamente dal punto in cui si erano interrotti -- quindi dall’istruzione successiva, con lo stesso }(hjhhhNhNubj)}(h*stack*h]hstack}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh e con la maggior parte del registri com’erano stati lasciati prima della chiamata di sistema, e anche con la stessa memoria virtuale.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hX Tuttavia, alcune chiamata di sistema fanno le cose in modo differente. Potrebbero ritornare ad un punto diverso (``rt_sigreturn``) o cambiare la memoria in spazio utente (``fork``/``vfork``/``clone``) o perfino l'architettura del programma (``execve``/``execveat``).h](hqTuttavia, alcune chiamata di sistema fanno le cose in modo differente. Potrebbero ritornare ad un punto diverso (}(hjhhhNhNubj.)}(h``rt_sigreturn``h]h rt_sigreturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh*) o cambiare la memoria in spazio utente (}(hjhhhNhNubj.)}(h``fork``h]hfork}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}(hjhhhNhNubj.)}(h ``vfork``h]hvfork}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}hjsbj.)}(h ``clone``h]hclone}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh,) o perfino l’architettura del programma (}(hjhhhNhNubj.)}(h ``execve``h]hexecve}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}hjsbj.)}(h ``execveat``h]hexecveat}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh).}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hX6Per permettere tutto ciò, l'implementazione nel kernel di questo tipo di chiamate di sistema potrebbero dover salvare e ripristinare registri aggiuntivi nello *stack* del kernel, permettendo così un controllo completo su dove e come l'esecuzione dovrà continuare dopo l'esecuzione della chiamata di sistema.h](hPer permettere tutto ciò, l’implementazione nel kernel di questo tipo di chiamate di sistema potrebbero dover salvare e ripristinare registri aggiuntivi nello }(hjEhhhNhNubj)}(h*stack*h]hstack}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubh del kernel, permettendo così un controllo completo su dove e come l’esecuzione dovrà continuare dopo l’esecuzione della chiamata di sistema.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hQueste saranno specifiche per ogni architettura, ma tipicamente si definiscono dei punti d'accesso in *assembly* per salvare/ripristinare i registri aggiuntivi e quindi chiamare il vero punto d'accesso per la chiamata di sistema.h](hhQueste saranno specifiche per ogni architettura, ma tipicamente si definiscono dei punti d’accesso in }(hjehhhNhNubj)}(h *assembly*h]hassembly}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeubhw per salvare/ripristinare i registri aggiuntivi e quindi chiamare il vero punto d’accesso per la chiamata di sistema.}(hjehhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hPer l'architettura x86_64, questo è implementato come un punto d'accesso ``stub_xyzzy`` in ``arch/x86/entry/entry_64.S``, e la voce nella tabella di syscall (``arch/x86/entry/syscalls/syscall_64.tbl``) verrà corretta di conseguenza::h](hNPer l’architettura x86_64, questo è implementato come un punto d’accesso }(hjhhhNhNubj.)}(h``stub_xyzzy``h]h stub_xyzzy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh in }(hjhhhNhNubj.)}(h``arch/x86/entry/entry_64.S``h]harch/x86/entry/entry_64.S}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh&, e la voce nella tabella di syscall (}(hjhhhNhNubj.)}(h*``arch/x86/entry/syscalls/syscall_64.tbl``h]h&arch/x86/entry/syscalls/syscall_64.tbl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh!) verrà corretta di conseguenza:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubj)}(h#333 common xyzzy stub_xyzzyh]h#333 common xyzzy stub_xyzzy}hjsbah}(h]h ]h"]h$]h&]jjuh1jhjhMhjhhubh)}(hX"L'equivalente per programmi a 32-bit eseguiti su un kernel a 64-bit viene normalmente chiamato ``stub32_xyzzy`` e implementato in ``arch/x86/entry/entry_64_compat.S`` con la corrispondente voce nella tabella di syscall ``arch/x86/entry/syscalls/syscall_32.tbl`` corretta nel seguente modo::h](haL’equivalente per programmi a 32-bit eseguiti su un kernel a 64-bit viene normalmente chiamato }(hjhhhNhNubj.)}(h``stub32_xyzzy``h]h stub32_xyzzy}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh e implementato in }(hjhhhNhNubj.)}(h$``arch/x86/entry/entry_64_compat.S``h]h arch/x86/entry/entry_64_compat.S}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh5 con la corrispondente voce nella tabella di syscall }(hjhhhNhNubj.)}(h*``arch/x86/entry/syscalls/syscall_32.tbl``h]h&arch/x86/entry/syscalls/syscall_32.tbl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh corretta nel seguente modo:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubj)}(h2380 i386 xyzzy sys_xyzzy stub32_xyzzyh]h2380 i386 xyzzy sys_xyzzy stub32_xyzzy}hjsbah}(h]h ]h"]h$]h&]jjuh1jhjhMhjhhubh)}(hXSe una chiamata di sistema necessita di un livello di compatibilità (come nella sezione precedente), allora la versione ``stub32_`` deve invocare la versione ``compat_sys_`` piuttosto che quella nativa a 64-bit. In aggiunta, se l'implementazione dell'ABI x32 è diversa da quella x86_64, allora la sua voce nella tabella di syscall dovrà chiamare uno *stub* che invoca la versione ``compat_sys_``,h](hySe una chiamata di sistema necessita di un livello di compatibilità (come nella sezione precedente), allora la versione }(hj)hhhNhNubj.)}(h ``stub32_``h]hstub32_}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj)ubh deve invocare la versione }(hj)hhhNhNubj.)}(h``compat_sys_``h]h compat_sys_}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj)ubh piuttosto che quella nativa a 64-bit. In aggiunta, se l’implementazione dell’ABI x32 è diversa da quella x86_64, allora la sua voce nella tabella di syscall dovrà chiamare uno }(hj)hhhNhNubj)}(h*stub*h]hstub}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh che invoca la versione }(hj)hhhNhNubj.)}(h``compat_sys_``h]h compat_sys_}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj)ubh,}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hX{Per completezza, sarebbe carino impostare una mappatura cosicché *user-mode* Linux (UML) continui a funzionare -- la sua tabella di syscall farà riferimento a stub_xyzzy, ma UML non include l'implementazione in ``arch/x86/entry/entry_64.S`` (perché UML simula i registri eccetera). Correggerlo è semplice, basta aggiungere una #define in ``arch/x86/um/sys_call_table_64.c``::h](hBPer completezza, sarebbe carino impostare una mappatura cosicché }(hjhhhNhNubj)}(h *user-mode*h]h user-mode}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh Linux (UML) continui a funzionare -- la sua tabella di syscall farà riferimento a stub_xyzzy, ma UML non include l’implementazione in }(hjhhhNhNubj.)}(h``arch/x86/entry/entry_64.S``h]harch/x86/entry/entry_64.S}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubhd (perché UML simula i registri eccetera). Correggerlo è semplice, basta aggiungere una #define in }(hjhhhNhNubj.)}(h#``arch/x86/um/sys_call_table_64.c``h]harch/x86/um/sys_call_table_64.c}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubj)}(h#define stub_xyzzy sys_xyzzyh]h#define stub_xyzzy sys_xyzzy}hjsbah}(h]h ]h"]h$]h&]jjuh1jhjhMhjhhubeh}(h])chiamate-di-sistema-che-ritornano-altroveah ]h"])chiamate di sistema che ritornano altroveah$]h&]uh1jhjhhhjhMubj)}(hhh](j)}(hAltri dettaglih]hAltri dettagli}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubh)}(hLa maggior parte dei kernel tratta le chiamate di sistema allo stesso modo, ma possono esserci rare eccezioni per le quali potrebbe essere necessario l'aggiornamento della vostra chiamata di sistema.h]hLa maggior parte dei kernel tratta le chiamate di sistema allo stesso modo, ma possono esserci rare eccezioni per le quali potrebbe essere necessario l’aggiornamento della vostra chiamata di sistema.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hXIl sotto-sistema di controllo (*audit subsystem*) è uno di questi casi speciali; esso include (per architettura) funzioni che classificano alcuni tipi di chiamate di sistema -- in particolare apertura dei file (``open``/``openat``), esecuzione dei programmi (``execve``/``exeveat``) oppure multiplatori di socket (``socketcall``). Se la vostra nuova chiamata di sistema è simile ad una di queste, allora il sistema di controllo dovrebbe essere aggiornato.h](hIl sotto-sistema di controllo (}(hjhhhNhNubj)}(h*audit subsystem*h]haudit subsystem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) è uno di questi casi speciali; esso include (per architettura) funzioni che classificano alcuni tipi di chiamate di sistema -- in particolare apertura dei file (}(hjhhhNhNubj.)}(h``open``h]hopen}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}(hjhhhNhNubj.)}(h ``openat``h]hopenat}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh), esecuzione dei programmi (}(hjhhhNhNubj.)}(h ``execve``h]hexecve}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh/}hjsbj.)}(h ``exeveat``h]hexeveat}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh!) oppure multiplatori di socket (}(hjhhhNhNubj.)}(h``socketcall``h]h socketcall}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh). Se la vostra nuova chiamata di sistema è simile ad una di queste, allora il sistema di controllo dovrebbe essere aggiornato.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hPiù in generale, se esiste una chiamata di sistema che è simile alla vostra, vale la pena fare una ricerca con ``grep`` su tutto il kernel per la chiamata di sistema esistente per verificare che non ci siano altri casi speciali.h](hqPiù in generale, se esiste una chiamata di sistema che è simile alla vostra, vale la pena fare una ricerca con }(hjrhhhNhNubj.)}(h``grep``h]hgrep}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjrubhm su tutto il kernel per la chiamata di sistema esistente per verificare che non ci siano altri casi speciali.}(hjrhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubeh}(h]altri-dettagliah ]h"]altri dettagliah$]h&]uh1jhjhhhjhMubj)}(hhh](j)}(hVerificah]hVerifica}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubh)}(hXCUna nuova chiamata di sistema dev'essere, ovviamente, provata; è utile fornire ai revisori un programma in spazio utente che mostri l'uso della chiamata di sistema. Un buon modo per combinare queste cose è quello di aggiungere un semplice programma di auto-verifica in una nuova cartella in ``tools/testing/selftests/``.h](hX*Una nuova chiamata di sistema dev’essere, ovviamente, provata; è utile fornire ai revisori un programma in spazio utente che mostri l’uso della chiamata di sistema. Un buon modo per combinare queste cose è quello di aggiungere un semplice programma di auto-verifica in una nuova cartella in }(hjhhhNhNubj.)}(h``tools/testing/selftests/``h]htools/testing/selftests/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hX[Per una nuova chiamata di sistema, ovviamente, non ci sarà alcuna funzione in libc e quindi il programma di verifica dovrà invocarla usando ``syscall()``; inoltre, se la nuova chiamata di sistema prevede un nuova struttura dati visibile in spazio utente, il file d'intestazione necessario dev'essere installato al fine di compilare il programma.h](hPer una nuova chiamata di sistema, ovviamente, non ci sarà alcuna funzione in libc e quindi il programma di verifica dovrà invocarla usando }(hjhhhNhNubj.)}(h ``syscall()``h]h syscall()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh; inoltre, se la nuova chiamata di sistema prevede un nuova struttura dati visibile in spazio utente, il file d’intestazione necessario dev’essere installato al fine di compilare il programma.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM hjhhubh)}(hAssicuratevi che il programma di auto-verifica possa essere eseguito correttamente su tutte le architetture supportate. Per esempio, verificate che funzioni quando viene compilato per x86_64 (-m64), x86_32 (-m32) e x32 (-mx32).h]hAssicuratevi che il programma di auto-verifica possa essere eseguito correttamente su tutte le architetture supportate. Per esempio, verificate che funzioni quando viene compilato per x86_64 (-m64), x86_32 (-m32) e x32 (-mx32).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjhhubh)}(hAl fine di una più meticolosa ed estesa verifica della nuova funzionalità, dovreste considerare l'aggiunta di nuove verifica al progetto 'Linux Test', oppure al progetto xfstests per cambiamenti relativi al filesystem.h]hAl fine di una più meticolosa ed estesa verifica della nuova funzionalità, dovreste considerare l’aggiunta di nuove verifica al progetto ‘Linux Test’, oppure al progetto xfstests per cambiamenti relativi al filesystem.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjhhubj)}(h`- https://linux-test-project.github.io/ - git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git h]j)}(hhh](j)}(h%https://linux-test-project.github.io/h]h)}(hjh]jZ)}(hjh]h%https://linux-test-project.github.io/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(h6git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git h]h)}(h4git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.gith]h4git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhj/ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]jjuh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjhhubeh}(h]verificaah ]h"]verificaah$]h&]uh1jhjhhhjhMubj)}(hhh](j)}(h Pagine manh]h Pagine man}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[hhhjhMubh)}(hX6Tutte le nuove chiamate di sistema dovrebbero avere una pagina man completa, idealmente usando i marcatori groff, ma anche il puro testo può andare. Se state usando groff, è utile che includiate nella email di presentazione una versione già convertita in formato ASCII: semplificherà la vita dei revisori.h]hX6Tutte le nuove chiamate di sistema dovrebbero avere una pagina man completa, idealmente usando i marcatori groff, ma anche il puro testo può andare. Se state usando groff, è utile che includiate nella email di presentazione una versione già convertita in formato ASCII: semplificherà la vita dei revisori.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhj[hhubh)}(hLe pagine man dovrebbero essere in copia-conoscenza verso linux-man@vger.kernel.org Per maggiori dettagli, leggere https://www.kernel.org/doc/man-pages/patches.htmlh](h:Le pagine man dovrebbero essere in copia-conoscenza verso }(hjzhhhNhNubjZ)}(hlinux-man@vger.kernel.orgh]hlinux-man@vger.kernel.org}(hjhhhNhNubah}(h]h ]h"]h$]h&]refuri mailto:linux-man@vger.kernel.orguh1jYhjzubh Per maggiori dettagli, leggere }(hjzhhhNhNubjZ)}(h1https://www.kernel.org/doc/man-pages/patches.htmlh]h1https://www.kernel.org/doc/man-pages/patches.html}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjzubeh}(h]h ]h"]h$]h&]uh1hhjhM$hj[hhubeh}(h] pagine-manah ]h"] pagine manah$]h&]uh1jhjhhhjhMubj)}(hhh](j)}(h+Non invocate chiamate di sistema dal kernelh]h+Non invocate chiamate di sistema dal kernel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM+ubh)}(hX!Le chiamate di sistema sono, come già detto prima, punti di interazione fra lo spazio utente e il kernel. Perciò, le chiamate di sistema come ``sys_xyzzy()`` o ``compat_sys_xyzzy()`` dovrebbero essere chiamate solo dallo spazio utente attraverso la tabella syscall, ma non da nessun altro punto nel kernel. Se la nuova funzionalità è utile all'interno del kernel, per esempio dev'essere condivisa fra una vecchia e una nuova chiamata di sistema o dev'essere utilizzata da una chiamata di sistema e la sua variante compatibile, allora dev'essere implementata come una funzione di supporto (*helper function*) (per esempio ``ksys_xyzzy()``). Questa funzione potrà essere chiamata dallo *stub* (``sys_xyzzy()``), dalla variante compatibile (``compat_sys_xyzzy()``), e/o da altri parti del kernel.h](hLe chiamate di sistema sono, come già detto prima, punti di interazione fra lo spazio utente e il kernel. Perciò, le chiamate di sistema come }(hjhhhNhNubj.)}(h``sys_xyzzy()``h]h sys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh o }(hjhhhNhNubj.)}(h``compat_sys_xyzzy()``h]hcompat_sys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubhX dovrebbero essere chiamate solo dallo spazio utente attraverso la tabella syscall, ma non da nessun altro punto nel kernel. Se la nuova funzionalità è utile all’interno del kernel, per esempio dev’essere condivisa fra una vecchia e una nuova chiamata di sistema o dev’essere utilizzata da una chiamata di sistema e la sua variante compatibile, allora dev’essere implementata come una funzione di supporto (}(hjhhhNhNubj)}(h*helper function*h]hhelper function}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh) (per esempio }(hjhhhNhNubj.)}(h``ksys_xyzzy()``h]h ksys_xyzzy()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh1). Questa funzione potrà essere chiamata dallo }(hjhhhNhNubj)}(h*stub*h]hstub}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh (}(hjhhhNhNubj.)}(h``sys_xyzzy()``h]h sys_xyzzy()}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh), dalla variante compatibile (}(hjhhhNhNubj.)}(h``compat_sys_xyzzy()``h]hcompat_sys_xyzzy()}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh!), e/o da altri parti del kernel.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM-hjhhubh)}(hXSui sistemi x86 a 64-bit, a partire dalla versione v4.17 è un requisito fondamentale quello di non invocare chiamate di sistema all'interno del kernel. Esso usa una diversa convenzione per l'invocazione di chiamate di sistema dove ``struct pt_regs`` viene decodificata al volo in una funzione che racchiude la chiamata di sistema la quale verrà eseguita successivamente. Questo significa che verranno passati solo i parametri che sono davvero necessari ad una specifica chiamata di sistema, invece che riempire ogni volta 6 registri del processore con contenuti presi dallo spazio utente (potrebbe causare seri problemi nella sequenza di chiamate).h](hSui sistemi x86 a 64-bit, a partire dalla versione v4.17 è un requisito fondamentale quello di non invocare chiamate di sistema all’interno del kernel. Esso usa una diversa convenzione per l’invocazione di chiamate di sistema dove }(hjPhhhNhNubj.)}(h``struct pt_regs``h]hstruct pt_regs}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjPubhX viene decodificata al volo in una funzione che racchiude la chiamata di sistema la quale verrà eseguita successivamente. Questo significa che verranno passati solo i parametri che sono davvero necessari ad una specifica chiamata di sistema, invece che riempire ogni volta 6 registri del processore con contenuti presi dallo spazio utente (potrebbe causare seri problemi nella sequenza di chiamate).}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM9hjhhubh)}(hInoltre, le regole su come i dati possano essere usati potrebbero differire fra il kernel e l'utente. Questo è un altro motivo per cui invocare ``sys_xyzzy()`` è generalmente una brutta idea.h](hInoltre, le regole su come i dati possano essere usati potrebbero differire fra il kernel e l’utente. Questo è un altro motivo per cui invocare }(hjphhhNhNubj.)}(h``sys_xyzzy()``h]h sys_xyzzy()}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjpubh! è generalmente una brutta idea.}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMChjhhubh)}(hEccezioni a questa regola vengono accettate solo per funzioni d'architetture che surclassano quelle generiche, per funzioni d'architettura di compatibilità, o per altro codice in arch/h]hEccezioni a questa regola vengono accettate solo per funzioni d’architetture che surclassano quelle generiche, per funzioni d’architettura di compatibilità, o per altro codice in arch/}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMGhjhhubeh}(h]+non-invocate-chiamate-di-sistema-dal-kernelah ]h"]+non invocate chiamate di sistema dal kernelah$]h&]uh1jhjhhhjhM+ubj)}(hhh](j)}(hRiferimenti e fontih]hRiferimenti e fonti}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMMubj)}(hX - Articolo di Michael Kerris su LWN sull'uso dell'argomento flags nelle chiamate di sistema: https://lwn.net/Articles/585415/ - Articolo di Michael Kerris su LWN su come gestire flag sconosciuti in una chiamata di sistema: https://lwn.net/Articles/588444/ - Articolo di Jake Edge su LWN che descrive i limiti degli argomenti a 64-bit delle chiamate di sistema: https://lwn.net/Articles/311630/ - Una coppia di articoli di David Drysdale che descrivono i dettagli del percorso implementativo di una chiamata di sistema per la versione v3.14: - https://lwn.net/Articles/604287/ - https://lwn.net/Articles/604515/ - Requisiti specifici alle architetture sono discussi nella pagina man :manpage:`syscall(2)` : http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES - Collezione di email di Linux Torvalds sui problemi relativi a ``ioctl()``: http://yarchive.net/comp/linux/ioctl.html - "Come non inventare interfacce del kernel", Arnd Bergmann, http://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf - Articolo di Michael Kerris su LWN sull'evitare nuovi usi di CAP_SYS_ADMIN: https://lwn.net/Articles/486306/ - Raccomandazioni da Andrew Morton circa il fatto che tutte le informazioni su una nuova chiamata di sistema dovrebbero essere contenute nello stesso filone di discussione di email: https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org - Raccomandazioni da Michael Kerrisk circa il fatto che le nuove chiamate di sistema dovrebbero avere una pagina man: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com - Consigli da Thomas Gleixner sul fatto che il collegamento all'architettura x86 dovrebbe avvenire in un *commit* differente: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos - Consigli da Greg Kroah-Hartman circa la bontà d'avere una pagina man e un programma di auto-verifica per le nuove chiamate di sistema: https://lore.kernel.org/r/20140320025530.GA25469@kroah.com - Discussione di Michael Kerrisk sulle nuove chiamate di sistema contro le estensioni :manpage:`prctl(2)`: https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com - Consigli da Ingo Molnar che le chiamate di sistema con più argomenti dovrebbero incapsularli in una struttura che includa un argomento *size* per garantire l'estensibilità futura: https://lore.kernel.org/r/20150730083831.GA22182@gmail.com - Un certo numero di casi strani emersi dall'uso (riuso) dei flag O_*: - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check") - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict") - commit bb458c644a59 ("Safer ABI for O_TMPFILE") - Discussion from Matthew Wilcox about restrictions on 64-bit arguments: https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org - Raccomandazioni da Greg Kroah-Hartman sul fatto che i flag sconosciuti dovrebbero essere controllati: https://lore.kernel.org/r/20140717193330.GB4703@kroah.com - Raccomandazioni da Linus Torvalds che le chiamate di sistema x32 dovrebbero favorire la compatibilità con le versioni a 64-bit piuttosto che quelle a 32-bit: https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.comh]j)}(hhh](j)}(h{Articolo di Michael Kerris su LWN sull'uso dell'argomento flags nelle chiamate di sistema: https://lwn.net/Articles/585415/h]h)}(h{Articolo di Michael Kerris su LWN sull'uso dell'argomento flags nelle chiamate di sistema: https://lwn.net/Articles/585415/h](h_Articolo di Michael Kerris su LWN sull’uso dell’argomento flags nelle chiamate di sistema: }(hjhhhNhNubjZ)}(h https://lwn.net/Articles/585415/h]h https://lwn.net/Articles/585415/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhMOhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hArticolo di Michael Kerris su LWN su come gestire flag sconosciuti in una chiamata di sistema: https://lwn.net/Articles/588444/h]h)}(hArticolo di Michael Kerris su LWN su come gestire flag sconosciuti in una chiamata di sistema: https://lwn.net/Articles/588444/h](h_Articolo di Michael Kerris su LWN su come gestire flag sconosciuti in una chiamata di sistema: }(hjhhhNhNubjZ)}(h https://lwn.net/Articles/588444/h]h https://lwn.net/Articles/588444/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhMQhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hArticolo di Jake Edge su LWN che descrive i limiti degli argomenti a 64-bit delle chiamate di sistema: https://lwn.net/Articles/311630/h]h)}(hArticolo di Jake Edge su LWN che descrive i limiti degli argomenti a 64-bit delle chiamate di sistema: https://lwn.net/Articles/311630/h](hgArticolo di Jake Edge su LWN che descrive i limiti degli argomenti a 64-bit delle chiamate di sistema: }(hjhhhNhNubjZ)}(h https://lwn.net/Articles/311630/h]h https://lwn.net/Articles/311630/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhMShj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hUna coppia di articoli di David Drysdale che descrivono i dettagli del percorso implementativo di una chiamata di sistema per la versione v3.14: - https://lwn.net/Articles/604287/ - https://lwn.net/Articles/604515/ h](h)}(hUna coppia di articoli di David Drysdale che descrivono i dettagli del percorso implementativo di una chiamata di sistema per la versione v3.14:h]hUna coppia di articoli di David Drysdale che descrivono i dettagli del percorso implementativo di una chiamata di sistema per la versione v3.14:}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMUhj3ubj)}(hF- https://lwn.net/Articles/604287/ - https://lwn.net/Articles/604515/ h]j)}(hhh](j)}(h https://lwn.net/Articles/604287/h]h)}(hjNh]jZ)}(hjNh]h https://lwn.net/Articles/604287/}(hjShhhNhNubah}(h]h ]h"]h$]h&]refurijNuh1jYhjPubah}(h]h ]h"]h$]h&]uh1hhjhMXhjLubah}(h]h ]h"]h$]h&]uh1jhjIubj)}(h!https://lwn.net/Articles/604515/ h]h)}(h https://lwn.net/Articles/604515/h]jZ)}(hjsh]h https://lwn.net/Articles/604515/}(hjuhhhNhNubah}(h]h ]h"]h$]h&]refurijsuh1jYhjqubah}(h]h ]h"]h$]h&]uh1hhjhMYhjmubah}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ]h"]h$]h&]jjuh1jhjhMXhjEubah}(h]h ]h"]h$]h&]uh1jhjhMXhj3ubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hRequisiti specifici alle architetture sono discussi nella pagina man :manpage:`syscall(2)` : http://man7.org/linux/man-pages/man2/syscall.2.html#NOTESh]h)}(hRequisiti specifici alle architetture sono discussi nella pagina man :manpage:`syscall(2)` : http://man7.org/linux/man-pages/man2/syscall.2.html#NOTESh](hERequisiti specifici alle architetture sono discussi nella pagina man }(hjhhhNhNubj~)}(h:manpage:`syscall(2)`h]h syscall(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjj syscall(2)jsyscalljjuh1j}hjubh : }(hjhhhNhNubjZ)}(h9http://man7.org/linux/man-pages/man2/syscall.2.html#NOTESh]h9http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhM[hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(htCollezione di email di Linux Torvalds sui problemi relativi a ``ioctl()``: http://yarchive.net/comp/linux/ioctl.htmlh]h)}(htCollezione di email di Linux Torvalds sui problemi relativi a ``ioctl()``: http://yarchive.net/comp/linux/ioctl.htmlh](h>Collezione di email di Linux Torvalds sui problemi relativi a }(hjhhhNhNubj.)}(h ``ioctl()``h]hioctl()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh: }(hjhhhNhNubjZ)}(h)http://yarchive.net/comp/linux/ioctl.htmlh]h)http://yarchive.net/comp/linux/ioctl.html}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhM^hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hy"Come non inventare interfacce del kernel", Arnd Bergmann, http://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdfh]h)}(hy"Come non inventare interfacce del kernel", Arnd Bergmann, http://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdfh](h?“Come non inventare interfacce del kernel”, Arnd Bergmann, }(hjhhhNhNubjZ)}(h>http://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdfh]h>http://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf}(hj!hhhNhNubah}(h]h ]h"]h$]h&]refurij#uh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhM`hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hkArticolo di Michael Kerris su LWN sull'evitare nuovi usi di CAP_SYS_ADMIN: https://lwn.net/Articles/486306/h]h)}(hkArticolo di Michael Kerris su LWN sull'evitare nuovi usi di CAP_SYS_ADMIN: https://lwn.net/Articles/486306/h](hMArticolo di Michael Kerris su LWN sull’evitare nuovi usi di CAP_SYS_ADMIN: }(hj@hhhNhNubjZ)}(h https://lwn.net/Articles/486306/h]h https://lwn.net/Articles/486306/}(hjHhhhNhNubah}(h]h ]h"]h$]h&]refurijJuh1jYhj@ubeh}(h]h ]h"]h$]h&]uh1hhjhMbhj<ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hX Raccomandazioni da Andrew Morton circa il fatto che tutte le informazioni su una nuova chiamata di sistema dovrebbero essere contenute nello stesso filone di discussione di email: https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.orgh]h)}(hX Raccomandazioni da Andrew Morton circa il fatto che tutte le informazioni su una nuova chiamata di sistema dovrebbero essere contenute nello stesso filone di discussione di email: https://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.orgh](hRaccomandazioni da Andrew Morton circa il fatto che tutte le informazioni su una nuova chiamata di sistema dovrebbero essere contenute nello stesso filone di discussione di email: }(hjghhhNhNubjZ)}(hVhttps://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.orgh]hVhttps://lore.kernel.org/r/20140724144747.3041b208832bbdf9fbce5d96@linux-foundation.org}(hjohhhNhNubah}(h]h ]h"]h$]h&]refurijquh1jYhjgubeh}(h]h ]h"]h$]h&]uh1hhjhMdhjcubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hRaccomandazioni da Michael Kerrisk circa il fatto che le nuove chiamate di sistema dovrebbero avere una pagina man: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.comh]h)}(hRaccomandazioni da Michael Kerrisk circa il fatto che le nuove chiamate di sistema dovrebbero avere una pagina man: https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.comh](htRaccomandazioni da Michael Kerrisk circa il fatto che le nuove chiamate di sistema dovrebbero avere una pagina man: }(hjhhhNhNubjZ)}(h\https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.comh]h\https://lore.kernel.org/r/CAKgNAkgMA39AfoSoA5Pe1r9N+ZzfYQNvNPvcRN7tOvRb8+v06Q@mail.gmail.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhMghjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hConsigli da Thomas Gleixner sul fatto che il collegamento all'architettura x86 dovrebbe avvenire in un *commit* differente: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanosh]h)}(hConsigli da Thomas Gleixner sul fatto che il collegamento all'architettura x86 dovrebbe avvenire in un *commit* differente: https://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanosh](hiConsigli da Thomas Gleixner sul fatto che il collegamento all’architettura x86 dovrebbe avvenire in un }(hjhhhNhNubj)}(h*commit*h]hcommit}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh differente: }(hjhhhNhNubjZ)}(hBhttps://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanosh]hBhttps://lore.kernel.org/r/alpine.DEB.2.11.1411191249560.3909@nanos}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhMihjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hConsigli da Greg Kroah-Hartman circa la bontà d'avere una pagina man e un programma di auto-verifica per le nuove chiamate di sistema: https://lore.kernel.org/r/20140320025530.GA25469@kroah.comh]h)}(hConsigli da Greg Kroah-Hartman circa la bontà d'avere una pagina man e un programma di auto-verifica per le nuove chiamate di sistema: https://lore.kernel.org/r/20140320025530.GA25469@kroah.comh](hConsigli da Greg Kroah-Hartman circa la bontà d’avere una pagina man e un programma di auto-verifica per le nuove chiamate di sistema: }(hjhhhNhNubjZ)}(h:https://lore.kernel.org/r/20140320025530.GA25469@kroah.comh]h:https://lore.kernel.org/r/20140320025530.GA25469@kroah.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhMlhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hDiscussione di Michael Kerrisk sulle nuove chiamate di sistema contro le estensioni :manpage:`prctl(2)`: https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.comh]h)}(hDiscussione di Michael Kerrisk sulle nuove chiamate di sistema contro le estensioni :manpage:`prctl(2)`: https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.comh](hTDiscussione di Michael Kerrisk sulle nuove chiamate di sistema contro le estensioni }(hjhhhNhNubj~)}(h:manpage:`prctl(2)`h]hprctl(2)}(hjhhhNhNubah}(h]h ]j}ah"]h$]h&]jjjprctl(2)jprctljjuh1j}hjubh: }(hjhhhNhNubjZ)}(h\https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.comh]h\https://lore.kernel.org/r/CAHO5Pa3F2MjfTtfNxa8LbnkeeU8=YJ+9tDqxZpw7Gz59E-4AUg@mail.gmail.com}(hj1hhhNhNubah}(h]h ]h"]h$]h&]refurij3uh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhMohjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hConsigli da Ingo Molnar che le chiamate di sistema con più argomenti dovrebbero incapsularli in una struttura che includa un argomento *size* per garantire l'estensibilità futura: https://lore.kernel.org/r/20150730083831.GA22182@gmail.comh]h)}(hConsigli da Ingo Molnar che le chiamate di sistema con più argomenti dovrebbero incapsularli in una struttura che includa un argomento *size* per garantire l'estensibilità futura: https://lore.kernel.org/r/20150730083831.GA22182@gmail.comh](hConsigli da Ingo Molnar che le chiamate di sistema con più argomenti dovrebbero incapsularli in una struttura che includa un argomento }(hjPhhhNhNubj)}(h*size*h]hsize}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubh* per garantire l’estensibilità futura: }(hjPhhhNhNubjZ)}(h:https://lore.kernel.org/r/20150730083831.GA22182@gmail.comh]h:https://lore.kernel.org/r/20150730083831.GA22182@gmail.com}(hjjhhhNhNubah}(h]h ]h"]h$]h&]refurijluh1jYhjPubeh}(h]h ]h"]h$]h&]uh1hhjhMqhjLubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hX&Un certo numero di casi strani emersi dall'uso (riuso) dei flag O_*: - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check") - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict") - commit bb458c644a59 ("Safer ABI for O_TMPFILE") h](h)}(hDUn certo numero di casi strani emersi dall'uso (riuso) dei flag O_*:h]hFUn certo numero di casi strani emersi dall’uso (riuso) dei flag O_*:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMuhjubj)}(h- commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check") - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict") - commit bb458c644a59 ("Safer ABI for O_TMPFILE") h]j)}(hhh](j)}(hPcommit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check")h]h)}(hPcommit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness check")h]hTcommit 75069f2b5bfb (“vfs: renumber FMODE_NONOTIFY and add to uniqueness check”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMwhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hOcommit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict")h]h)}(hOcommit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict")h]hScommit 12ed2e36c98a (“fanotify: FMODE_NONOTIFY and __O_SYNC in sparc conflict”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMyhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h0commit bb458c644a59 ("Safer ABI for O_TMPFILE") h]h)}(h/commit bb458c644a59 ("Safer ABI for O_TMPFILE")h]h3commit bb458c644a59 (“Safer ABI for O_TMPFILE”)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM{hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhMwhjubah}(h]h ]h"]h$]h&]uh1jhjhMwhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(hDiscussion from Matthew Wilcox about restrictions on 64-bit arguments: https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.orgFh]h)}(hDiscussion from Matthew Wilcox about restrictions on 64-bit arguments: https://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.orgh](hGDiscussion from Matthew Wilcox about restrictions on 64-bit arguments: }(hjhhhNhNubjZ)}(hAhttps://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.orgh]hAhttps://lore.kernel.org/r/20081212152929.GM26095@parisc-linux.org}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jYhjubeh}(h]h ]h"]h$]h&]uh1hhjhM}hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hRaccomandazioni da Greg Kroah-Hartman sul fatto che i flag sconosciuti dovrebbero essere controllati: https://lore.kernel.org/r/20140717193330.GB4703@kroah.comh]h)}(hRaccomandazioni da Greg Kroah-Hartman sul fatto che i flag sconosciuti dovrebbero essere controllati: https://lore.kernel.org/r/20140717193330.GB4703@kroah.comh](hfRaccomandazioni da Greg Kroah-Hartman sul fatto che i flag sconosciuti dovrebbero essere controllati: }(hj#hhhNhNubjZ)}(h9https://lore.kernel.org/r/20140717193330.GB4703@kroah.comh]h9https://lore.kernel.org/r/20140717193330.GB4703@kroah.com}(hj+hhhNhNubah}(h]h ]h"]h$]h&]refurij-uh1jYhj#ubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hRaccomandazioni da Linus Torvalds che le chiamate di sistema x32 dovrebbero favorire la compatibilità con le versioni a 64-bit piuttosto che quelle a 32-bit: https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.comh]h)}(hRaccomandazioni da Linus Torvalds che le chiamate di sistema x32 dovrebbero favorire la compatibilità con le versioni a 64-bit piuttosto che quelle a 32-bit: https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.comh](hRaccomandazioni da Linus Torvalds che le chiamate di sistema x32 dovrebbero favorire la compatibilità con le versioni a 64-bit piuttosto che quelle a 32-bit: }(hjJhhhNhNubjZ)}(h\https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.comh]h\https://lore.kernel.org/r/CA+55aFxfmwfB7jbbrXxa=K7VBYPfAvmu3XOkGrLbB1UFjX1+Ew@mail.gmail.com}(hjRhhhNhNubah}(h]h ]h"]h$]h&]refurijTuh1jYhjJubeh}(h]h ]h"]h$]h&]uh1hhjhMhjFubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]jjuh1jhjhMOhjubah}(h]h ]h"]h$]h&]uh1jhjhMOhjhhubeh}(h]riferimenti-e-fontiah ]h"]riferimenti e fontiah$]h&]uh1jhjhhhjhMMubeh}(h]((aggiungere-una-nuova-chiamata-di-sistemajeh ]h"]((aggiungere una nuova chiamata di sistemait_addsyscallseh$]h&]uh1jhhhhhjhK expect_referenced_by_name}jjsexpect_referenced_by_id}jjsubeh}(h]h ]h"]h$]h&]sourcejuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(jN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcej _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}j]jasnameids}(jjjjjjj.j+jjj j j j j] jZ jjjjjjjjjXjUjjjjj~j{u nametypes}(jjjj.jj j j] jjjjjXjjj~uh}(jjjjjjj+jjj1j jj j jZ j jj` jjjjjjjUjjj[jjj{ju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages]hsystem_message)}(hhh]h)}(hhh]h4Hyperlink target "it-addsyscalls" is not referenced.}hjsbah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcejlineKuh1juba transformerN include_log]