1*4882a593Smuzhiyun.. include:: ../disclaimer-ita.rst 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun:Original: :ref:`Documentation/process/stable-api-nonsense.rst <stable_api_nonsense>` 4*4882a593Smuzhiyun:Translator: Federico Vaga <federico.vaga@vaga.pv.it> 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun.. _it_stable_api_nonsense: 7*4882a593Smuzhiyun 8*4882a593SmuzhiyunL'interfaccia dei driver per il kernel Linux 9*4882a593Smuzhiyun============================================ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun(tutte le risposte alle vostre domande e altro) 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunGreg Kroah-Hartman <greg@kroah.com> 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunQuesto è stato scritto per cercare di spiegare perché Linux **non ha 16*4882a593Smuzhiyunun'interfaccia binaria, e non ha nemmeno un'interfaccia stabile**. 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun.. note:: 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun Questo articolo parla di interfacce **interne al kernel**, non delle 21*4882a593Smuzhiyun interfacce verso lo spazio utente. 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun L'interfaccia del kernel verso lo spazio utente è quella usata dai 24*4882a593Smuzhiyun programmi, ovvero le chiamate di sistema. Queste interfacce sono **molto** 25*4882a593Smuzhiyun stabili nel tempo e non verranno modificate. Ho vecchi programmi che sono 26*4882a593Smuzhiyun stati compilati su un kernel 0.9 (circa) e tuttora funzionano sulle versioni 27*4882a593Smuzhiyun 2.6 del kernel. Queste interfacce sono quelle che gli utenti e i 28*4882a593Smuzhiyun programmatori possono considerare stabili. 29*4882a593Smuzhiyun 30*4882a593SmuzhiyunRiepilogo generale 31*4882a593Smuzhiyun------------------ 32*4882a593Smuzhiyun 33*4882a593SmuzhiyunPensate di volere un'interfaccia del kernel stabile, ma in realtà non la 34*4882a593Smuzhiyunvolete, e nemmeno sapete di non volerla. Quello che volete è un driver 35*4882a593Smuzhiyunstabile che funzioni, e questo può essere ottenuto solo se il driver si trova 36*4882a593Smuzhiyunnei sorgenti del kernel. Ci sono altri vantaggi nell'avere il proprio driver 37*4882a593Smuzhiyunnei sorgenti del kernel, ognuno dei quali hanno reso Linux un sistema operativo 38*4882a593Smuzhiyunrobusto, stabile e maturo; questi sono anche i motivi per cui avete scelto 39*4882a593SmuzhiyunLinux. 40*4882a593Smuzhiyun 41*4882a593SmuzhiyunIntroduzione 42*4882a593Smuzhiyun------------ 43*4882a593Smuzhiyun 44*4882a593SmuzhiyunSolo le persone un po' strambe vorrebbero scrivere driver per il kernel con 45*4882a593Smuzhiyunla costante preoccupazione per i cambiamenti alle interfacce interne. Per il 46*4882a593Smuzhiyunresto del mondo, queste interfacce sono invisibili o non di particolare 47*4882a593Smuzhiyuninteresse. 48*4882a593Smuzhiyun 49*4882a593SmuzhiyunInnanzitutto, non tratterò **alcun** problema legale riguardante codice 50*4882a593Smuzhiyunchiuso, nascosto, avvolto, blocchi binari, o qualsia altra cosa che descrive 51*4882a593Smuzhiyundriver che non hanno i propri sorgenti rilasciati con licenza GPL. Per favore 52*4882a593Smuzhiyunfate riferimento ad un avvocato per qualsiasi questione legale, io sono un 53*4882a593Smuzhiyunprogrammatore e perciò qui vi parlerò soltanto delle questioni tecniche (non 54*4882a593Smuzhiyunper essere superficiali sui problemi legali, sono veri e dovete esserne a 55*4882a593Smuzhiyunconoscenza in ogni circostanza). 56*4882a593Smuzhiyun 57*4882a593SmuzhiyunDunque, ci sono due tematiche principali: interfacce binarie del kernel e 58*4882a593Smuzhiyuninterfacce stabili nei sorgenti. Ognuna dipende dall'altra, ma discuteremo 59*4882a593Smuzhiyunprima delle cose binarie per toglierle di mezzo. 60*4882a593Smuzhiyun 61*4882a593SmuzhiyunInterfaccia binaria del kernel 62*4882a593Smuzhiyun------------------------------ 63*4882a593Smuzhiyun 64*4882a593SmuzhiyunSupponiamo d'avere un'interfaccia stabile nei sorgenti del kernel, di 65*4882a593Smuzhiyunconseguenza un'interfaccia binaria dovrebbe essere anche'essa stabile, giusto? 66*4882a593SmuzhiyunSbagliato. Prendete in considerazione i seguenti fatti che riguardano il 67*4882a593Smuzhiyunkernel Linux: 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun - A seconda della versione del compilatore C che state utilizzando, diverse 70*4882a593Smuzhiyun strutture dati del kernel avranno un allineamento diverso, e possibilmente 71*4882a593Smuzhiyun un modo diverso di includere le funzioni (renderle inline oppure no). 72*4882a593Smuzhiyun L'organizzazione delle singole funzioni non è poi così importante, ma la 73*4882a593Smuzhiyun spaziatura (*padding*) nelle strutture dati, invece, lo è. 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun - In base alle opzioni che sono state selezionate per generare il kernel, 76*4882a593Smuzhiyun un certo numero di cose potrebbero succedere: 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun - strutture dati differenti potrebbero contenere campi differenti 79*4882a593Smuzhiyun - alcune funzioni potrebbero non essere implementate (per esempio, 80*4882a593Smuzhiyun alcuni *lock* spariscono se compilati su sistemi mono-processore) 81*4882a593Smuzhiyun - la memoria interna del kernel può essere allineata in differenti modi 82*4882a593Smuzhiyun a seconda delle opzioni di compilazione. 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun - Linux funziona su una vasta gamma di architetture di processore. Non esiste 85*4882a593Smuzhiyun alcuna possibilità che il binario di un driver per un'architettura funzioni 86*4882a593Smuzhiyun correttamente su un'altra. 87*4882a593Smuzhiyun 88*4882a593SmuzhiyunAlcuni di questi problemi possono essere risolti compilando il proprio modulo 89*4882a593Smuzhiyuncon la stessa identica configurazione del kernel, ed usando la stessa versione 90*4882a593Smuzhiyundel compilatore usato per compilare il kernel. Questo è sufficiente se volete 91*4882a593Smuzhiyunfornire un modulo per uno specifico rilascio su una specifica distribuzione 92*4882a593SmuzhiyunLinux. Ma moltiplicate questa singola compilazione per il numero di 93*4882a593Smuzhiyundistribuzioni Linux e il numero dei rilasci supportati da quest'ultime e vi 94*4882a593Smuzhiyuntroverete rapidamente in un incubo fatto di configurazioni e piattaforme 95*4882a593Smuzhiyunhardware (differenti processori con differenti opzioni); dunque, anche per il 96*4882a593Smuzhiyunsingolo rilascio di un modulo, dovreste creare differenti versioni dello 97*4882a593Smuzhiyunstesso. 98*4882a593Smuzhiyun 99*4882a593SmuzhiyunFidatevi, se tenterete questa via, col tempo, diventerete pazzi; l'ho imparato 100*4882a593Smuzhiyuna mie spese molto tempo fa... 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun 103*4882a593SmuzhiyunInterfaccia stabile nei sorgenti del kernel 104*4882a593Smuzhiyun------------------------------------------- 105*4882a593Smuzhiyun 106*4882a593SmuzhiyunSe parlate con le persone che cercano di mantenere aggiornato un driver per 107*4882a593SmuzhiyunLinux ma che non si trova nei sorgenti, allora per queste persone l'argomento 108*4882a593Smuzhiyunsarà "ostico". 109*4882a593Smuzhiyun 110*4882a593SmuzhiyunLo sviluppo del kernel Linux è continuo e viaggia ad un ritmo sostenuto, e non 111*4882a593Smuzhiyunrallenta mai. Perciò, gli sviluppatori del kernel trovano bachi nelle 112*4882a593Smuzhiyuninterfacce attuali, o trovano modi migliori per fare le cose. Se le trovano, 113*4882a593Smuzhiyunallora le correggeranno per migliorarle. In questo frangente, i nomi delle 114*4882a593Smuzhiyunfunzioni potrebbero cambiare, le strutture dati potrebbero diventare più grandi 115*4882a593Smuzhiyuno più piccole, e gli argomenti delle funzioni potrebbero essere ripensati. 116*4882a593SmuzhiyunSe questo dovesse succedere, nello stesso momento, tutte le istanze dove questa 117*4882a593Smuzhiyuninterfaccia viene utilizzata verranno corrette, garantendo che tutto continui 118*4882a593Smuzhiyuna funzionare senza problemi. 119*4882a593Smuzhiyun 120*4882a593SmuzhiyunPortiamo ad esempio l'interfaccia interna per il sottosistema USB che ha subito 121*4882a593Smuzhiyuntre ristrutturazioni nel corso della sua vita. Queste ristrutturazioni furono 122*4882a593Smuzhiyunfatte per risolvere diversi problemi: 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun - È stato fatto un cambiamento da un flusso di dati sincrono ad uno 125*4882a593Smuzhiyun asincrono. Questo ha ridotto la complessità di molti driver e ha 126*4882a593Smuzhiyun aumentato la capacità di trasmissione di tutti i driver fino a raggiungere 127*4882a593Smuzhiyun quasi la velocità massima possibile. 128*4882a593Smuzhiyun - È stato fatto un cambiamento nell'allocazione dei pacchetti da parte del 129*4882a593Smuzhiyun sottosistema USB per conto dei driver, cosicché ora i driver devono fornire 130*4882a593Smuzhiyun più informazioni al sottosistema USB al fine di correggere un certo numero 131*4882a593Smuzhiyun di stalli. 132*4882a593Smuzhiyun 133*4882a593SmuzhiyunQuesto è completamente l'opposto di quello che succede in alcuni sistemi 134*4882a593Smuzhiyunoperativi proprietari che hanno dovuto mantenere, nel tempo, il supporto alle 135*4882a593Smuzhiyunvecchie interfacce USB. I nuovi sviluppatori potrebbero usare accidentalmente 136*4882a593Smuzhiyunle vecchie interfacce e sviluppare codice nel modo sbagliato, portando, di 137*4882a593Smuzhiyunconseguenza, all'instabilità del sistema. 138*4882a593Smuzhiyun 139*4882a593SmuzhiyunIn entrambe gli scenari, gli sviluppatori hanno ritenuto che queste importanti 140*4882a593Smuzhiyunmodifiche erano necessarie, e quindi le hanno fatte con qualche sofferenza. 141*4882a593SmuzhiyunSe Linux avesse assicurato di mantenere stabile l'interfaccia interna, si 142*4882a593Smuzhiyunsarebbe dovuto procedere alla creazione di una nuova, e quelle vecchie, e 143*4882a593Smuzhiyunmal funzionanti, avrebbero dovuto ricevere manutenzione, creando lavoro 144*4882a593Smuzhiyunaggiuntivo per gli sviluppatori del sottosistema USB. Dato che gli 145*4882a593Smuzhiyunsviluppatori devono dedicare il proprio tempo a questo genere di lavoro, 146*4882a593Smuzhiyunchiedergli di dedicarne dell'altro, senza benefici, magari gratuitamente, non 147*4882a593Smuzhiyunè contemplabile. 148*4882a593Smuzhiyun 149*4882a593SmuzhiyunLe problematiche relative alla sicurezza sono molto importanti per Linux. 150*4882a593SmuzhiyunQuando viene trovato un problema di sicurezza viene corretto in breve tempo. 151*4882a593SmuzhiyunA volte, per prevenire il problema di sicurezza, si sono dovute cambiare 152*4882a593Smuzhiyundelle interfacce interne al kernel. Quando è successo, allo stesso tempo, 153*4882a593Smuzhiyuntutti i driver che usavano quelle interfacce sono stati aggiornati, garantendo 154*4882a593Smuzhiyunla correzione definitiva del problema senza doversi preoccupare di rivederlo 155*4882a593Smuzhiyunper sbaglio in futuro. Se non si fossero cambiate le interfacce interne, 156*4882a593Smuzhiyunsarebbe stato impossibile correggere il problema e garantire che non si sarebbe 157*4882a593Smuzhiyunpiù ripetuto. 158*4882a593Smuzhiyun 159*4882a593SmuzhiyunNel tempo le interfacce del kernel subiscono qualche ripulita. Se nessuno 160*4882a593Smuzhiyunsta più usando un'interfaccia, allora questa verrà rimossa. Questo permette 161*4882a593Smuzhiyunal kernel di rimanere il più piccolo possibile, e garantisce che tutte le 162*4882a593Smuzhiyunpotenziali interfacce sono state verificate nel limite del possibile (le 163*4882a593Smuzhiyuninterfacce inutilizzate sono impossibili da verificare). 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun 166*4882a593SmuzhiyunCosa fare 167*4882a593Smuzhiyun--------- 168*4882a593Smuzhiyun 169*4882a593SmuzhiyunDunque, se avete un driver per il kernel Linux che non si trova nei sorgenti 170*4882a593Smuzhiyunprincipali del kernel, come sviluppatori, cosa dovreste fare? Rilasciare un 171*4882a593Smuzhiyunfile binario del driver per ogni versione del kernel e per ogni distribuzione, 172*4882a593Smuzhiyunè un incubo; inoltre, tenere il passo con tutti i cambiamenti del kernel è un 173*4882a593Smuzhiyunbrutto lavoro. 174*4882a593Smuzhiyun 175*4882a593SmuzhiyunSemplicemente, fate sì che il vostro driver per il kernel venga incluso nei 176*4882a593Smuzhiyunsorgenti principali (ricordatevi, stiamo parlando di driver rilasciati secondo 177*4882a593Smuzhiyununa licenza compatibile con la GPL; se il vostro codice non ricade in questa 178*4882a593Smuzhiyuncategoria: buona fortuna, arrangiatevi, siete delle sanguisughe) 179*4882a593Smuzhiyun 180*4882a593SmuzhiyunSe il vostro driver è nei sorgenti del kernel e un'interfaccia cambia, il 181*4882a593Smuzhiyundriver verrà corretto immediatamente dalla persona che l'ha modificata. Questo 182*4882a593Smuzhiyungarantisce che sia sempre possibile compilare il driver, che funzioni, e tutto 183*4882a593Smuzhiyuncon un minimo sforzo da parte vostra. 184*4882a593Smuzhiyun 185*4882a593SmuzhiyunAvere il proprio driver nei sorgenti principali del kernel ha i seguenti 186*4882a593Smuzhiyunvantaggi: 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun - La qualità del driver aumenterà e i costi di manutenzione (per lo 189*4882a593Smuzhiyun sviluppatore originale) diminuiranno. 190*4882a593Smuzhiyun - Altri sviluppatori aggiungeranno nuove funzionalità al vostro driver. 191*4882a593Smuzhiyun - Altri persone troveranno e correggeranno bachi nel vostro driver. 192*4882a593Smuzhiyun - Altri persone troveranno degli aggiustamenti da fare al vostro driver. 193*4882a593Smuzhiyun - Altri persone aggiorneranno il driver quando è richiesto da un cambiamento 194*4882a593Smuzhiyun di un'interfaccia. 195*4882a593Smuzhiyun - Il driver sarà automaticamente reso disponibile in tutte le distribuzioni 196*4882a593Smuzhiyun Linux senza dover chiedere a nessuna di queste di aggiungerlo. 197*4882a593Smuzhiyun 198*4882a593SmuzhiyunDato che Linux supporta più dispositivi di qualsiasi altro sistema operativo, 199*4882a593Smuzhiyune che girano su molti più tipi di processori di qualsiasi altro sistema 200*4882a593Smuzhiyunoperativo; ciò dimostra che questo modello di sviluppo qualcosa di giusto, 201*4882a593Smuzhiyundopo tutto, lo fa :) 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun------ 206*4882a593Smuzhiyun 207*4882a593SmuzhiyunDei ringraziamenti vanno a Randy Dunlap, Andrew Morton, David Brownell, 208*4882a593SmuzhiyunHanna Linder, Robert Love, e Nishanth Aravamudan per la loro revisione 209*4882a593Smuzhiyune per i loro commenti sulle prime bozze di questo articolo. 210