← Documents Documentation/translations/it_IT/process/stable-api-nonsense.rst GitHub 원문 ↗

Linux 6.18.37 · Translations

The Linux kernel driver interface

Linux가 stable in-kernel API나 binary ABI를 보장하지 않고 mainline에서 interface와 driver를 함께 발전시키는 이유를 설명합니다.

Source pathDocumentation/translations/it_IT/process/stable-api-nonsense.rst
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약·해설

stable-api-nonsense.rst:1-209

Kernel-userspace syscall ABI는 장기간 안정적으로 유지되지만, kernel 내부 interface와 binary module ABI는 compiler version, build configuration, structure layout, processor architecture에 따라 달라지므로 안정성을 보장하지 않습니다.

내부 interface의 bug·성능·security 문제를 발견하면 interface와 tree 안의 모든 사용처를 함께 고칩니다. USB subsystem 개편 사례처럼 낡은 interface를 유지하지 않아 복잡성과 deadlock을 줄이고 unused code를 제거할 수 있습니다.

외부 driver의 지속적인 build와 동작을 보장하는 현실적인 방법은 GPL-compatible driver를 main kernel tree에 포함하는 것입니다. 그러면 interface 변경자와 다른 developer가 수정·기능·tuning·distribution 배포를 함께 맡아 유지 비용을 낮춥니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 .. include:: ../disclaimer-ita.rst
2
3 :Original: :ref:`Documentation/process/stable-api-nonsense.rst <stable_api_nonsense>`
4 :Translator: Federico Vaga <[email protected]>
5
6 .. _it_stable_api_nonsense:
7
8 L'interfaccia dei driver per il kernel Linux
9 ============================================
10
11 (tutte le risposte alle vostre domande e altro)
12
13 Greg Kroah-Hartman <[email protected]>
14
15 Questo è stato scritto per cercare di spiegare perché Linux **non ha
16 un'interfaccia binaria, e non ha nemmeno un'interfaccia stabile**.
17
18 .. note::
19
20 Questo articolo parla di interfacce **interne al kernel**, non delle
21 interfacce verso lo spazio utente.
22
23 L'interfaccia del kernel verso lo spazio utente è quella usata dai
24 programmi, ovvero le chiamate di sistema. Queste interfacce sono **molto**
25 stabili nel tempo e non verranno modificate. Ho vecchi programmi che sono
26 stati compilati su un kernel 0.9 (circa) e tuttora funzionano sulle versioni
27 2.6 del kernel. Queste interfacce sono quelle che gli utenti e i
28 programmatori possono considerare stabili.
29
30 Riepilogo generale
31 ------------------
32
33 Pensate di volere un'interfaccia del kernel stabile, ma in realtà non la
34 volete, e nemmeno sapete di non volerla. Quello che volete è un driver
35 stabile che funzioni, e questo può essere ottenuto solo se il driver si trova
36 nei sorgenti del kernel. Ci sono altri vantaggi nell'avere il proprio driver
37 nei sorgenti del kernel, ognuno dei quali hanno reso Linux un sistema operativo
38 robusto, stabile e maturo; questi sono anche i motivi per cui avete scelto
39 Linux.
40
41 Introduzione
42 ------------
43
44 Solo le persone un po' strambe vorrebbero scrivere driver per il kernel con
45 la costante preoccupazione per i cambiamenti alle interfacce interne. Per il
46 resto del mondo, queste interfacce sono invisibili o non di particolare
47 interesse.
48
49 Innanzitutto, non tratterò **alcun** problema legale riguardante codice
50 chiuso, nascosto, avvolto, blocchi binari, o qualsia altra cosa che descrive
51 driver che non hanno i propri sorgenti rilasciati con licenza GPL. Per favore
52 fate riferimento ad un avvocato per qualsiasi questione legale, io sono un
53 programmatore e perciò qui vi parlerò soltanto delle questioni tecniche (non
54 per essere superficiali sui problemi legali, sono veri e dovete esserne a
55 conoscenza in ogni circostanza).
56
57 Dunque, ci sono due tematiche principali: interfacce binarie del kernel e
58 interfacce stabili nei sorgenti. Ognuna dipende dall'altra, ma discuteremo
59 prima delle cose binarie per toglierle di mezzo.
60
61 Interfaccia binaria del kernel
62 ------------------------------
63
64 Supponiamo d'avere un'interfaccia stabile nei sorgenti del kernel, di
65 conseguenza un'interfaccia binaria dovrebbe essere anche'essa stabile, giusto?
66 Sbagliato. Prendete in considerazione i seguenti fatti che riguardano il
67 kernel Linux:
68
69 - A seconda della versione del compilatore C che state utilizzando, diverse
70 strutture dati del kernel avranno un allineamento diverso, e possibilmente
71 un modo diverso di includere le funzioni (renderle inline oppure no).
72 L'organizzazione delle singole funzioni non è poi così importante, ma la
73 spaziatura (*padding*) nelle strutture dati, invece, lo è.
74
75 - In base alle opzioni che sono state selezionate per generare il kernel,
76 un certo numero di cose potrebbero succedere:
77
78 - strutture dati differenti potrebbero contenere campi differenti
79 - alcune funzioni potrebbero non essere implementate (per esempio,
80 alcuni *lock* spariscono se compilati su sistemi mono-processore)
81 - la memoria interna del kernel può essere allineata in differenti modi
82 a seconda delle opzioni di compilazione.
83
84 - Linux funziona su una vasta gamma di architetture di processore. Non esiste
85 alcuna possibilità che il binario di un driver per un'architettura funzioni
86 correttamente su un'altra.
87
88 Alcuni di questi problemi possono essere risolti compilando il proprio modulo
89 con la stessa identica configurazione del kernel, ed usando la stessa versione
90 del compilatore usato per compilare il kernel. Questo è sufficiente se volete
91 fornire un modulo per uno specifico rilascio su una specifica distribuzione
92 Linux. Ma moltiplicate questa singola compilazione per il numero di
93 distribuzioni Linux e il numero dei rilasci supportati da quest'ultime e vi
94 troverete rapidamente in un incubo fatto di configurazioni e piattaforme
95 hardware (differenti processori con differenti opzioni); dunque, anche per il
96 singolo rilascio di un modulo, dovreste creare differenti versioni dello
97 stesso.
98
99 Fidatevi, se tenterete questa via, col tempo, diventerete pazzi; l'ho imparato
100 a mie spese molto tempo fa...
101
102
103 Interfaccia stabile nei sorgenti del kernel
104 -------------------------------------------
105
106 Se parlate con le persone che cercano di mantenere aggiornato un driver per
107 Linux ma che non si trova nei sorgenti, allora per queste persone l'argomento
108 sarà "ostico".
109
110 Lo sviluppo del kernel Linux è continuo e viaggia ad un ritmo sostenuto, e non
111 rallenta mai. Perciò, gli sviluppatori del kernel trovano bachi nelle
112 interfacce attuali, o trovano modi migliori per fare le cose. Se le trovano,
113 allora le correggeranno per migliorarle. In questo frangente, i nomi delle
114 funzioni potrebbero cambiare, le strutture dati potrebbero diventare più grandi
115 o più piccole, e gli argomenti delle funzioni potrebbero essere ripensati.
116 Se questo dovesse succedere, nello stesso momento, tutte le istanze dove questa
117 interfaccia viene utilizzata verranno corrette, garantendo che tutto continui
118 a funzionare senza problemi.
119
120 Portiamo ad esempio l'interfaccia interna per il sottosistema USB che ha subito
121 tre ristrutturazioni nel corso della sua vita. Queste ristrutturazioni furono
122 fatte per risolvere diversi problemi:
123
124 - È stato fatto un cambiamento da un flusso di dati sincrono ad uno
125 asincrono. Questo ha ridotto la complessità di molti driver e ha
126 aumentato la capacità di trasmissione di tutti i driver fino a raggiungere
127 quasi la velocità massima possibile.
128 - È stato fatto un cambiamento nell'allocazione dei pacchetti da parte del
129 sottosistema USB per conto dei driver, cosicché ora i driver devono fornire
130 più informazioni al sottosistema USB al fine di correggere un certo numero
131 di stalli.
132
133 Questo è completamente l'opposto di quello che succede in alcuni sistemi
134 operativi proprietari che hanno dovuto mantenere, nel tempo, il supporto alle
135 vecchie interfacce USB. I nuovi sviluppatori potrebbero usare accidentalmente
136 le vecchie interfacce e sviluppare codice nel modo sbagliato, portando, di
137 conseguenza, all'instabilità del sistema.
138
139 In entrambe gli scenari, gli sviluppatori hanno ritenuto che queste importanti
140 modifiche erano necessarie, e quindi le hanno fatte con qualche sofferenza.
141 Se Linux avesse assicurato di mantenere stabile l'interfaccia interna, si
142 sarebbe dovuto procedere alla creazione di una nuova, e quelle vecchie, e
143 mal funzionanti, avrebbero dovuto ricevere manutenzione, creando lavoro
144 aggiuntivo per gli sviluppatori del sottosistema USB. Dato che gli
145 sviluppatori devono dedicare il proprio tempo a questo genere di lavoro,
146 chiedergli di dedicarne dell'altro, senza benefici, magari gratuitamente, non
147 è contemplabile.
148
149 Le problematiche relative alla sicurezza sono molto importanti per Linux.
150 Quando viene trovato un problema di sicurezza viene corretto in breve tempo.
151 A volte, per prevenire il problema di sicurezza, si sono dovute cambiare
152 delle interfacce interne al kernel. Quando è successo, allo stesso tempo,
153 tutti i driver che usavano quelle interfacce sono stati aggiornati, garantendo
154 la correzione definitiva del problema senza doversi preoccupare di rivederlo
155 per sbaglio in futuro. Se non si fossero cambiate le interfacce interne,
156 sarebbe stato impossibile correggere il problema e garantire che non si sarebbe
157 più ripetuto.
158
159 Nel tempo le interfacce del kernel subiscono qualche ripulita. Se nessuno
160 sta più usando un'interfaccia, allora questa verrà rimossa. Questo permette
161 al kernel di rimanere il più piccolo possibile, e garantisce che tutte le
162 potenziali interfacce sono state verificate nel limite del possibile (le
163 interfacce inutilizzate sono impossibili da verificare).
164
165
166 Cosa fare
167 ---------
168
169 Dunque, se avete un driver per il kernel Linux che non si trova nei sorgenti
170 principali del kernel, come sviluppatori, cosa dovreste fare? Rilasciare un
171 file binario del driver per ogni versione del kernel e per ogni distribuzione,
172 è un incubo; inoltre, tenere il passo con tutti i cambiamenti del kernel è un
173 brutto lavoro.
174
175 Semplicemente, fate sì che il vostro driver per il kernel venga incluso nei
176 sorgenti principali (ricordatevi, stiamo parlando di driver rilasciati secondo
177 una licenza compatibile con la GPL; se il vostro codice non ricade in questa
178 categoria: buona fortuna, arrangiatevi, siete delle sanguisughe)
179
180 Se il vostro driver è nei sorgenti del kernel e un'interfaccia cambia, il
181 driver verrà corretto immediatamente dalla persona che l'ha modificata. Questo
182 garantisce che sia sempre possibile compilare il driver, che funzioni, e tutto
183 con un minimo sforzo da parte vostra.
184
185 Avere il proprio driver nei sorgenti principali del kernel ha i seguenti
186 vantaggi:
187
188 - La qualità del driver aumenterà e i costi di manutenzione (per lo
189 sviluppatore originale) diminuiranno.
190 - Altri sviluppatori aggiungeranno nuove funzionalità al vostro driver.
191 - Altri persone troveranno e correggeranno bachi nel vostro driver.
192 - Altri persone troveranno degli aggiustamenti da fare al vostro driver.
193 - Altri persone aggiorneranno il driver quando è richiesto da un cambiamento
194 di un'interfaccia.
195 - Il driver sarà automaticamente reso disponibile in tutte le distribuzioni
196 Linux senza dover chiedere a nessuna di queste di aggiungerlo.
197
198 Dato che Linux supporta più dispositivi di qualsiasi altro sistema operativo,
199 e che girano su molti più tipi di processori di qualsiasi altro sistema
200 operativo; ciò dimostra che questo modello di sviluppo qualcosa di giusto,
201 dopo tutto, lo fa :)
202
203
204
205 ------
206
207 Dei ringraziamenti vanno a Randy Dunlap, Andrew Morton, David Brownell,
208 Hanna Linder, Robert Love, e Nishanth Aravamudan per la loro revisione
209 e per i loro commenti sulle prime bozze di questo articolo.
210

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

