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