0001 .. include:: ../disclaimer-ita.rst
0002
0003 :Original: :ref:`Documentation/process/stable-api-nonsense.rst <stable_api_nonsense>`
0004 :Translator: Federico Vaga <federico.vaga@vaga.pv.it>
0005
0006 .. _it_stable_api_nonsense:
0007
0008 L'interfaccia dei driver per il kernel Linux
0009 ============================================
0010
0011 (tutte le risposte alle vostre domande e altro)
0012
0013 Greg Kroah-Hartman <greg@kroah.com>
0014
0015 Questo è stato scritto per cercare di spiegare perché Linux **non ha
0016 un'interfaccia binaria, e non ha nemmeno un'interfaccia stabile**.
0017
0018 .. note::
0019
0020 Questo articolo parla di interfacce **interne al kernel**, non delle
0021 interfacce verso lo spazio utente.
0022
0023 L'interfaccia del kernel verso lo spazio utente è quella usata dai
0024 programmi, ovvero le chiamate di sistema. Queste interfacce sono **molto**
0025 stabili nel tempo e non verranno modificate. Ho vecchi programmi che sono
0026 stati compilati su un kernel 0.9 (circa) e tuttora funzionano sulle versioni
0027 2.6 del kernel. Queste interfacce sono quelle che gli utenti e i
0028 programmatori possono considerare stabili.
0029
0030 Riepilogo generale
0031 ------------------
0032
0033 Pensate di volere un'interfaccia del kernel stabile, ma in realtà non la
0034 volete, e nemmeno sapete di non volerla. Quello che volete è un driver
0035 stabile che funzioni, e questo può essere ottenuto solo se il driver si trova
0036 nei sorgenti del kernel. Ci sono altri vantaggi nell'avere il proprio driver
0037 nei sorgenti del kernel, ognuno dei quali hanno reso Linux un sistema operativo
0038 robusto, stabile e maturo; questi sono anche i motivi per cui avete scelto
0039 Linux.
0040
0041 Introduzione
0042 ------------
0043
0044 Solo le persone un po' strambe vorrebbero scrivere driver per il kernel con
0045 la costante preoccupazione per i cambiamenti alle interfacce interne. Per il
0046 resto del mondo, queste interfacce sono invisibili o non di particolare
0047 interesse.
0048
0049 Innanzitutto, non tratterò **alcun** problema legale riguardante codice
0050 chiuso, nascosto, avvolto, blocchi binari, o qualsia altra cosa che descrive
0051 driver che non hanno i propri sorgenti rilasciati con licenza GPL. Per favore
0052 fate riferimento ad un avvocato per qualsiasi questione legale, io sono un
0053 programmatore e perciò qui vi parlerò soltanto delle questioni tecniche (non
0054 per essere superficiali sui problemi legali, sono veri e dovete esserne a
0055 conoscenza in ogni circostanza).
0056
0057 Dunque, ci sono due tematiche principali: interfacce binarie del kernel e
0058 interfacce stabili nei sorgenti. Ognuna dipende dall'altra, ma discuteremo
0059 prima delle cose binarie per toglierle di mezzo.
0060
0061 Interfaccia binaria del kernel
0062 ------------------------------
0063
0064 Supponiamo d'avere un'interfaccia stabile nei sorgenti del kernel, di
0065 conseguenza un'interfaccia binaria dovrebbe essere anche'essa stabile, giusto?
0066 Sbagliato. Prendete in considerazione i seguenti fatti che riguardano il
0067 kernel Linux:
0068
0069 - A seconda della versione del compilatore C che state utilizzando, diverse
0070 strutture dati del kernel avranno un allineamento diverso, e possibilmente
0071 un modo diverso di includere le funzioni (renderle inline oppure no).
0072 L'organizzazione delle singole funzioni non è poi così importante, ma la
0073 spaziatura (*padding*) nelle strutture dati, invece, lo è.
0074
0075 - In base alle opzioni che sono state selezionate per generare il kernel,
0076 un certo numero di cose potrebbero succedere:
0077
0078 - strutture dati differenti potrebbero contenere campi differenti
0079 - alcune funzioni potrebbero non essere implementate (per esempio,
0080 alcuni *lock* spariscono se compilati su sistemi mono-processore)
0081 - la memoria interna del kernel può essere allineata in differenti modi
0082 a seconda delle opzioni di compilazione.
0083
0084 - Linux funziona su una vasta gamma di architetture di processore. Non esiste
0085 alcuna possibilità che il binario di un driver per un'architettura funzioni
0086 correttamente su un'altra.
0087
0088 Alcuni di questi problemi possono essere risolti compilando il proprio modulo
0089 con la stessa identica configurazione del kernel, ed usando la stessa versione
0090 del compilatore usato per compilare il kernel. Questo è sufficiente se volete
0091 fornire un modulo per uno specifico rilascio su una specifica distribuzione
0092 Linux. Ma moltiplicate questa singola compilazione per il numero di
0093 distribuzioni Linux e il numero dei rilasci supportati da quest'ultime e vi
0094 troverete rapidamente in un incubo fatto di configurazioni e piattaforme
0095 hardware (differenti processori con differenti opzioni); dunque, anche per il
0096 singolo rilascio di un modulo, dovreste creare differenti versioni dello
0097 stesso.
0098
0099 Fidatevi, se tenterete questa via, col tempo, diventerete pazzi; l'ho imparato
0100 a mie spese molto tempo fa...
0101
0102
0103 Interfaccia stabile nei sorgenti del kernel
0104 -------------------------------------------
0105
0106 Se parlate con le persone che cercano di mantenere aggiornato un driver per
0107 Linux ma che non si trova nei sorgenti, allora per queste persone l'argomento
0108 sarà "ostico".
0109
0110 Lo sviluppo del kernel Linux è continuo e viaggia ad un ritmo sostenuto, e non
0111 rallenta mai. Perciò, gli sviluppatori del kernel trovano bachi nelle
0112 interfacce attuali, o trovano modi migliori per fare le cose. Se le trovano,
0113 allora le correggeranno per migliorarle. In questo frangente, i nomi delle
0114 funzioni potrebbero cambiare, le strutture dati potrebbero diventare più grandi
0115 o più piccole, e gli argomenti delle funzioni potrebbero essere ripensati.
0116 Se questo dovesse succedere, nello stesso momento, tutte le istanze dove questa
0117 interfaccia viene utilizzata verranno corrette, garantendo che tutto continui
0118 a funzionare senza problemi.
0119
0120 Portiamo ad esempio l'interfaccia interna per il sottosistema USB che ha subito
0121 tre ristrutturazioni nel corso della sua vita. Queste ristrutturazioni furono
0122 fatte per risolvere diversi problemi:
0123
0124 - È stato fatto un cambiamento da un flusso di dati sincrono ad uno
0125 asincrono. Questo ha ridotto la complessità di molti driver e ha
0126 aumentato la capacità di trasmissione di tutti i driver fino a raggiungere
0127 quasi la velocità massima possibile.
0128 - È stato fatto un cambiamento nell'allocazione dei pacchetti da parte del
0129 sottosistema USB per conto dei driver, cosicché ora i driver devono fornire
0130 più informazioni al sottosistema USB al fine di correggere un certo numero
0131 di stalli.
0132
0133 Questo è completamente l'opposto di quello che succede in alcuni sistemi
0134 operativi proprietari che hanno dovuto mantenere, nel tempo, il supporto alle
0135 vecchie interfacce USB. I nuovi sviluppatori potrebbero usare accidentalmente
0136 le vecchie interfacce e sviluppare codice nel modo sbagliato, portando, di
0137 conseguenza, all'instabilità del sistema.
0138
0139 In entrambe gli scenari, gli sviluppatori hanno ritenuto che queste importanti
0140 modifiche erano necessarie, e quindi le hanno fatte con qualche sofferenza.
0141 Se Linux avesse assicurato di mantenere stabile l'interfaccia interna, si
0142 sarebbe dovuto procedere alla creazione di una nuova, e quelle vecchie, e
0143 mal funzionanti, avrebbero dovuto ricevere manutenzione, creando lavoro
0144 aggiuntivo per gli sviluppatori del sottosistema USB. Dato che gli
0145 sviluppatori devono dedicare il proprio tempo a questo genere di lavoro,
0146 chiedergli di dedicarne dell'altro, senza benefici, magari gratuitamente, non
0147 è contemplabile.
0148
0149 Le problematiche relative alla sicurezza sono molto importanti per Linux.
0150 Quando viene trovato un problema di sicurezza viene corretto in breve tempo.
0151 A volte, per prevenire il problema di sicurezza, si sono dovute cambiare
0152 delle interfacce interne al kernel. Quando è successo, allo stesso tempo,
0153 tutti i driver che usavano quelle interfacce sono stati aggiornati, garantendo
0154 la correzione definitiva del problema senza doversi preoccupare di rivederlo
0155 per sbaglio in futuro. Se non si fossero cambiate le interfacce interne,
0156 sarebbe stato impossibile correggere il problema e garantire che non si sarebbe
0157 più ripetuto.
0158
0159 Nel tempo le interfacce del kernel subiscono qualche ripulita. Se nessuno
0160 sta più usando un'interfaccia, allora questa verrà rimossa. Questo permette
0161 al kernel di rimanere il più piccolo possibile, e garantisce che tutte le
0162 potenziali interfacce sono state verificate nel limite del possibile (le
0163 interfacce inutilizzate sono impossibili da verificare).
0164
0165
0166 Cosa fare
0167 ---------
0168
0169 Dunque, se avete un driver per il kernel Linux che non si trova nei sorgenti
0170 principali del kernel, come sviluppatori, cosa dovreste fare? Rilasciare un
0171 file binario del driver per ogni versione del kernel e per ogni distribuzione,
0172 è un incubo; inoltre, tenere il passo con tutti i cambiamenti del kernel è un
0173 brutto lavoro.
0174
0175 Semplicemente, fate sì che il vostro driver per il kernel venga incluso nei
0176 sorgenti principali (ricordatevi, stiamo parlando di driver rilasciati secondo
0177 una licenza compatibile con la GPL; se il vostro codice non ricade in questa
0178 categoria: buona fortuna, arrangiatevi, siete delle sanguisughe)
0179
0180 Se il vostro driver è nei sorgenti del kernel e un'interfaccia cambia, il
0181 driver verrà corretto immediatamente dalla persona che l'ha modificata. Questo
0182 garantisce che sia sempre possibile compilare il driver, che funzioni, e tutto
0183 con un minimo sforzo da parte vostra.
0184
0185 Avere il proprio driver nei sorgenti principali del kernel ha i seguenti
0186 vantaggi:
0187
0188 - La qualità del driver aumenterà e i costi di manutenzione (per lo
0189 sviluppatore originale) diminuiranno.
0190 - Altri sviluppatori aggiungeranno nuove funzionalità al vostro driver.
0191 - Altri persone troveranno e correggeranno bachi nel vostro driver.
0192 - Altri persone troveranno degli aggiustamenti da fare al vostro driver.
0193 - Altri persone aggiorneranno il driver quando è richiesto da un cambiamento
0194 di un'interfaccia.
0195 - Il driver sarà automaticamente reso disponibile in tutte le distribuzioni
0196 Linux senza dover chiedere a nessuna di queste di aggiungerlo.
0197
0198 Dato che Linux supporta più dispositivi di qualsiasi altro sistema operativo,
0199 e che girano su molti più tipi di processori di qualsiasi altro sistema
0200 operativo; ciò dimostra che questo modello di sviluppo qualcosa di giusto,
0201 dopo tutto, lo fa :)
0202
0203
0204
0205 ------
0206
0207 Dei ringraziamenti vanno a Randy Dunlap, Andrew Morton, David Brownell,
0208 Hanna Linder, Robert Love, e Nishanth Aravamudan per la loro revisione
0209 e per i loro commenti sulle prime bozze di questo articolo.