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