210 lines
10 KiB
ReStructuredText
210 lines
10 KiB
ReStructuredText
|
.. include:: ../disclaimer-ita.rst
|
||
|
|
||
|
:Original: :ref:`Documentation/process/stable-api-nonsense.rst <stable_api_nonsense>`
|
||
|
:Translator: Federico Vaga <federico.vaga@vaga.pv.it>
|
||
|
|
||
|
.. _it_stable_api_nonsense:
|
||
|
|
||
|
L'interfaccia dei driver per il kernel Linux
|
||
|
============================================
|
||
|
|
||
|
(tutte le risposte alle vostre domande e altro)
|
||
|
|
||
|
Greg Kroah-Hartman <greg@kroah.com>
|
||
|
|
||
|
Questo è stato scritto per cercare di spiegare perché Linux **non ha
|
||
|
un'interfaccia binaria, e non ha nemmeno un'interfaccia stabile**.
|
||
|
|
||
|
.. note::
|
||
|
|
||
|
Questo articolo parla di interfacce **interne al kernel**, non delle
|
||
|
interfacce verso lo spazio utente.
|
||
|
|
||
|
L'interfaccia del kernel verso lo spazio utente è quella usata dai
|
||
|
programmi, ovvero le chiamate di sistema. Queste interfacce sono **molto**
|
||
|
stabili nel tempo e non verranno modificate. Ho vecchi programmi che sono
|
||
|
stati compilati su un kernel 0.9 (circa) e tuttora funzionano sulle versioni
|
||
|
2.6 del kernel. Queste interfacce sono quelle che gli utenti e i
|
||
|
programmatori possono considerare stabili.
|
||
|
|
||
|
Riepilogo generale
|
||
|
------------------
|
||
|
|
||
|
Pensate di volere un'interfaccia del kernel stabile, ma in realtà non la
|
||
|
volete, e nemmeno sapete di non volerla. Quello che volete è un driver
|
||
|
stabile che funzioni, e questo può essere ottenuto solo se il driver si trova
|
||
|
nei sorgenti del kernel. Ci sono altri vantaggi nell'avere il proprio driver
|
||
|
nei sorgenti del kernel, ognuno dei quali hanno reso Linux un sistema operativo
|
||
|
robusto, stabile e maturo; questi sono anche i motivi per cui avete scelto
|
||
|
Linux.
|
||
|
|
||
|
Introduzione
|
||
|
------------
|
||
|
|
||
|
Solo le persone un po' strambe vorrebbero scrivere driver per il kernel con
|
||
|
la costante preoccupazione per i cambiamenti alle interfacce interne. Per il
|
||
|
resto del mondo, queste interfacce sono invisibili o non di particolare
|
||
|
interesse.
|
||
|
|
||
|
Innanzitutto, non tratterò **alcun** problema legale riguardante codice
|
||
|
chiuso, nascosto, avvolto, blocchi binari, o qualsia altra cosa che descrive
|
||
|
driver che non hanno i propri sorgenti rilasciati con licenza GPL. Per favore
|
||
|
fate riferimento ad un avvocato per qualsiasi questione legale, io sono un
|
||
|
programmatore e perciò qui vi parlerò soltanto delle questioni tecniche (non
|
||
|
per essere superficiali sui problemi legali, sono veri e dovete esserne a
|
||
|
conoscenza in ogni circostanza).
|
||
|
|
||
|
Dunque, ci sono due tematiche principali: interfacce binarie del kernel e
|
||
|
interfacce stabili nei sorgenti. Ognuna dipende dall'altra, ma discuteremo
|
||
|
prima delle cose binarie per toglierle di mezzo.
|
||
|
|
||
|
Interfaccia binaria del kernel
|
||
|
------------------------------
|
||
|
|
||
|
Supponiamo d'avere un'interfaccia stabile nei sorgenti del kernel, di
|
||
|
conseguenza un'interfaccia binaria dovrebbe essere anche'essa stabile, giusto?
|
||
|
Sbagliato. Prendete in considerazione i seguenti fatti che riguardano il
|
||
|
kernel Linux:
|
||
|
|
||
|
- A seconda della versione del compilatore C che state utilizzando, diverse
|
||
|
strutture dati del kernel avranno un allineamento diverso, e possibilmente
|
||
|
un modo diverso di includere le funzioni (renderle inline oppure no).
|
||
|
L'organizzazione delle singole funzioni non è poi così importante, ma la
|
||
|
spaziatura (*padding*) nelle strutture dati, invece, lo è.
|
||
|
|
||
|
- In base alle opzioni che sono state selezionate per generare il kernel,
|
||
|
un certo numero di cose potrebbero succedere:
|
||
|
|
||
|
- strutture dati differenti potrebbero contenere campi differenti
|
||
|
- alcune funzioni potrebbero non essere implementate (per esempio,
|
||
|
alcuni *lock* spariscono se compilati su sistemi mono-processore)
|
||
|
- la memoria interna del kernel può essere allineata in differenti modi
|
||
|
a seconda delle opzioni di compilazione.
|
||
|
|
||
|
- Linux funziona su una vasta gamma di architetture di processore. Non esiste
|
||
|
alcuna possibilità che il binario di un driver per un'architettura funzioni
|
||
|
correttamente su un'altra.
|
||
|
|
||
|
Alcuni di questi problemi possono essere risolti compilando il proprio modulo
|
||
|
con la stessa identica configurazione del kernel, ed usando la stessa versione
|
||
|
del compilatore usato per compilare il kernel. Questo è sufficiente se volete
|
||
|
fornire un modulo per uno specifico rilascio su una specifica distribuzione
|
||
|
Linux. Ma moltiplicate questa singola compilazione per il numero di
|
||
|
distribuzioni Linux e il numero dei rilasci supportati da quest'ultime e vi
|
||
|
troverete rapidamente in un incubo fatto di configurazioni e piattaforme
|
||
|
hardware (differenti processori con differenti opzioni); dunque, anche per il
|
||
|
singolo rilascio di un modulo, dovreste creare differenti versioni dello
|
||
|
stesso.
|
||
|
|
||
|
Fidatevi, se tenterete questa via, col tempo, diventerete pazzi; l'ho imparato
|
||
|
a mie spese molto tempo fa...
|
||
|
|
||
|
|
||
|
Interfaccia stabile nei sorgenti del kernel
|
||
|
-------------------------------------------
|
||
|
|
||
|
Se parlate con le persone che cercano di mantenere aggiornato un driver per
|
||
|
Linux ma che non si trova nei sorgenti, allora per queste persone l'argomento
|
||
|
sarà "ostico".
|
||
|
|
||
|
Lo sviluppo del kernel Linux è continuo e viaggia ad un ritmo sostenuto, e non
|
||
|
rallenta mai. Perciò, gli sviluppatori del kernel trovano bachi nelle
|
||
|
interfacce attuali, o trovano modi migliori per fare le cose. Se le trovano,
|
||
|
allora le correggeranno per migliorarle. In questo frangente, i nomi delle
|
||
|
funzioni potrebbero cambiare, le strutture dati potrebbero diventare più grandi
|
||
|
o più piccole, e gli argomenti delle funzioni potrebbero essere ripensati.
|
||
|
Se questo dovesse succedere, nello stesso momento, tutte le istanze dove questa
|
||
|
interfaccia viene utilizzata verranno corrette, garantendo che tutto continui
|
||
|
a funzionare senza problemi.
|
||
|
|
||
|
Portiamo ad esempio l'interfaccia interna per il sottosistema USB che ha subito
|
||
|
tre ristrutturazioni nel corso della sua vita. Queste ristrutturazioni furono
|
||
|
fatte per risolvere diversi problemi:
|
||
|
|
||
|
- È stato fatto un cambiamento da un flusso di dati sincrono ad uno
|
||
|
asincrono. Questo ha ridotto la complessità di molti driver e ha
|
||
|
aumentato la capacità di trasmissione di tutti i driver fino a raggiungere
|
||
|
quasi la velocità massima possibile.
|
||
|
- È stato fatto un cambiamento nell'allocazione dei pacchetti da parte del
|
||
|
sottosistema USB per conto dei driver, cosicché ora i driver devono fornire
|
||
|
più informazioni al sottosistema USB al fine di correggere un certo numero
|
||
|
di stalli.
|
||
|
|
||
|
Questo è completamente l'opposto di quello che succede in alcuni sistemi
|
||
|
operativi proprietari che hanno dovuto mantenere, nel tempo, il supporto alle
|
||
|
vecchie interfacce USB. I nuovi sviluppatori potrebbero usare accidentalmente
|
||
|
le vecchie interfacce e sviluppare codice nel modo sbagliato, portando, di
|
||
|
conseguenza, all'instabilità del sistema.
|
||
|
|
||
|
In entrambe gli scenari, gli sviluppatori hanno ritenuto che queste importanti
|
||
|
modifiche erano necessarie, e quindi le hanno fatte con qualche sofferenza.
|
||
|
Se Linux avesse assicurato di mantenere stabile l'interfaccia interna, si
|
||
|
sarebbe dovuto procedere alla creazione di una nuova, e quelle vecchie, e
|
||
|
mal funzionanti, avrebbero dovuto ricevere manutenzione, creando lavoro
|
||
|
aggiuntivo per gli sviluppatori del sottosistema USB. Dato che gli
|
||
|
sviluppatori devono dedicare il proprio tempo a questo genere di lavoro,
|
||
|
chiedergli di dedicarne dell'altro, senza benefici, magari gratuitamente, non
|
||
|
è contemplabile.
|
||
|
|
||
|
Le problematiche relative alla sicurezza sono molto importanti per Linux.
|
||
|
Quando viene trovato un problema di sicurezza viene corretto in breve tempo.
|
||
|
A volte, per prevenire il problema di sicurezza, si sono dovute cambiare
|
||
|
delle interfacce interne al kernel. Quando è successo, allo stesso tempo,
|
||
|
tutti i driver che usavano quelle interfacce sono stati aggiornati, garantendo
|
||
|
la correzione definitiva del problema senza doversi preoccupare di rivederlo
|
||
|
per sbaglio in futuro. Se non si fossero cambiate le interfacce interne,
|
||
|
sarebbe stato impossibile correggere il problema e garantire che non si sarebbe
|
||
|
più ripetuto.
|
||
|
|
||
|
Nel tempo le interfacce del kernel subiscono qualche ripulita. Se nessuno
|
||
|
sta più usando un'interfaccia, allora questa verrà rimossa. Questo permette
|
||
|
al kernel di rimanere il più piccolo possibile, e garantisce che tutte le
|
||
|
potenziali interfacce sono state verificate nel limite del possibile (le
|
||
|
interfacce inutilizzate sono impossibili da verificare).
|
||
|
|
||
|
|
||
|
Cosa fare
|
||
|
---------
|
||
|
|
||
|
Dunque, se avete un driver per il kernel Linux che non si trova nei sorgenti
|
||
|
principali del kernel, come sviluppatori, cosa dovreste fare? Rilasciare un
|
||
|
file binario del driver per ogni versione del kernel e per ogni distribuzione,
|
||
|
è un incubo; inoltre, tenere il passo con tutti i cambiamenti del kernel è un
|
||
|
brutto lavoro.
|
||
|
|
||
|
Semplicemente, fate sì che il vostro driver per il kernel venga incluso nei
|
||
|
sorgenti principali (ricordatevi, stiamo parlando di driver rilasciati secondo
|
||
|
una licenza compatibile con la GPL; se il vostro codice non ricade in questa
|
||
|
categoria: buona fortuna, arrangiatevi, siete delle sanguisughe)
|
||
|
|
||
|
Se il vostro driver è nei sorgenti del kernel e un'interfaccia cambia, il
|
||
|
driver verrà corretto immediatamente dalla persona che l'ha modificata. Questo
|
||
|
garantisce che sia sempre possibile compilare il driver, che funzioni, e tutto
|
||
|
con un minimo sforzo da parte vostra.
|
||
|
|
||
|
Avere il proprio driver nei sorgenti principali del kernel ha i seguenti
|
||
|
vantaggi:
|
||
|
|
||
|
- La qualità del driver aumenterà e i costi di manutenzione (per lo
|
||
|
sviluppatore originale) diminuiranno.
|
||
|
- Altri sviluppatori aggiungeranno nuove funzionalità al vostro driver.
|
||
|
- Altri persone troveranno e correggeranno bachi nel vostro driver.
|
||
|
- Altri persone troveranno degli aggiustamenti da fare al vostro driver.
|
||
|
- Altri persone aggiorneranno il driver quando è richiesto da un cambiamento
|
||
|
di un'interfaccia.
|
||
|
- Il driver sarà automaticamente reso disponibile in tutte le distribuzioni
|
||
|
Linux senza dover chiedere a nessuna di queste di aggiungerlo.
|
||
|
|
||
|
Dato che Linux supporta più dispositivi di qualsiasi altro sistema operativo,
|
||
|
e che girano su molti più tipi di processori di qualsiasi altro sistema
|
||
|
operativo; ciò dimostra che questo modello di sviluppo qualcosa di giusto,
|
||
|
dopo tutto, lo fa :)
|
||
|
|
||
|
|
||
|
|
||
|
------
|
||
|
|
||
|
Dei ringraziamenti vanno a Randy Dunlap, Andrew Morton, David Brownell,
|
||
|
Hanna Linder, Robert Love, e Nishanth Aravamudan per la loro revisione
|
||
|
e per i loro commenti sulle prime bozze di questo articolo.
|