18c2ecf20Sopenharmony_ci.. include:: ../disclaimer-ita.rst 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ci:Original: :ref:`Documentation/process/stable-api-nonsense.rst <stable_api_nonsense>` 48c2ecf20Sopenharmony_ci:Translator: Federico Vaga <federico.vaga@vaga.pv.it> 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci.. _it_stable_api_nonsense: 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ciL'interfaccia dei driver per il kernel Linux 98c2ecf20Sopenharmony_ci============================================ 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci(tutte le risposte alle vostre domande e altro) 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ciGreg Kroah-Hartman <greg@kroah.com> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ciQuesto è stato scritto per cercare di spiegare perché Linux **non ha 168c2ecf20Sopenharmony_ciun'interfaccia binaria, e non ha nemmeno un'interfaccia stabile**. 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci.. note:: 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci Questo articolo parla di interfacce **interne al kernel**, non delle 218c2ecf20Sopenharmony_ci interfacce verso lo spazio utente. 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci L'interfaccia del kernel verso lo spazio utente è quella usata dai 248c2ecf20Sopenharmony_ci programmi, ovvero le chiamate di sistema. Queste interfacce sono **molto** 258c2ecf20Sopenharmony_ci stabili nel tempo e non verranno modificate. Ho vecchi programmi che sono 268c2ecf20Sopenharmony_ci stati compilati su un kernel 0.9 (circa) e tuttora funzionano sulle versioni 278c2ecf20Sopenharmony_ci 2.6 del kernel. Queste interfacce sono quelle che gli utenti e i 288c2ecf20Sopenharmony_ci programmatori possono considerare stabili. 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ciRiepilogo generale 318c2ecf20Sopenharmony_ci------------------ 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ciPensate di volere un'interfaccia del kernel stabile, ma in realtà non la 348c2ecf20Sopenharmony_civolete, e nemmeno sapete di non volerla. Quello che volete è un driver 358c2ecf20Sopenharmony_cistabile che funzioni, e questo può essere ottenuto solo se il driver si trova 368c2ecf20Sopenharmony_cinei sorgenti del kernel. Ci sono altri vantaggi nell'avere il proprio driver 378c2ecf20Sopenharmony_cinei sorgenti del kernel, ognuno dei quali hanno reso Linux un sistema operativo 388c2ecf20Sopenharmony_cirobusto, stabile e maturo; questi sono anche i motivi per cui avete scelto 398c2ecf20Sopenharmony_ciLinux. 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ciIntroduzione 428c2ecf20Sopenharmony_ci------------ 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ciSolo le persone un po' strambe vorrebbero scrivere driver per il kernel con 458c2ecf20Sopenharmony_cila costante preoccupazione per i cambiamenti alle interfacce interne. Per il 468c2ecf20Sopenharmony_ciresto del mondo, queste interfacce sono invisibili o non di particolare 478c2ecf20Sopenharmony_ciinteresse. 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ciInnanzitutto, non tratterò **alcun** problema legale riguardante codice 508c2ecf20Sopenharmony_cichiuso, nascosto, avvolto, blocchi binari, o qualsia altra cosa che descrive 518c2ecf20Sopenharmony_cidriver che non hanno i propri sorgenti rilasciati con licenza GPL. Per favore 528c2ecf20Sopenharmony_cifate riferimento ad un avvocato per qualsiasi questione legale, io sono un 538c2ecf20Sopenharmony_ciprogrammatore e perciò qui vi parlerò soltanto delle questioni tecniche (non 548c2ecf20Sopenharmony_ciper essere superficiali sui problemi legali, sono veri e dovete esserne a 558c2ecf20Sopenharmony_ciconoscenza in ogni circostanza). 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ciDunque, ci sono due tematiche principali: interfacce binarie del kernel e 588c2ecf20Sopenharmony_ciinterfacce stabili nei sorgenti. Ognuna dipende dall'altra, ma discuteremo 598c2ecf20Sopenharmony_ciprima delle cose binarie per toglierle di mezzo. 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ciInterfaccia binaria del kernel 628c2ecf20Sopenharmony_ci------------------------------ 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ciSupponiamo d'avere un'interfaccia stabile nei sorgenti del kernel, di 658c2ecf20Sopenharmony_ciconseguenza un'interfaccia binaria dovrebbe essere anche'essa stabile, giusto? 668c2ecf20Sopenharmony_ciSbagliato. Prendete in considerazione i seguenti fatti che riguardano il 678c2ecf20Sopenharmony_cikernel Linux: 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci - A seconda della versione del compilatore C che state utilizzando, diverse 708c2ecf20Sopenharmony_ci strutture dati del kernel avranno un allineamento diverso, e possibilmente 718c2ecf20Sopenharmony_ci un modo diverso di includere le funzioni (renderle inline oppure no). 728c2ecf20Sopenharmony_ci L'organizzazione delle singole funzioni non è poi così importante, ma la 738c2ecf20Sopenharmony_ci spaziatura (*padding*) nelle strutture dati, invece, lo è. 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci - In base alle opzioni che sono state selezionate per generare il kernel, 768c2ecf20Sopenharmony_ci un certo numero di cose potrebbero succedere: 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci - strutture dati differenti potrebbero contenere campi differenti 798c2ecf20Sopenharmony_ci - alcune funzioni potrebbero non essere implementate (per esempio, 808c2ecf20Sopenharmony_ci alcuni *lock* spariscono se compilati su sistemi mono-processore) 818c2ecf20Sopenharmony_ci - la memoria interna del kernel può essere allineata in differenti modi 828c2ecf20Sopenharmony_ci a seconda delle opzioni di compilazione. 838c2ecf20Sopenharmony_ci 848c2ecf20Sopenharmony_ci - Linux funziona su una vasta gamma di architetture di processore. Non esiste 858c2ecf20Sopenharmony_ci alcuna possibilità che il binario di un driver per un'architettura funzioni 868c2ecf20Sopenharmony_ci correttamente su un'altra. 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ciAlcuni di questi problemi possono essere risolti compilando il proprio modulo 898c2ecf20Sopenharmony_cicon la stessa identica configurazione del kernel, ed usando la stessa versione 908c2ecf20Sopenharmony_cidel compilatore usato per compilare il kernel. Questo è sufficiente se volete 918c2ecf20Sopenharmony_cifornire un modulo per uno specifico rilascio su una specifica distribuzione 928c2ecf20Sopenharmony_ciLinux. Ma moltiplicate questa singola compilazione per il numero di 938c2ecf20Sopenharmony_cidistribuzioni Linux e il numero dei rilasci supportati da quest'ultime e vi 948c2ecf20Sopenharmony_citroverete rapidamente in un incubo fatto di configurazioni e piattaforme 958c2ecf20Sopenharmony_cihardware (differenti processori con differenti opzioni); dunque, anche per il 968c2ecf20Sopenharmony_cisingolo rilascio di un modulo, dovreste creare differenti versioni dello 978c2ecf20Sopenharmony_cistesso. 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ciFidatevi, se tenterete questa via, col tempo, diventerete pazzi; l'ho imparato 1008c2ecf20Sopenharmony_cia mie spese molto tempo fa... 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci 1038c2ecf20Sopenharmony_ciInterfaccia stabile nei sorgenti del kernel 1048c2ecf20Sopenharmony_ci------------------------------------------- 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ciSe parlate con le persone che cercano di mantenere aggiornato un driver per 1078c2ecf20Sopenharmony_ciLinux ma che non si trova nei sorgenti, allora per queste persone l'argomento 1088c2ecf20Sopenharmony_cisarà "ostico". 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ciLo sviluppo del kernel Linux è continuo e viaggia ad un ritmo sostenuto, e non 1118c2ecf20Sopenharmony_cirallenta mai. Perciò, gli sviluppatori del kernel trovano bachi nelle 1128c2ecf20Sopenharmony_ciinterfacce attuali, o trovano modi migliori per fare le cose. Se le trovano, 1138c2ecf20Sopenharmony_ciallora le correggeranno per migliorarle. In questo frangente, i nomi delle 1148c2ecf20Sopenharmony_cifunzioni potrebbero cambiare, le strutture dati potrebbero diventare più grandi 1158c2ecf20Sopenharmony_cio più piccole, e gli argomenti delle funzioni potrebbero essere ripensati. 1168c2ecf20Sopenharmony_ciSe questo dovesse succedere, nello stesso momento, tutte le istanze dove questa 1178c2ecf20Sopenharmony_ciinterfaccia viene utilizzata verranno corrette, garantendo che tutto continui 1188c2ecf20Sopenharmony_cia funzionare senza problemi. 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ciPortiamo ad esempio l'interfaccia interna per il sottosistema USB che ha subito 1218c2ecf20Sopenharmony_citre ristrutturazioni nel corso della sua vita. Queste ristrutturazioni furono 1228c2ecf20Sopenharmony_cifatte per risolvere diversi problemi: 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci - È stato fatto un cambiamento da un flusso di dati sincrono ad uno 1258c2ecf20Sopenharmony_ci asincrono. Questo ha ridotto la complessità di molti driver e ha 1268c2ecf20Sopenharmony_ci aumentato la capacità di trasmissione di tutti i driver fino a raggiungere 1278c2ecf20Sopenharmony_ci quasi la velocità massima possibile. 1288c2ecf20Sopenharmony_ci - È stato fatto un cambiamento nell'allocazione dei pacchetti da parte del 1298c2ecf20Sopenharmony_ci sottosistema USB per conto dei driver, cosicché ora i driver devono fornire 1308c2ecf20Sopenharmony_ci più informazioni al sottosistema USB al fine di correggere un certo numero 1318c2ecf20Sopenharmony_ci di stalli. 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ciQuesto è completamente l'opposto di quello che succede in alcuni sistemi 1348c2ecf20Sopenharmony_cioperativi proprietari che hanno dovuto mantenere, nel tempo, il supporto alle 1358c2ecf20Sopenharmony_civecchie interfacce USB. I nuovi sviluppatori potrebbero usare accidentalmente 1368c2ecf20Sopenharmony_cile vecchie interfacce e sviluppare codice nel modo sbagliato, portando, di 1378c2ecf20Sopenharmony_ciconseguenza, all'instabilità del sistema. 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_ciIn entrambe gli scenari, gli sviluppatori hanno ritenuto che queste importanti 1408c2ecf20Sopenharmony_cimodifiche erano necessarie, e quindi le hanno fatte con qualche sofferenza. 1418c2ecf20Sopenharmony_ciSe Linux avesse assicurato di mantenere stabile l'interfaccia interna, si 1428c2ecf20Sopenharmony_cisarebbe dovuto procedere alla creazione di una nuova, e quelle vecchie, e 1438c2ecf20Sopenharmony_cimal funzionanti, avrebbero dovuto ricevere manutenzione, creando lavoro 1448c2ecf20Sopenharmony_ciaggiuntivo per gli sviluppatori del sottosistema USB. Dato che gli 1458c2ecf20Sopenharmony_cisviluppatori devono dedicare il proprio tempo a questo genere di lavoro, 1468c2ecf20Sopenharmony_cichiedergli di dedicarne dell'altro, senza benefici, magari gratuitamente, non 1478c2ecf20Sopenharmony_ciè contemplabile. 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ciLe problematiche relative alla sicurezza sono molto importanti per Linux. 1508c2ecf20Sopenharmony_ciQuando viene trovato un problema di sicurezza viene corretto in breve tempo. 1518c2ecf20Sopenharmony_ciA volte, per prevenire il problema di sicurezza, si sono dovute cambiare 1528c2ecf20Sopenharmony_cidelle interfacce interne al kernel. Quando è successo, allo stesso tempo, 1538c2ecf20Sopenharmony_citutti i driver che usavano quelle interfacce sono stati aggiornati, garantendo 1548c2ecf20Sopenharmony_cila correzione definitiva del problema senza doversi preoccupare di rivederlo 1558c2ecf20Sopenharmony_ciper sbaglio in futuro. Se non si fossero cambiate le interfacce interne, 1568c2ecf20Sopenharmony_cisarebbe stato impossibile correggere il problema e garantire che non si sarebbe 1578c2ecf20Sopenharmony_cipiù ripetuto. 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ciNel tempo le interfacce del kernel subiscono qualche ripulita. Se nessuno 1608c2ecf20Sopenharmony_cista più usando un'interfaccia, allora questa verrà rimossa. Questo permette 1618c2ecf20Sopenharmony_cial kernel di rimanere il più piccolo possibile, e garantisce che tutte le 1628c2ecf20Sopenharmony_cipotenziali interfacce sono state verificate nel limite del possibile (le 1638c2ecf20Sopenharmony_ciinterfacce inutilizzate sono impossibili da verificare). 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ciCosa fare 1678c2ecf20Sopenharmony_ci--------- 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ciDunque, se avete un driver per il kernel Linux che non si trova nei sorgenti 1708c2ecf20Sopenharmony_ciprincipali del kernel, come sviluppatori, cosa dovreste fare? Rilasciare un 1718c2ecf20Sopenharmony_cifile binario del driver per ogni versione del kernel e per ogni distribuzione, 1728c2ecf20Sopenharmony_ciè un incubo; inoltre, tenere il passo con tutti i cambiamenti del kernel è un 1738c2ecf20Sopenharmony_cibrutto lavoro. 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ciSemplicemente, fate sì che il vostro driver per il kernel venga incluso nei 1768c2ecf20Sopenharmony_cisorgenti principali (ricordatevi, stiamo parlando di driver rilasciati secondo 1778c2ecf20Sopenharmony_ciuna licenza compatibile con la GPL; se il vostro codice non ricade in questa 1788c2ecf20Sopenharmony_cicategoria: buona fortuna, arrangiatevi, siete delle sanguisughe) 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ciSe il vostro driver è nei sorgenti del kernel e un'interfaccia cambia, il 1818c2ecf20Sopenharmony_cidriver verrà corretto immediatamente dalla persona che l'ha modificata. Questo 1828c2ecf20Sopenharmony_cigarantisce che sia sempre possibile compilare il driver, che funzioni, e tutto 1838c2ecf20Sopenharmony_cicon un minimo sforzo da parte vostra. 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ciAvere il proprio driver nei sorgenti principali del kernel ha i seguenti 1868c2ecf20Sopenharmony_civantaggi: 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci - La qualità del driver aumenterà e i costi di manutenzione (per lo 1898c2ecf20Sopenharmony_ci sviluppatore originale) diminuiranno. 1908c2ecf20Sopenharmony_ci - Altri sviluppatori aggiungeranno nuove funzionalità al vostro driver. 1918c2ecf20Sopenharmony_ci - Altri persone troveranno e correggeranno bachi nel vostro driver. 1928c2ecf20Sopenharmony_ci - Altri persone troveranno degli aggiustamenti da fare al vostro driver. 1938c2ecf20Sopenharmony_ci - Altri persone aggiorneranno il driver quando è richiesto da un cambiamento 1948c2ecf20Sopenharmony_ci di un'interfaccia. 1958c2ecf20Sopenharmony_ci - Il driver sarà automaticamente reso disponibile in tutte le distribuzioni 1968c2ecf20Sopenharmony_ci Linux senza dover chiedere a nessuna di queste di aggiungerlo. 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ciDato che Linux supporta più dispositivi di qualsiasi altro sistema operativo, 1998c2ecf20Sopenharmony_cie che girano su molti più tipi di processori di qualsiasi altro sistema 2008c2ecf20Sopenharmony_cioperativo; ciò dimostra che questo modello di sviluppo qualcosa di giusto, 2018c2ecf20Sopenharmony_cidopo tutto, lo fa :) 2028c2ecf20Sopenharmony_ci 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_ci------ 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ciDei ringraziamenti vanno a Randy Dunlap, Andrew Morton, David Brownell, 2088c2ecf20Sopenharmony_ciHanna Linder, Robert Love, e Nishanth Aravamudan per la loro revisione 2098c2ecf20Sopenharmony_cie per i loro commenti sulle prime bozze di questo articolo. 210