안정성을 보장하는 userspace ABI

1-29

Greg Kroah-Hartman이 작성한 이 문서는 Linux에 binary kernel interface도 stable in-kernel interface도 없는 이유를 설명한다.

여기서 말하는 대상은 kernel 내부 interface다. Application이 사용하는 kernel-userspace syscall interface는 시간이 지나도 매우 안정적으로 유지되며 깨지지 않는다. 오래된 kernel을 대상으로 build한 program도 훨씬 새로운 kernel에서 계속 동작한다. User와 application programmer가 안정성을 기대할 수 있는 것은 이 userspace ABI다.

.. include:: ../disclaimer-ita.rst

:Original: :ref:`Documentation/process/stable-api-nonsense.rst <stable_api_nonsense>`
:Translator: Federico Vaga <[email protected]>

.. _it_stable_api_nonsense:

L'interfaccia dei driver per il kernel Linux
============================================

(tutte le risposte alle vostre domande e altro)

Greg Kroah-Hartman <[email protected]>

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.

Stable API가 아니라 계속 동작하는 driver

30-40

Developer가 원한다고 생각하는 것은 stable kernel interface일 수 있지만 실제로 필요한 것은 계속 build되고 실행되는 stable driver다. 이를 얻는 방법은 driver를 mainline kernel tree에 포함하는 것이다. Main tree 포함은 Linux를 강하고 안정적이며 성숙한 운영체제로 만든 다른 여러 이점도 함께 제공한다.

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.

