Back to home page

OSCL-LXR

 
 

    


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.