162306a36Sopenharmony_ci.. include:: ../disclaimer-ita.rst 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci:Original: :ref:`Documentation/process/stable-api-nonsense.rst <stable_api_nonsense>` 462306a36Sopenharmony_ci:Translator: Federico Vaga <federico.vaga@vaga.pv.it> 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci.. _it_stable_api_nonsense: 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciL'interfaccia dei driver per il kernel Linux 962306a36Sopenharmony_ci============================================ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci(tutte le risposte alle vostre domande e altro) 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciGreg Kroah-Hartman <greg@kroah.com> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciQuesto è stato scritto per cercare di spiegare perché Linux **non ha 1662306a36Sopenharmony_ciun'interfaccia binaria, e non ha nemmeno un'interfaccia stabile**. 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci.. note:: 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci Questo articolo parla di interfacce **interne al kernel**, non delle 2162306a36Sopenharmony_ci interfacce verso lo spazio utente. 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci L'interfaccia del kernel verso lo spazio utente è quella usata dai 2462306a36Sopenharmony_ci programmi, ovvero le chiamate di sistema. Queste interfacce sono **molto** 2562306a36Sopenharmony_ci stabili nel tempo e non verranno modificate. Ho vecchi programmi che sono 2662306a36Sopenharmony_ci stati compilati su un kernel 0.9 (circa) e tuttora funzionano sulle versioni 2762306a36Sopenharmony_ci 2.6 del kernel. Queste interfacce sono quelle che gli utenti e i 2862306a36Sopenharmony_ci programmatori possono considerare stabili. 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciRiepilogo generale 3162306a36Sopenharmony_ci------------------ 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciPensate di volere un'interfaccia del kernel stabile, ma in realtà non la 3462306a36Sopenharmony_civolete, e nemmeno sapete di non volerla. Quello che volete è un driver 3562306a36Sopenharmony_cistabile che funzioni, e questo può essere ottenuto solo se il driver si trova 3662306a36Sopenharmony_cinei sorgenti del kernel. Ci sono altri vantaggi nell'avere il proprio driver 3762306a36Sopenharmony_cinei sorgenti del kernel, ognuno dei quali hanno reso Linux un sistema operativo 3862306a36Sopenharmony_cirobusto, stabile e maturo; questi sono anche i motivi per cui avete scelto 3962306a36Sopenharmony_ciLinux. 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ciIntroduzione 4262306a36Sopenharmony_ci------------ 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ciSolo le persone un po' strambe vorrebbero scrivere driver per il kernel con 4562306a36Sopenharmony_cila costante preoccupazione per i cambiamenti alle interfacce interne. Per il 4662306a36Sopenharmony_ciresto del mondo, queste interfacce sono invisibili o non di particolare 4762306a36Sopenharmony_ciinteresse. 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciInnanzitutto, non tratterò **alcun** problema legale riguardante codice 5062306a36Sopenharmony_cichiuso, nascosto, avvolto, blocchi binari, o qualsia altra cosa che descrive 5162306a36Sopenharmony_cidriver che non hanno i propri sorgenti rilasciati con licenza GPL. Per favore 5262306a36Sopenharmony_cifate riferimento ad un avvocato per qualsiasi questione legale, io sono un 5362306a36Sopenharmony_ciprogrammatore e perciò qui vi parlerò soltanto delle questioni tecniche (non 5462306a36Sopenharmony_ciper essere superficiali sui problemi legali, sono veri e dovete esserne a 5562306a36Sopenharmony_ciconoscenza in ogni circostanza). 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciDunque, ci sono due tematiche principali: interfacce binarie del kernel e 5862306a36Sopenharmony_ciinterfacce stabili nei sorgenti. Ognuna dipende dall'altra, ma discuteremo 5962306a36Sopenharmony_ciprima delle cose binarie per toglierle di mezzo. 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ciInterfaccia binaria del kernel 6262306a36Sopenharmony_ci------------------------------ 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ciSupponiamo d'avere un'interfaccia stabile nei sorgenti del kernel, di 6562306a36Sopenharmony_ciconseguenza un'interfaccia binaria dovrebbe essere anche'essa stabile, giusto? 6662306a36Sopenharmony_ciSbagliato. Prendete in considerazione i seguenti fatti che riguardano il 6762306a36Sopenharmony_cikernel Linux: 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci - A seconda della versione del compilatore C che state utilizzando, diverse 7062306a36Sopenharmony_ci strutture dati del kernel avranno un allineamento diverso, e possibilmente 7162306a36Sopenharmony_ci un modo diverso di includere le funzioni (renderle inline oppure no). 7262306a36Sopenharmony_ci L'organizzazione delle singole funzioni non è poi così importante, ma la 7362306a36Sopenharmony_ci spaziatura (*padding*) nelle strutture dati, invece, lo è. 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci - In base alle opzioni che sono state selezionate per generare il kernel, 7662306a36Sopenharmony_ci un certo numero di cose potrebbero succedere: 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci - strutture dati differenti potrebbero contenere campi differenti 7962306a36Sopenharmony_ci - alcune funzioni potrebbero non essere implementate (per esempio, 8062306a36Sopenharmony_ci alcuni *lock* spariscono se compilati su sistemi mono-processore) 8162306a36Sopenharmony_ci - la memoria interna del kernel può essere allineata in differenti modi 8262306a36Sopenharmony_ci a seconda delle opzioni di compilazione. 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci - Linux funziona su una vasta gamma di architetture di processore. Non esiste 8562306a36Sopenharmony_ci alcuna possibilità che il binario di un driver per un'architettura funzioni 8662306a36Sopenharmony_ci correttamente su un'altra. 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ciAlcuni di questi problemi possono essere risolti compilando il proprio modulo 8962306a36Sopenharmony_cicon la stessa identica configurazione del kernel, ed usando la stessa versione 9062306a36Sopenharmony_cidel compilatore usato per compilare il kernel. Questo è sufficiente se volete 9162306a36Sopenharmony_cifornire un modulo per uno specifico rilascio su una specifica distribuzione 9262306a36Sopenharmony_ciLinux. Ma moltiplicate questa singola compilazione per il numero di 9362306a36Sopenharmony_cidistribuzioni Linux e il numero dei rilasci supportati da quest'ultime e vi 9462306a36Sopenharmony_citroverete rapidamente in un incubo fatto di configurazioni e piattaforme 9562306a36Sopenharmony_cihardware (differenti processori con differenti opzioni); dunque, anche per il 9662306a36Sopenharmony_cisingolo rilascio di un modulo, dovreste creare differenti versioni dello 9762306a36Sopenharmony_cistesso. 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ciFidatevi, se tenterete questa via, col tempo, diventerete pazzi; l'ho imparato 10062306a36Sopenharmony_cia mie spese molto tempo fa... 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ciInterfaccia stabile nei sorgenti del kernel 10462306a36Sopenharmony_ci------------------------------------------- 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ciSe parlate con le persone che cercano di mantenere aggiornato un driver per 10762306a36Sopenharmony_ciLinux ma che non si trova nei sorgenti, allora per queste persone l'argomento 10862306a36Sopenharmony_cisarà "ostico". 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ciLo sviluppo del kernel Linux è continuo e viaggia ad un ritmo sostenuto, e non 11162306a36Sopenharmony_cirallenta mai. Perciò, gli sviluppatori del kernel trovano bachi nelle 11262306a36Sopenharmony_ciinterfacce attuali, o trovano modi migliori per fare le cose. Se le trovano, 11362306a36Sopenharmony_ciallora le correggeranno per migliorarle. In questo frangente, i nomi delle 11462306a36Sopenharmony_cifunzioni potrebbero cambiare, le strutture dati potrebbero diventare più grandi 11562306a36Sopenharmony_cio più piccole, e gli argomenti delle funzioni potrebbero essere ripensati. 11662306a36Sopenharmony_ciSe questo dovesse succedere, nello stesso momento, tutte le istanze dove questa 11762306a36Sopenharmony_ciinterfaccia viene utilizzata verranno corrette, garantendo che tutto continui 11862306a36Sopenharmony_cia funzionare senza problemi. 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ciPortiamo ad esempio l'interfaccia interna per il sottosistema USB che ha subito 12162306a36Sopenharmony_citre ristrutturazioni nel corso della sua vita. Queste ristrutturazioni furono 12262306a36Sopenharmony_cifatte per risolvere diversi problemi: 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci - È stato fatto un cambiamento da un flusso di dati sincrono ad uno 12562306a36Sopenharmony_ci asincrono. Questo ha ridotto la complessità di molti driver e ha 12662306a36Sopenharmony_ci aumentato la capacità di trasmissione di tutti i driver fino a raggiungere 12762306a36Sopenharmony_ci quasi la velocità massima possibile. 12862306a36Sopenharmony_ci - È stato fatto un cambiamento nell'allocazione dei pacchetti da parte del 12962306a36Sopenharmony_ci sottosistema USB per conto dei driver, cosicché ora i driver devono fornire 13062306a36Sopenharmony_ci più informazioni al sottosistema USB al fine di correggere un certo numero 13162306a36Sopenharmony_ci di stalli. 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ciQuesto è completamente l'opposto di quello che succede in alcuni sistemi 13462306a36Sopenharmony_cioperativi proprietari che hanno dovuto mantenere, nel tempo, il supporto alle 13562306a36Sopenharmony_civecchie interfacce USB. I nuovi sviluppatori potrebbero usare accidentalmente 13662306a36Sopenharmony_cile vecchie interfacce e sviluppare codice nel modo sbagliato, portando, di 13762306a36Sopenharmony_ciconseguenza, all'instabilità del sistema. 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ciIn entrambe gli scenari, gli sviluppatori hanno ritenuto che queste importanti 14062306a36Sopenharmony_cimodifiche erano necessarie, e quindi le hanno fatte con qualche sofferenza. 14162306a36Sopenharmony_ciSe Linux avesse assicurato di mantenere stabile l'interfaccia interna, si 14262306a36Sopenharmony_cisarebbe dovuto procedere alla creazione di una nuova, e quelle vecchie, e 14362306a36Sopenharmony_cimal funzionanti, avrebbero dovuto ricevere manutenzione, creando lavoro 14462306a36Sopenharmony_ciaggiuntivo per gli sviluppatori del sottosistema USB. Dato che gli 14562306a36Sopenharmony_cisviluppatori devono dedicare il proprio tempo a questo genere di lavoro, 14662306a36Sopenharmony_cichiedergli di dedicarne dell'altro, senza benefici, magari gratuitamente, non 14762306a36Sopenharmony_ciè contemplabile. 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ciLe problematiche relative alla sicurezza sono molto importanti per Linux. 15062306a36Sopenharmony_ciQuando viene trovato un problema di sicurezza viene corretto in breve tempo. 15162306a36Sopenharmony_ciA volte, per prevenire il problema di sicurezza, si sono dovute cambiare 15262306a36Sopenharmony_cidelle interfacce interne al kernel. Quando è successo, allo stesso tempo, 15362306a36Sopenharmony_citutti i driver che usavano quelle interfacce sono stati aggiornati, garantendo 15462306a36Sopenharmony_cila correzione definitiva del problema senza doversi preoccupare di rivederlo 15562306a36Sopenharmony_ciper sbaglio in futuro. Se non si fossero cambiate le interfacce interne, 15662306a36Sopenharmony_cisarebbe stato impossibile correggere il problema e garantire che non si sarebbe 15762306a36Sopenharmony_cipiù ripetuto. 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ciNel tempo le interfacce del kernel subiscono qualche ripulita. Se nessuno 16062306a36Sopenharmony_cista più usando un'interfaccia, allora questa verrà rimossa. Questo permette 16162306a36Sopenharmony_cial kernel di rimanere il più piccolo possibile, e garantisce che tutte le 16262306a36Sopenharmony_cipotenziali interfacce sono state verificate nel limite del possibile (le 16362306a36Sopenharmony_ciinterfacce inutilizzate sono impossibili da verificare). 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ciCosa fare 16762306a36Sopenharmony_ci--------- 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ciDunque, se avete un driver per il kernel Linux che non si trova nei sorgenti 17062306a36Sopenharmony_ciprincipali del kernel, come sviluppatori, cosa dovreste fare? Rilasciare un 17162306a36Sopenharmony_cifile binario del driver per ogni versione del kernel e per ogni distribuzione, 17262306a36Sopenharmony_ciè un incubo; inoltre, tenere il passo con tutti i cambiamenti del kernel è un 17362306a36Sopenharmony_cibrutto lavoro. 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ciSemplicemente, fate sì che il vostro driver per il kernel venga incluso nei 17662306a36Sopenharmony_cisorgenti principali (ricordatevi, stiamo parlando di driver rilasciati secondo 17762306a36Sopenharmony_ciuna licenza compatibile con la GPL; se il vostro codice non ricade in questa 17862306a36Sopenharmony_cicategoria: buona fortuna, arrangiatevi, siete delle sanguisughe) 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ciSe il vostro driver è nei sorgenti del kernel e un'interfaccia cambia, il 18162306a36Sopenharmony_cidriver verrà corretto immediatamente dalla persona che l'ha modificata. Questo 18262306a36Sopenharmony_cigarantisce che sia sempre possibile compilare il driver, che funzioni, e tutto 18362306a36Sopenharmony_cicon un minimo sforzo da parte vostra. 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ciAvere il proprio driver nei sorgenti principali del kernel ha i seguenti 18662306a36Sopenharmony_civantaggi: 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci - La qualità del driver aumenterà e i costi di manutenzione (per lo 18962306a36Sopenharmony_ci sviluppatore originale) diminuiranno. 19062306a36Sopenharmony_ci - Altri sviluppatori aggiungeranno nuove funzionalità al vostro driver. 19162306a36Sopenharmony_ci - Altri persone troveranno e correggeranno bachi nel vostro driver. 19262306a36Sopenharmony_ci - Altri persone troveranno degli aggiustamenti da fare al vostro driver. 19362306a36Sopenharmony_ci - Altri persone aggiorneranno il driver quando è richiesto da un cambiamento 19462306a36Sopenharmony_ci di un'interfaccia. 19562306a36Sopenharmony_ci - Il driver sarà automaticamente reso disponibile in tutte le distribuzioni 19662306a36Sopenharmony_ci Linux senza dover chiedere a nessuna di queste di aggiungerlo. 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_ciDato che Linux supporta più dispositivi di qualsiasi altro sistema operativo, 19962306a36Sopenharmony_cie che girano su molti più tipi di processori di qualsiasi altro sistema 20062306a36Sopenharmony_cioperativo; ciò dimostra che questo modello di sviluppo qualcosa di giusto, 20162306a36Sopenharmony_cidopo tutto, lo fa :) 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci------ 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_ciDei ringraziamenti vanno a Randy Dunlap, Andrew Morton, David Brownell, 20862306a36Sopenharmony_ciHanna Linder, Robert Love, e Nishanth Aravamudan per la loro revisione 20962306a36Sopenharmony_cie per i loro commenti sulle prime bozze di questo articolo. 210