법적 문제가 아닌 기술적 범위

41-60

In-kernel interface 변경을 직접 걱정하는 사람은 kernel driver 작성자 정도다. 대부분의 사용자는 이 interface를 보지도 않고 신경 쓸 필요도 없다.

이 문서는 GPL로 source를 공개하지 않는 closed source, hidden source, binary blob, source wrapper driver의 법적 문제를 다루지 않는다. 법률 문제는 변호사에게 문의해야 하며 여기서는 binary kernel interface와 stable kernel source interface라는 기술적 문제만 설명한다.

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.

Compiler·configuration·architecture와 binary ABI

61-87
  • 사용한 C compiler version에 따라 kernel structure alignment와 padding이 달라지고 function이 inline되는 방식도 바뀔 수 있다. Function 배치보다 data structure padding 차이가 특히 중요하다.
  • Kernel build option에 따라 같은 structure의 field가 달라지고 일부 function은 아예 구현되지 않을 수 있다. 예를 들어 non-SMP build에서는 일부 lock operation이 아무 code도 만들지 않는다. Memory alignment도 configuration에 따라 달라진다.
  • Linux는 매우 다양한 processor architecture에서 실행된다. 한 architecture용 binary driver가 다른 architecture에서 올바르게 동작할 수 없다.
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.

Distribution별 binary module build matrix

88-102

특정 distribution의 특정 release와 특정 kernel configuration만 지원한다면 kernel과 정확히 같은 compiler와 configuration으로 module을 build해 일부 문제를 피할 수 있다.

그러나 Linux distribution 수, 각 distribution이 지원하는 release 수, 한 release 안에서 hardware별로 제공하는 여러 kernel flavor를 곱하면 유지해야 할 module build가 폭발적으로 늘어난다. 이런 release 방식을 장기간 지원하는 것은 현실적으로 감당하기 어렵다.

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...

Kernel source interface가 바뀌는 이유

103-119

Main kernel tree 밖의 driver를 오래 유지하는 사람에게 stable kernel source interface는 특히 민감한 문제다. Linux kernel 개발은 멈추지 않고 빠르게 진행된다.

Developer가 현재 interface의 bug나 더 나은 설계를 찾으면 interface 자체를 고친다. Function 이름, structure 크기와 field, function parameter가 바뀔 수 있다. 이때 kernel tree 안에서 해당 interface를 사용하는 모든 call site도 같은 변경으로 함께 수정하므로 전체 tree는 계속 올바르게 동작한다.

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.

USB subsystem interface 개편

120-148

In-kernel USB interface는 subsystem lifetime 동안 적어도 세 차례 크게 개편되었다.

  • Data stream을 synchronous model에서 asynchronous model로 바꾸어 여러 driver의 복잡성을 낮추고 throughput을 높였다. 그 결과 거의 모든 USB device를 가능한 최대 속도에 가깝게 실행할 수 있게 되었다.
  • USB driver가 USB core에서 data packet을 allocate하는 방식을 바꾸어 driver가 core에 더 많은 정보를 제공하게 했다. 이를 통해 문서화된 여러 deadlock을 수정했다.

오래된 USB interface까지 계속 유지해야 하는 closed-source 운영체제에서는 새 developer가 낡은 interface를 실수로 사용하고 잘못된 방식으로 code를 작성해 system 안정성을 떨어뜨릴 수 있다.

Linux에 stable source interface 보존 의무가 있었다면 새 interface를 추가하면서 깨진 옛 interface도 계속 유지해야 했다. 이는 자원봉사로 일하는 USB developer에게 아무 이익 없이 추가 작업을 요구하는 결과가 된다.

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.

Security 수정과 unused interface 정리

149-165

Security issue가 발견되면 Linux는 매우 빠르게 수정한다. 재발을 막으려면 internal interface 자체를 바꾸어야 할 때가 있고, kernel tree 안의 모든 driver도 동시에 수정한다. Internal interface 변경을 금지하면 이런 보안 문제를 완전하게 고치고 미래의 재발을 막기 어렵다.

Kernel interface는 시간이 지나며 정리된다. 아무도 사용하지 않는 interface는 삭제해 kernel을 가능한 한 작게 유지하고 남은 interface가 실제로 test되도록 한다. 사용자가 없는 interface는 유효성을 현실적으로 시험하기 어렵다.

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).

해결책은 mainline 포함

166-184

Main tree 밖의 GPL-compatible Linux driver를 유지하면서 모든 kernel version과 distribution용 binary를 배포하고 변하는 interface를 따라가는 일은 매우 어렵다. 해결책은 driver를 main kernel tree에 포함하는 것이다.

Tree 안의 driver는 kernel interface를 바꾸는 developer가 같은 patch series에서 함께 수정한다. Driver owner가 매번 별도로 따라가지 않아도 driver는 계속 build되고 동작한다.

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.

Main tree driver가 얻는 이점

185-203
  • 원래 developer의 maintenance cost는 줄고 driver 품질은 높아진다.
  • 다른 developer가 feature를 추가한다.
  • 다른 사람이 bug를 발견하고 수정한다.
  • 다른 사람이 성능 tuning 기회를 찾는다.
  • 외부 interface 변경이 필요할 때 다른 developer가 driver를 갱신한다.
  • Distribution에 별도 포함 요청을 하지 않아도 driver가 모든 Linux distribution에 자동으로 배포된다.

Linux는 다른 운영체제보다 더 많은 device를 기본 지원하고 더 다양한 processor architecture에서 이를 제공한다. 이는 mainline 중심 개발 model이 실제로 효과가 있음을 보여 준다.

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 :)

초기 문서 검토 기여

204-209

초기 초안을 검토하고 의견을 준 Randy Dunlap, Andrew Morton, David Brownell, Hanna Linder, Robert Love, Nishanth Aravamudan에게 감사를 표한다.


------

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.