Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

doc:it: add some process/* translations

Translated documents:
- 2.Process
- 3.Early-stage
- 4.Coding
- 5.Posting
- 6.Followthrough
- 7.AdvancedTopics
- 8.Conclusion
- adding-syscalls

Signed-off-by: Federico Vaga <federico.vaga@vaga.pv.it>
Signed-off-by: Alessia Mantegazza <amantegazza@vaga.pv.it>
Signed-off-by: Jonathan Corbet <corbet@lwn.net>

authored by

Federico Vaga and committed by
Jonathan Corbet
fdf0345e a4a2bf0e

+2651 -20
+521 -2
Documentation/translations/it_IT/process/2.Process.rst
··· 1 1 .. include:: ../disclaimer-ita.rst 2 2 3 3 :Original: :ref:`Documentation/process/2.Process.rst <development_process>` 4 + :Translator: Alessia Mantegazza <amantegazza@vaga.pv.it> 4 5 5 6 .. _it_development_process: 6 7 7 8 Come funziona il processo di sviluppo 8 9 ===================================== 9 10 10 - .. warning:: 11 + Lo sviluppo del Kernel agli inizi degli anno '90 era abbastanza libero, con 12 + un numero di utenti e sviluppatori relativamente basso. Con una base 13 + di milioni di utenti e con 2000 sviluppatori coinvolti nel giro di un anno, 14 + il kernel da allora ha messo in atto un certo numero di procedure per rendere 15 + lo sviluppo più agevole. È richiesta una solida conoscenza di come tale 16 + processo si svolge per poter esserne parte attiva. 11 17 12 - TODO ancora da tradurre 18 + Il quadro d'insieme 19 + ------------------- 20 + 21 + Gli sviluppatori kernel utilizzano un calendario di rilascio generico, dove 22 + ogni due o tre mesi viene effettuata un rilascio importante del kernel. 23 + I rilasci più recenti sono stati: 24 + 25 + ====== ================= 26 + 4.11 Aprile 30, 2017 27 + 4.12 Luglio 2, 2017 28 + 4.13 Settembre 3, 2017 29 + 4.14 Novembre 12, 2017 30 + 4.15 Gennaio 28, 2018 31 + 4.16 Aprile 1, 2018 32 + ====== ================= 33 + 34 + Ciascun rilascio 4.x è un importante rilascio del kernel con nuove 35 + funzionalità, modifiche interne dell'API, e molto altro. Un tipico 36 + rilascio 4.x contiene quasi 13,000 gruppi di modifiche con ulteriori 37 + modifiche a parecchie migliaia di linee di codice. La 4.x. è pertanto la 38 + linea di confine nello sviluppo del kernel Linux; il kernel utilizza un sistema 39 + di sviluppo continuo che integra costantemente nuove importanti modifiche. 40 + 41 + Viene seguita una disciplina abbastanza lineare per l'inclusione delle 42 + patch di ogni rilascio. All'inizio di ogni ciclo di sviluppo, la 43 + "finestra di inclusione" viene dichiarata aperta. In quel momento il codice 44 + ritenuto sufficientemente stabile(e che è accettato dalla comunità di sviluppo) 45 + viene incluso nel ramo principale del kernel. La maggior parte delle 46 + patch per un nuovo ciclo di sviluppo (e tutte le più importanti modifiche) 47 + saranno inserite durante questo periodo, ad un ritmo che si attesta sulle 48 + 1000 modifiche ("patch" o "gruppo di modifiche") al giorno. 49 + 50 + (per inciso, vale la pena notare che i cambiamenti integrati durante la 51 + "finestra di inclusione" non escono dal nulla; questi infatti, sono stati 52 + raccolti e, verificati in anticipo. Il funzionamento di tale procedimento 53 + verrà descritto dettagliatamente più avanti). 54 + 55 + La finestra di inclusione resta attiva approssimativamente per due settimane. 56 + Al termine di questo periodo, Linus Torvald dichiarerà che la finestra è 57 + chiusa e rilascerà il primo degli "rc" del kernel. 58 + Per il kernel che è destinato ad essere 2.6.40, per esempio, il rilascio 59 + che emerge al termine della finestra d'inclusione si chiamerà 2.6.40-rc1. 60 + Questo rilascio indica che il momento di aggiungere nuovi componenti è 61 + passato, e che è iniziato il periodo di stabilizzazione del prossimo kernel. 62 + 63 + Nelle successive sei/dieci settimane, potranno essere sottoposte solo modifiche 64 + che vanno a risolvere delle problematiche. Occasionalmente potrà essere 65 + consentita una modifica più consistente, ma tali occasioni sono rare. 66 + Gli sviluppatori che tenteranno di aggiungere nuovi elementi al di fuori della 67 + finestra di inclusione, tendenzialmente, riceveranno un accoglienza poco 68 + amichevole. Come regola generale: se vi perdete la finestra di inclusione per 69 + un dato componente, la cosa migliore da fare è aspettare il ciclo di sviluppo 70 + successivo (un'eccezione può essere fatta per i driver per hardware non 71 + supportati in precedenza; se toccano codice non facente parte di quello 72 + attuale, che non causino regressioni e che potrebbero essere aggiunti in 73 + sicurezza in un qualsiasi momento) 74 + 75 + Mentre le correzioni si aprono la loro strada all'interno del ramo principale, 76 + il ritmo delle modifiche rallenta col tempo. Linus rilascia un nuovo 77 + kernel -rc circa una volta alla settimana; e ne usciranno circa 6 o 9 prima 78 + che il kernel venga considerato sufficientemente stabile e che il rilascio 79 + finale 2.6.x venga fatto. A quel punto tutto il processo ricomincerà. 80 + 81 + Esempio: ecco com'è andato il ciclo di sviluppo della versione 4.16 82 + (tutte le date si collocano nel 2018) 83 + 84 + 85 + ============== ======================================= 86 + Gennaio 28 4.15 rilascio stabile 87 + Febbraio 11 4.16-rc1, finestra di inclusione chiusa 88 + Febbraio 18 4.16-rc2 89 + Febbraio 25 4.16-rc3 90 + Marzo 4 4.16-rc4 91 + Marzo 11 4.16-rc5 92 + Marzo 18 4.16-rc6 93 + Marzo 25 4.16-rc7 94 + Aprile 1 4.17 rilascio stabile 95 + ============== ======================================= 96 + 97 + In che modo gli sviluppatori decidono quando chiudere il ciclo di sviluppo e 98 + creare quindi una rilascio stabile? Un metro valido è il numero di regressioni 99 + rilevate nel precedente rilascio. Nessun baco è il benvenuto, ma quelli che 100 + procurano problemi su sistemi che hanno funzionato in passato sono considerati 101 + particolarmente seri. Per questa ragione, le modifiche che portano ad una 102 + regressione sono viste sfavorevolmente e verranno quasi sicuramente annullate 103 + durante il periodo di stabilizzazione. 104 + 105 + L'obiettivo degli sviluppatori è quello di aggiustare tutte le regressioni 106 + conosciute prima che avvenga il rilascio stabile. Nel mondo reale, questo 107 + tipo di perfezione difficilmente viene raggiunta; esistono troppe variabili 108 + in un progetto di questa portata. Arriva un punto dove ritardare il rilascio 109 + finale peggiora la situazione; la quantità di modifiche in attesa della 110 + prossima finestra di inclusione crescerà enormemente, creando ancor più 111 + regressioni al giro successivo. Quindi molti kernel 4.x escono con una 112 + manciata di regressioni delle quali, si spera, nessuna è grave. 113 + 114 + Una volta che un rilascio stabile è fatto, il suo costante mantenimento è 115 + affidato al "squadra stabilità", attualmente composta da Greg Kroah-Hartman. 116 + Questa squadra rilascia occasionalmente degli aggiornamenti relativi al 117 + rilascio stabile usando la numerazione 4.x.y. Per essere presa in 118 + considerazione per un rilascio d'aggiornamento, una modifica deve: 119 + (1) correggere un baco importante (2) essere già inserita nel ramo principale 120 + per il prossimo sviluppo del kernel. Solitamente, passato il loro rilascio 121 + iniziale, i kernel ricevono aggiornamenti per più di un ciclo di sviluppo. 122 + Quindi, per esempio, la storia del kernel 4.13 appare così: 123 + 124 + ============== =============================== 125 + Settembre 3 4.13 rilascio stabile 126 + Settembre 13 4.13.1 127 + Settembre 20 4.13.2 128 + Settembre 27 4.13.3 129 + Ottobre 5 4.13.4 130 + Ottobre 12 4.13.5 131 + ... ... 132 + Novembre 24 4.13.16 133 + ============== =============================== 134 + 135 + La 4.13.16 fu l'aggiornamento finale per la versione 4.13. 136 + 137 + Alcuni kernel sono destinati ad essere kernel a "lungo termine"; questi 138 + riceveranno assistenza per un lungo periodo di tempo. Al momento in cui 139 + scriviamo, i manutentori dei kernel stabili a lungo termine sono: 140 + 141 + ====== ====================== ========================================== 142 + 3.16 Ben Hutchings (kernel stabile molto più a lungo termine) 143 + 4.1 Sasha Levin 144 + 4.4 Greg Kroah-Hartman (kernel stabile molto più a lungo termine) 145 + 4.9 Greg Kroah-Hartman 146 + 4.14 Greg Kroah-Hartman 147 + ====== ====================== ========================================== 148 + 149 + 150 + Questa selezione di kernel di lungo periodo sono puramente dovuti ai loro 151 + manutentori, alla loro necessità e al tempo per tenere aggiornate proprio 152 + quelle versioni. Non ci sono altri kernel a lungo termine in programma per 153 + alcun rilascio in arrivo. 154 + 155 + Il ciclo di vita di una patch 156 + ----------------------------- 157 + 158 + Le patch non passano direttamente dalla tastiera dello sviluppatori 159 + al ramo principale del kernel. Esiste, invece, una procedura disegnata 160 + per assicurare che ogni patch sia di buona qualità e desiderata nel 161 + ramo principale. Questo processo avviene velocemente per le correzioni 162 + meno importanti, o, nel caso di patch ampie e controverse, va avanti per anni. 163 + Per uno sviluppatore la maggior frustrazione viene dalla mancanza di 164 + comprensione di questo processo o dai tentativi di aggirarlo. 165 + 166 + Nella speranza di ridurre questa frustrazione, questo documento spiegherà 167 + come una patch viene inserita nel kernel. Ciò che segue è un'introduzione 168 + che descrive il processo ideale. Approfondimenti verranno invece trattati 169 + più avanti. 170 + 171 + Una patch attraversa, generalmente, le seguenti fasi: 172 + 173 + - Progetto. In questa fase sono stabilite quelli che sono i requisiti 174 + della modifica - e come verranno soddisfatti. Il lavoro di progettazione 175 + viene spesso svolto senza coinvolgere la comunità, ma è meglio renderlo 176 + il più aperto possibile; questo può far risparmiare molto tempo evitando 177 + eventuali riprogettazioni successive. 178 + 179 + - Prima revisione. Le patch vengono pubblicate sulle liste di discussione 180 + interessate, e gli sviluppatori in quella lista risponderanno coi loro 181 + commenti. Se si svolge correttamente, questo procedimento potrebbe far 182 + emergere problemi rilevanti in una patch. 183 + 184 + - Revisione più ampia. Quando la patch è quasi pronta per essere inserita 185 + nel ramo principale, un manutentore importante del sottosistema dovrebbe 186 + accettarla - anche se, questa accettazione non è una garanzia che la 187 + patch arriverà nel ramo principale. La patch sarà visibile nei sorgenti 188 + del sottosistema in questione e nei sorgenti -next (descritti sotto). 189 + Quando il processo va a buon fine, questo passo porta ad una revisione 190 + più estesa della patch e alla scoperta di problemi d'integrazione 191 + con il lavoro altrui. 192 + 193 + - Per favore, tenete da conto che la maggior parte dei manutentori ha 194 + anche un lavoro quotidiano, quindi integrare le vostre patch potrebbe 195 + non essere la loro priorità più alta. Se una vostra patch riceve 196 + dei suggerimenti su dei cambiamenti necessari, dovreste applicare 197 + quei cambiamenti o giustificare perché non sono necessari. Se la vostra 198 + patch non riceve alcuna critica ma non è stata integrata dal 199 + manutentore del driver o sottosistema, allora dovreste continuare con 200 + i necessari aggiornamenti per mantenere la patch aggiornata al kernel 201 + più recente cosicché questa possa integrarsi senza problemi; continuate 202 + ad inviare gli aggiornamenti per essere revisionati e integrati. 203 + 204 + - Inclusione nel ramo principale. Eventualmente, una buona patch verrà 205 + inserita all'interno nel repositorio principale, gestito da 206 + Linus Torvalds. In questa fase potrebbero emergere nuovi problemi e/o 207 + commenti; è importante che lo sviluppatore sia collaborativo e che sistemi 208 + ogni questione che possa emergere. 209 + 210 + - Rilascio stabile. Ora, il numero di utilizzatori che sono potenzialmente 211 + toccati dalla patch è aumentato, quindi, ancora una volta, potrebbero 212 + emergere nuovi problemi. 213 + 214 + - Manutenzione di lungo periodo. Nonostante sia possibile che uno sviluppatore 215 + si dimentichi del codice dopo la sua integrazione, questo comportamento 216 + lascia una brutta impressione nella comunità di sviluppo. Integrare il 217 + codice elimina alcuni degli oneri facenti parte della manutenzione, in 218 + particolare, sistemerà le problematiche causate dalle modifiche all'API. 219 + Ma lo sviluppatore originario dovrebbe continuare ad assumersi la 220 + responsabilità per il codice se quest'ultimo continua ad essere utile 221 + nel lungo periodo. 222 + 223 + Uno dei più grandi errori fatti dagli sviluppatori kernel (o dai loro datori 224 + di lavoro) è quello di cercare di ridurre tutta la procedura ad una singola 225 + "integrazione nel remo principale". Questo approccio inevitabilmente conduce 226 + a una condizione di frustrazione per tutti coloro che sono coinvolti. 227 + 228 + Come le modifiche finiscono nel Kernel 229 + -------------------------------------- 230 + 231 + Esiste una sola persona che può inserire le patch nel repositorio principale 232 + del kernel: Linus Torvalds. Ma, di tutte le 9500 patch che entrarono nella 233 + versione 2.6.38 del kernel, solo 112 (circa l'1,3%) furono scelte direttamente 234 + da Linus in persona. Il progetto del kernel è cresciuto fino a raggiungere 235 + una dimensione tale per cui un singolo sviluppatore non può controllare e 236 + selezionare indipendentemente ogni modifica senza essere supportato. 237 + La via scelta dagli sviluppatori per indirizzare tale crescita è stata quella 238 + di utilizzare un sistema di "sottotenenti" basato sulla fiducia. 239 + 240 + Il codice base del kernel è spezzato in una serie si sottosistemi: rete, 241 + supporto per specifiche architetture, gestione della memoria, video e 242 + strumenti, etc. Molti sottosistemi hanno un manutentore designato: ovvero uno 243 + sviluppatore che ha piena responsabilità di tutto il codice presente in quel 244 + sottosistema. Tali manutentori di sottosistema sono i guardiani 245 + (in un certo senso) della parte di kernel che gestiscono; sono coloro che 246 + (solitamente) accetteranno una patch per l'inclusione nel ramo principale 247 + del kernel. 248 + 249 + I manutentori di sottosistema gestiscono ciascuno la propria parte dei sorgenti 250 + del kernel, utilizzando abitualmente (ma certamente non sempre) git. 251 + Strumenti come git (e affini come quilt o mercurial) permettono ai manutentori 252 + di stilare una lista delle patch, includendo informazioni sull'autore ed 253 + altri metadati. In ogni momento, il manutentore può individuare quale patch 254 + nel sua repositorio non si trova nel ramo principale. 255 + 256 + Quando la "finestra di integrazione" si apre, i manutentori di alto livello 257 + chiederanno a Linus di "prendere" dai loro repositori le modifiche che hanno 258 + selezionato per l'inclusione. Se Linus acconsente, il flusso di patch si 259 + convoglierà nel repositorio di quest ultimo, divenendo così parte del ramo 260 + principale del kernel. La quantità d'attenzione che Linus presta alle 261 + singole patch ricevute durante l'operazione di integrazione varia. 262 + È chiaro che, qualche volta, guardi più attentamente. Ma, come regola 263 + generale, Linus confida nel fatto che i manutentori di sottosistema non 264 + selezionino pessime patch. 265 + 266 + I manutentori di sottosistemi, a turno, possono "prendere" patch 267 + provenienti da altri manutentori. Per esempio, i sorgenti per la rete rete 268 + sono costruiti da modifiche che si sono accumulate inizialmente nei sorgenti 269 + dedicati ai driver per dispositivi di rete, rete senza fili, ecc. Tale 270 + catena di repositori può essere più o meno lunga, benché raramente ecceda 271 + i due o tre collegamenti. Questo processo è conosciuto come 272 + "la catena della fiducia", perché ogni manutentore all'interno della 273 + catena si fida di coloro che gestiscono i livelli più bassi. 274 + 275 + Chiaramente, in un sistema come questo, l'inserimento delle patch all'interno 276 + del kernel si basa sul trovare il manutentore giusto. Di norma, inviare 277 + patch direttamente a Linus non è la via giusta. 278 + 279 + 280 + Sorgenti -next 281 + -------------- 282 + 283 + La catena di sottosistemi guida il flusso di patch all'interno del kernel, 284 + ma solleva anche un interessante quesito: se qualcuno volesse vedere tutte le 285 + patch pronte per la prossima finestra di integrazione? 286 + Gli sviluppatori si interesseranno alle patch in sospeso per verificare 287 + che non ci siano altri conflitti di cui preoccuparsi; una modifica che, per 288 + esempio, cambia il prototipo di una funzione fondamentale del kernel andrà in 289 + conflitto con qualsiasi altra modifica che utilizzi la vecchia versione di 290 + quella funzione. Revisori e tester vogliono invece avere accesso alle 291 + modifiche nella loro totalità prima che approdino nel ramo principale del 292 + kernel. Uno potrebbe prendere le patch provenienti da tutti i sottosistemi 293 + d'interesse, ma questo sarebbe un lavoro enorme e fallace. 294 + 295 + La risposta ci viene sotto forma di sorgenti -next, dove i sottosistemi sono 296 + raccolti per essere testati e controllati. Il più vecchio di questi sorgenti, 297 + gestito da Andrew Morton, è chiamato "-mm" (memory management, che è l'inizio 298 + di tutto). L'-mm integra patch proveniente da una lunga lista di sottosistemi; 299 + e ha, inoltre, alcune patch destinate al supporto del debugging. 300 + 301 + Oltre a questo, -mm contiene una raccolta significativa di patch che sono 302 + state selezionate da Andrew direttamente. Queste patch potrebbero essere 303 + state inviate in una lista di discussione, o possono essere applicate ad una 304 + parte del kernel per la quale non esiste un sottosistema dedicato. 305 + Di conseguenza, -mm opera come una specie di sottosistema "ultima spiaggia"; 306 + se per una patch non esiste una via chiara per entrare nel ramo principale, 307 + allora è probabile che finirà in -mm. Le patch passate per -mm 308 + eventualmente finiranno nel sottosistema più appropriato o saranno inviate 309 + direttamente a Linus. In un tipico ciclo di sviluppo, circa il 5-10% delle 310 + patch andrà nel ramo principale attraverso -mm. 311 + 312 + La patch -mm correnti sono disponibili nella cartella "mmotm" (-mm of 313 + the moment) all'indirizzo: 314 + 315 + http://www.ozlabs.org/~akpm/mmotm/ 316 + 317 + È molto probabile che l'uso dei sorgenti MMOTM diventi un'esperienza 318 + frustrante; ci sono buone probabilità che non compili nemmeno. 319 + 320 + I sorgenti principali per il prossimo ciclo d'integrazione delle patch 321 + è linux-next, gestito da Stephen Rothwell. I sorgenti linux-next sono, per 322 + definizione, un'istantanea di come dovrà apparire il ramo principale dopo che 323 + la prossima finestra di inclusione si chiuderà. I linux-next sono annunciati 324 + sulla lista di discussione linux-kernel e linux-next nel momento in cui 325 + vengono assemblati; e possono essere scaricate da: 326 + 327 + http://www.kernel.org/pub/linux/kernel/next/ 328 + 329 + Linux-next è divenuto parte integrante del processo di sviluppo del kernel; 330 + tutte le patch incorporate durante una finestra di integrazione dovrebbero 331 + aver trovato la propria strada in linux-next, a volte anche prima dell'apertura 332 + della finestra di integrazione. 333 + 334 + 335 + Sorgenti in preparazione 336 + ------------------------ 337 + 338 + Nei sorgenti del kernel esiste la cartella drivers/staging/, dove risiedono 339 + molte sotto-cartelle per i driver o i filesystem che stanno per essere aggiunti 340 + al kernel. Questi restano nella cartella drivers/staging fintanto che avranno 341 + bisogno di maggior lavoro; una volta completato, possono essere spostate 342 + all'interno del kernel nel posto più appropriato. Questo è il modo di tener 343 + traccia dei driver che non sono ancora in linea con gli standard di codifica 344 + o qualità, ma che le persone potrebbero voler usare ugualmente e tracciarne 345 + lo sviluppo. 346 + 347 + Greg Kroah-Hartman attualmente gestisce i sorgenti in preparazione. I driver 348 + che non sono completamente pronti vengono inviati a lui, e ciascun driver avrà 349 + la propria sotto-cartella in drivers/staging/. Assieme ai file sorgenti 350 + dei driver, dovrebbe essere presente nella stessa cartella anche un file TODO. 351 + Il file TODO elenca il lavoro ancora da fare su questi driver per poter essere 352 + accettati nel kernel, e indica anche la lista di persone da inserire in copia 353 + conoscenza per ogni modifica fatta. Le regole attuali richiedono che i 354 + driver debbano, come minimo, compilare adeguatamente. 355 + 356 + La *preparazione* può essere una via relativamente facile per inserire nuovi 357 + driver all'interno del ramo principale, dove, con un po' di fortuna, saranno 358 + notati da altri sviluppatori e migliorati velocemente. Entrare nella fase 359 + di preparazione non è però la fine della storia, infatti, il codice che si 360 + trova nella cartella staging che non mostra regolari progressi potrebbe 361 + essere rimosso. Le distribuzioni, inoltre, tendono a dimostrarsi relativamente 362 + riluttanti nell'attivare driver in preparazione. Quindi lo preparazione è, 363 + nel migliore dei casi, una tappa sulla strada verso il divenire un driver 364 + del ramo principale. 365 + 366 + 367 + Strumenti 368 + --------- 369 + 370 + Come è possibile notare dal testo sopra, il processo di sviluppo del kernel 371 + dipende pesantemente dalla capacità di guidare la raccolta di patch in 372 + diverse direzioni. L'intera cosa non funzionerebbe se non venisse svolta 373 + con l'uso di strumenti appropriati e potenti. Spiegare l'uso di tali 374 + strumenti non è lo scopo di questo documento, ma c'è spazio per alcuni 375 + consigli. 376 + 377 + In assoluto, nella comunità del kernel, predomina l'uso di git come sistema 378 + di gestione dei sorgenti. Git è una delle diverse tipologie di sistemi 379 + distribuiti di controllo versione che sono stati sviluppati nella comunità 380 + del software libero. Esso è calibrato per lo sviluppo del kernel, e si 381 + comporta abbastanza bene quando ha a che fare con repositori grandi e con un 382 + vasto numero di patch. Git ha inoltre la reputazione di essere difficile 383 + da imparare e utilizzare, benché stia migliorando. Agli sviluppatori 384 + del kernel viene richiesta un po' di familiarità con git; anche se non lo 385 + utilizzano per il proprio lavoro, hanno bisogno di git per tenersi al passo 386 + con il lavoro degli altri sviluppatori (e con il ramo principale). 387 + 388 + Git è ora compreso in quasi tutte le distribuzioni Linux. Esiste una sito che 389 + potete consultare: 390 + 391 + http://git-scm.com/ 392 + 393 + Qui troverete i riferimenti alla documentazione e alle guide passo-passo. 394 + 395 + Tra gli sviluppatori Kernel che non usano git, la scelta alternativa più 396 + popolare è quasi sicuramente Mercurial: 397 + 398 + http://www.selenic.com/mercurial/ 399 + 400 + Mercurial condivide diverse caratteristiche con git, ma fornisce 401 + un'interfaccia che potrebbe risultare più semplice da utilizzare. 402 + 403 + L'altro strumento che vale la pena conoscere è Quilt: 404 + 405 + http://savannah.nongnu.org/projects/quilt/ 406 + 407 + 408 + Quilt è un sistema di gestione delle patch, piuttosto che un sistema 409 + di gestione dei sorgenti. Non mantiene uno storico degli eventi; ma piuttosto 410 + è orientato verso il tracciamento di uno specifico insieme di modifiche 411 + rispetto ad un codice in evoluzione. Molti dei più grandi manutentori di 412 + sottosistema utilizzano quilt per gestire le patch che dovrebbero essere 413 + integrate. Per la gestione di certe tipologie di sorgenti (-mm, per esempio), 414 + quilt è il miglior strumento per svolgere il lavoro. 415 + 416 + 417 + Liste di discussione 418 + -------------------- 419 + 420 + Una grossa parte del lavoro di sviluppo del Kernel Linux viene svolto tramite 421 + le liste di discussione. È difficile essere un membro della comunità 422 + pienamente coinvolto se non si partecipa almeno ad una lista da qualche 423 + parte. Ma, le liste di discussione di Linux rappresentano un potenziale 424 + problema per gli sviluppatori, che rischiano di venir sepolti da un mare di 425 + email, restare incagliati nelle convenzioni in vigore nelle liste Linux, 426 + o entrambi. 427 + 428 + Molte delle liste di discussione del Kernel girano su vger.kernel.org; 429 + l'elenco principale lo si trova sul sito: 430 + 431 + http://vger.kernel.org/vger-lists.html 432 + 433 + Esistono liste gestite altrove; un certo numero di queste sono in 434 + lists.redhat.com. 435 + 436 + La lista di discussione principale per lo sviluppo del kernel è, ovviamente, 437 + linux-kernel. Questa lista è un luogo ostile dove trovarsi; i volumi possono 438 + raggiungere i 500 messaggi al giorno, la quantità di "rumore" è elevata, 439 + la conversazione può essere strettamente tecnica e i partecipanti non sono 440 + sempre preoccupati di mostrare un alto livello di educazione. Ma non esiste 441 + altro luogo dove la comunità di sviluppo del kernel si unisce per intero; 442 + gli sviluppatori che evitano tale lista si perderanno informazioni importanti. 443 + 444 + Ci sono alcuni consigli che possono essere utili per sopravvivere a 445 + linux-kernel: 446 + 447 + - Tenete la lista in una cartella separata, piuttosto che inserirla nella 448 + casella di posta principale. Così da essere in grado di ignorare il flusso 449 + di mail per un certo periodo di tempo. 450 + 451 + - Non cercate di seguire ogni conversazione - nessuno lo fa. È importante 452 + filtrare solo gli argomenti d'interesse (sebbene va notato che le 453 + conversazioni di lungo periodo possono deviare dall'argomento originario 454 + senza cambiare il titolo della mail) e le persone che stanno partecipando. 455 + 456 + - Non alimentate i troll. Se qualcuno cerca di creare nervosismo, ignoratelo. 457 + 458 + - Quando rispondete ad una mail linux-kernel (o ad altre liste) mantenete 459 + tutti i Cc:. In assenza di importanti motivazioni (come una richiesta 460 + esplicita), non dovreste mai togliere destinatari. Assicuratevi sempre che 461 + la persona alla quale state rispondendo sia presente nella lista Cc. Questa 462 + usanza fa si che divenga inutile chiedere esplicitamente di essere inseriti 463 + in copia nel rispondere al vostro messaggio. 464 + 465 + - Cercate nell'archivio della lista (e nella rete nella sua totalità) prima 466 + di far domande. Molti sviluppatori possono divenire impazienti con le 467 + persone che chiaramente non hanno svolto i propri compiti a casa. 468 + 469 + - Evitate il *top-posting* (cioè la pratica di mettere la vostra risposta sopra 470 + alla frase alla quale state rispondendo). Ciò renderebbe la vostra risposta 471 + difficile da leggere e genera scarsa impressione. 472 + 473 + - Chiedete nella lista di discussione corretta. Linux-kernel può essere un 474 + punto di incontro generale, ma non è il miglior posto dove trovare 475 + sviluppatori da tutti i sottosistemi. 476 + 477 + Infine, la ricerca della corretta lista di discussione è uno degli errori più 478 + comuni per gli sviluppatori principianti. Qualcuno che pone una domanda 479 + relativa alla rete su linux-kernel riceverà quasi certamente il suggerimento 480 + di chiedere sulla lista netdev, che è la lista frequentata dagli sviluppatori 481 + di rete. Ci sono poi altre liste per i sottosistemi SCSI, video4linux, IDE, 482 + filesystem, etc. Il miglior posto dove cercare una lista di discussione è il 483 + file MAINTAINERS che si trova nei sorgenti del kernel. 484 + 485 + Iniziare con lo sviluppo del Kernel 486 + ----------------------------------- 487 + 488 + Sono comuni le domande sul come iniziare con lo sviluppo del kernel - sia da 489 + singole persone che da aziende. Altrettanto comuni sono i passi falsi che 490 + rendono l'inizio di tale relazione più difficile di quello che dovrebbe essere. 491 + 492 + Le aziende spesso cercano di assumere sviluppatori noti per creare un gruppo 493 + di sviluppo iniziale. Questo, in effetti, può essere una tecnica efficace. 494 + Ma risulta anche essere dispendiosa e non va ad accrescere il bacino di 495 + sviluppatori kernel con esperienza. È possibile anche "portare a casa" 496 + sviluppatori per accelerare lo sviluppo del kernel, dando comunque 497 + all'investimento un po' di tempo. Prendersi questo tempo può fornire 498 + al datore di lavoro un gruppo di sviluppatori che comprendono sia il kernel 499 + che l'azienda stessa, e che possono supportare la formazione di altre persone. 500 + Nel medio periodo, questa è spesso uno delle soluzioni più proficue. 501 + 502 + I singoli sviluppatori sono spesso, comprensibilmente, una perdita come punto 503 + di partenza. Iniziare con un grande progetto può rivelarsi intimidatorio; 504 + spesso all'inizio si vuole solo verificare il terreno con qualcosa di piccolo. 505 + Questa è una delle motivazioni per le quali molti sviluppatori saltano alla 506 + creazione di patch che vanno a sistemare errori di battitura o 507 + problematiche minori legate allo stile del codice. Sfortunatamente, tali 508 + patch creano un certo livello di rumore che distrae l'intera comunità di 509 + sviluppo, quindi, sempre di più, esse vengono degradate. I nuovi sviluppatori 510 + che desiderano presentarsi alla comunità non riceveranno l'accoglienza 511 + che vorrebbero con questi mezzi. 512 + 513 + Andrew Morton da questo consiglio agli aspiranti sviluppatori kernel 514 + 515 + :: 516 + 517 + Il primo progetto per un neofita del kernel dovrebbe essere 518 + sicuramente quello di "assicurarsi che il kernel funzioni alla 519 + perfezione sempre e su tutte le macchine sulle quali potete stendere 520 + la vostra mano". Solitamente il modo per fare ciò è quello di 521 + collaborare con gli altri nel sistemare le cose (questo richiede 522 + persistenza!) ma va bene - è parte dello sviluppo kernel. 523 + 524 + (http://lwn.net/Articles/283982/). 525 + 526 + In assenza di problemi ovvi da risolvere, si consiglia agli sviluppatori 527 + di consultare, in generale, la lista di regressioni e di bachi aperti. 528 + Non c'è mai carenza di problematiche bisognose di essere sistemate; 529 + accollandosi tali questioni gli sviluppatori accumuleranno esperienza con 530 + la procedura, ed allo stesso tempo, aumenteranno la loro rispettabilità 531 + all'interno della comunità di sviluppo.
+233 -4
Documentation/translations/it_IT/process/3.Early-stage.rst
··· 1 1 .. include:: ../disclaimer-ita.rst 2 2 3 3 :Original: :ref:`Documentation/process/3.Early-stage.rst <development_early_stage>` 4 + :Translator: Alessia Mantegazza <amantegazza@vaga.pv.it> 4 5 5 6 .. _it_development_early_stage: 6 7 7 - Primi passi della pianificazione 8 - ================================ 8 + I primi passi della pianificazione 9 + ================================== 9 10 10 - .. warning:: 11 + Osservando un progetto di sviluppo per il kernel Linux, si potrebbe essere 12 + tentati dal saltare tutto e iniziare a codificare. Tuttavia, come ogni 13 + progetto significativo, molta della preparazione per giungere al successo 14 + viene fatta prima che una sola linea di codice venga scritta. Il tempo speso 15 + nella pianificazione e la comunicazione può far risparmiare molto 16 + tempo in futuro. 11 17 12 - TODO ancora da tradurre 18 + Specificare il problema 19 + ----------------------- 20 + 21 + Come qualsiasi progetto ingegneristico, un miglioramento del kernel di 22 + successo parte con una chiara descrizione del problema da risolvere. 23 + In alcuni casi, questo passaggio è facile: ad esempio quando un driver è 24 + richiesto per un particolare dispositivo. In altri casi invece, si 25 + tende a confondere il problema reale con le soluzioni proposte e questo 26 + può portare all'emergere di problemi. 27 + 28 + Facciamo un esempio: qualche anno fa, gli sviluppatori che lavoravano con 29 + linux audio cercarono un modo per far girare le applicazioni senza dropouts 30 + o altri artefatti dovuti all'eccessivo ritardo nel sistema. La soluzione 31 + alla quale giunsero fu un modulo del kernel destinato ad agganciarsi al 32 + framework Linux Security Module (LSM); questo modulo poteva essere 33 + configurato per dare ad una specifica applicazione accesso allo 34 + schedulatore *realtime*. Tale modulo fu implementato e inviato nella 35 + lista di discussione linux-kernel, dove incontrò subito dei problemi. 36 + 37 + Per gli sviluppatori audio, questo modulo di sicurezza era sufficiente a 38 + risolvere il loro problema nell'immediato. Per l'intera comunità kernel, 39 + invece, era un uso improprio del framework LSM (che non è progettato per 40 + conferire privilegi a processi che altrimenti non avrebbero potuto ottenerli) 41 + e un rischio per la stabilità del sistema. Le loro soluzioni di punta nel 42 + breve periodo, comportavano un accesso alla schedulazione realtime attraverso 43 + il meccanismo rlimit, e nel lungo periodo un costante lavoro nella riduzione 44 + dei ritardi. 45 + 46 + La comunità audio, comunque, non poteva vedere al di là della singola 47 + soluzione che avevano implementato; erano riluttanti ad accettare alternative. 48 + Il conseguente dissenso lasciò in quegli sviluppatori un senso di 49 + disillusione nei confronti dell'intero processo di sviluppo; uno di loro 50 + scrisse questo messaggio: 51 + 52 + Ci sono numerosi sviluppatori del kernel Linux davvero bravi, ma 53 + rischiano di restare sovrastati da una vasta massa di stolti arroganti. 54 + Cercare di comunicare le richieste degli utenti a queste persone è 55 + una perdita di tempo. Loro sono troppo "intelligenti" per stare ad 56 + ascoltare dei poveri mortali. 57 + 58 + (http://lwn.net/Articles/131776/). 59 + 60 + La realtà delle cose fu differente; gli sviluppatori del kernel erano molto 61 + più preoccupati per la stabilità del sistema, per la manutenzione di lungo 62 + periodo e cercavano la giusta soluzione alla problematica esistente con uno 63 + specifico modulo. La morale della storia è quella di concentrarsi sul 64 + problema - non su di una specifica soluzione- e di discuterne con la comunità 65 + di sviluppo prima di investire tempo nella scrittura del codice. 66 + 67 + Quindi, osservando un progetto di sviluppo del kernel, si dovrebbe 68 + rispondere a questa lista di domande: 69 + 70 + - Qual'è, precisamente, il problema che dev'essere risolto? 71 + 72 + - Chi sono gli utenti coinvolti da tal problema? A quale caso dovrebbe 73 + essere indirizzata la soluzione? 74 + 75 + - In che modo il kernel risulta manchevole nell'indirizzare il problema 76 + in questione? 77 + 78 + Solo dopo ha senso iniziare a considerare le possibili soluzioni. 79 + 80 + Prime discussioni 81 + ----------------- 82 + 83 + Quando si pianifica un progetto di sviluppo per il kernel, sarebbe quanto meno 84 + opportuno discuterne inizialmente con la comunità prima di lanciarsi 85 + nell'implementazione. Una discussione preliminare può far risparmiare sia 86 + tempo che problemi in svariati modi: 87 + 88 + - Potrebbe essere che il problema sia già stato risolto nel kernel in 89 + una maniera che non avete ancora compreso. Il kernel Linux è grande e ha 90 + una serie di funzionalità e capacità che non sono scontate nell'immediato. 91 + Non tutte le capacità del kernel sono documentate così bene come ci 92 + piacerebbe, ed è facile perdersi qualcosa. Il vostro autore ha assistito 93 + alla pubblicazione di un driver intero che duplica un altro driver 94 + esistente di cui il nuovo autore era ignaro. Il codice che rinnova 95 + ingranaggi già esistenti non è soltanto dispendioso; non verrà nemmeno 96 + accettato nel ramo principale del kernel. 97 + 98 + - Potrebbero esserci proposte che non sono considerate accettabili per 99 + l'integrazione all'interno del ramo principale. È meglio affrontarle 100 + prima di scrivere il codice. 101 + 102 + - È possibile che altri sviluppatori abbiano pensato al problema; potrebbero 103 + avere delle idee per soluzioni migliori, e potrebbero voler contribuire 104 + alla loro creazione. 105 + 106 + Anni di esperienza con la comunità di sviluppo del kernel hanno impartito una 107 + chiara lezione: il codice per il kernel che è pensato e sviluppato a porte 108 + chiuse, inevitabilmente, ha problematiche che si rivelano solo quando il 109 + codice viene rilasciato pubblicamente. Qualche volta tali problemi sono 110 + importanti e richiedono mesi o anni di sforzi prima che il codice possa 111 + raggiungere gli standard richiesti della comunità. 112 + Alcuni esempi possono essere: 113 + 114 + - La rete Devicescape è stata creata e implementata per sistemi 115 + mono-processore. Non avrebbe potuto essere inserita nel ramo principale 116 + fino a che non avesse supportato anche i sistemi multi-processore. 117 + Riadattare i meccanismi di sincronizzazione e simili è un compito difficile; 118 + come risultato, l'inserimento di questo codice (ora chiamato mac80211) 119 + fu rimandato per più di un anno. 120 + 121 + - Il filesystem Reiser4 include una seria di funzionalità che, secondo 122 + l'opinione degli sviluppatori principali del kernel, avrebbero dovuto 123 + essere implementate a livello di filesystem virtuale. Comprende 124 + anche funzionalità che non sono facilmente implementabili senza esporre 125 + il sistema al rischio di uno stallo. La scoperta tardiva di questi 126 + problemi - e il diniego a risolverne alcuni - ha avuto come conseguenza 127 + il fatto che Raiser4 resta fuori dal ramo principale del kernel. 128 + 129 + - Il modulo di sicurezza AppArmor utilizzava strutture dati del 130 + filesystem virtuale interno in modi che sono stati considerati rischiosi e 131 + inattendibili. Questi problemi (tra le altre cose) hanno tenuto AppArmor 132 + fuori dal ramo principale per anni. 133 + 134 + Ciascuno di questi casi è stato un travaglio e ha richiesto del lavoro 135 + straordinario, cose che avrebbero potuto essere evitate con alcune 136 + "chiacchierate" preliminari con gli sviluppatori kernel. 137 + 138 + Con chi parlare? 139 + ---------------- 140 + 141 + Quando gli sviluppatori hanno deciso di rendere pubblici i propri progetti, la 142 + domanda successiva sarà: da dove partiamo? La risposta è quella di trovare 143 + la giusta lista di discussione e il giusto manutentore. Per le liste di 144 + discussione, il miglior approccio è quello di cercare la lista più adatta 145 + nel file MAINTAINERS. Se esiste una lista di discussione di sottosistema, 146 + è preferibile pubblicare lì piuttosto che sulla lista di discussione generale 147 + del kernel Linux; avrete maggiori probabilità di trovare sviluppatori con 148 + esperienza sul tema, e l'ambiente che troverete potrebbe essere più 149 + incoraggiante. 150 + 151 + Trovare manutentori può rivelarsi un po' difficoltoso. Ancora, il file 152 + MAINTAINERS è il posto giusto da dove iniziare. Il file potrebbe non essere 153 + sempre aggiornato, inoltre, non tutti i sottosistemi sono rappresentati qui. 154 + Coloro che sono elencati nel file MAINTAINERS potrebbero, in effetti, non 155 + essere le persone che attualmente svolgono quel determinato ruolo. Quindi, 156 + quando c'è un dubbio su chi contattare, un trucco utile è quello di usare 157 + git (git log in particolare) per vedere chi attualmente è attivo all'interno 158 + del sottosistema interessato. Controllate chi sta scrivendo le patch, 159 + e chi, se non ci fosse nessuno, sta aggiungendo la propria firma 160 + (Signed-off-by) a quelle patch. Quelle sono le persone maggiormente 161 + qualificate per aiutarvi con lo sviluppo di nuovo progetto. 162 + 163 + Il compito di trovare il giusto manutentore, a volte, è una tale sfida che 164 + ha spinto gli sviluppatori del kernel a scrivere uno script che li aiutasse 165 + in questa ricerca: 166 + 167 + :: 168 + 169 + .../scripts/get_maintainer.pl 170 + 171 + Se questo script viene eseguito con l'opzione "-f" ritornerà il 172 + manutentore(i) attuale per un dato file o cartella. Se viene passata una 173 + patch sulla linea di comando, lo script elencherà i manutentori che 174 + dovrebbero riceverne una copia. Ci sono svariate opzioni che regolano 175 + quanto a fondo get_maintainer.pl debba cercare i manutentori; 176 + siate quindi prudenti nell'utilizzare le opzioni più aggressive poiché 177 + potreste finire per includere sviluppatori che non hanno un vero interesse 178 + per il codice che state modificando. 179 + 180 + Se tutto ciò dovesse fallire, parlare con Andrew Morton potrebbe essere 181 + un modo efficace per capire chi è il manutentore di un dato pezzo di codice. 182 + 183 + Quando pubblicare 184 + ----------------- 185 + 186 + Se potete, pubblicate i vostri intenti durante le fasi preliminari, sarà 187 + molto utile. Descrivete il problema da risolvere e ogni piano che è stato 188 + elaborato per l'implementazione. Ogni informazione fornita può aiutare 189 + la comunità di sviluppo a fornire spunti utili per il progetto. 190 + 191 + Un evento che potrebbe risultare scoraggiate e che potrebbe accadere in 192 + questa fase non è il ricevere una risposta ostile, ma, invece, ottenere 193 + una misera o inesistente reazione. La triste verità è che: (1) gli 194 + sviluppatori del kernel tendono ad essere occupati, (2) ci sono tante persone 195 + con grandi progetti e poco codice (o anche solo la prospettiva di 196 + avere un codice) a cui riferirsi e (3) nessuno è obbligato a revisionare 197 + o a fare osservazioni in merito ad idee pubblicate da altri. Oltre a 198 + questo, progetti di alto livello spesso nascondono problematiche che si 199 + rivelano solo quando qualcuno cerca di implementarle; per questa ragione 200 + gli sviluppatori kernel preferirebbero vedere il codice. 201 + 202 + Quindi, se una richiesta pubblica di commenti riscuote poco successo, non 203 + pensate che ciò significhi che non ci sia interesse nel progetto. 204 + Sfortunatamente, non potete nemmeno assumere che non ci siano problemi con 205 + la vostra idea. La cosa migliore da fare in questa situazione è quella di 206 + andare avanti e tenere la comunità informata mentre procedete. 207 + 208 + Ottenere riscontri ufficiali 209 + ---------------------------- 210 + 211 + Se il vostro lavoro è stato svolto in un ambiente aziendale - come molto 212 + del lavoro fatto su Linux - dovete, ovviamente, avere il permesso dei 213 + dirigenti prima che possiate pubblicare i progetti, o il codice aziendale, 214 + su una lista di discussione pubblica. La pubblicazione di codice che non 215 + è stato rilascio espressamente con licenza GPL-compatibile può rivelarsi 216 + problematico; prima la dirigenza, e il personale legale, troverà una decisione 217 + sulla pubblicazione di un progetto, meglio sarà per tutte le persone coinvolte. 218 + 219 + A questo punto, alcuni lettori potrebbero pensare che il loro lavoro sul 220 + kernel è preposto a supportare un prodotto che non è ancora ufficialmente 221 + riconosciuto. Rivelare le intenzioni dei propri datori di lavori in una 222 + lista di discussione pubblica potrebbe non essere una soluzione valida. 223 + In questi casi, vale la pena considerare se la segretezza sia necessaria 224 + o meno; spesso non c'è una reale necessità di mantenere chiusi i progetti di 225 + sviluppo. 226 + 227 + Detto ciò, ci sono anche casi dove l'azienda legittimamente non può rivelare 228 + le proprie intenzioni in anticipo durante il processo di sviluppo. Le aziende 229 + che hanno sviluppatori kernel esperti possono scegliere di procedere a 230 + carte coperte partendo dall'assunto che saranno in grado di evitare, o gestire, 231 + in futuro, eventuali problemi d'integrazione. Per le aziende senza questo tipo 232 + di esperti, la migliore opzione è spesso quella di assumere uno sviluppatore 233 + esterno che revisioni i progetti con un accordo di segretezza. 234 + La Linux Foundation applica un programma di NDA creato appositamente per 235 + aiutare le aziende in questa particolare situazione; potrete trovare più 236 + informazioni sul sito: 237 + 238 + http://www.linuxfoundation.org/en/NDA_program 239 + 240 + Questa tipologia di revisione è spesso sufficiente per evitare gravi problemi 241 + senza che sia richiesta l'esposizione pubblica del progetto.
+437 -2
Documentation/translations/it_IT/process/4.Coding.rst
··· 1 1 .. include:: ../disclaimer-ita.rst 2 2 3 3 :Original: :ref:`Documentation/process/4.Coding.rst <development_coding>` 4 + :Translator: Alessia Mantegazza <amantegazza@vaga.pv.it> 4 5 5 6 .. _it_development_coding: 6 7 7 8 Scrivere codice corretto 8 9 ======================== 9 10 10 - .. warning:: 11 + Nonostante ci sia molto da dire sul processo di creazione, sulla sua solidità 12 + e sul suo orientamento alla comunità, la prova di ogni progetto di sviluppo 13 + del kernel si trova nel codice stesso. È il codice che sarà esaminato dagli 14 + altri sviluppatori ed inserito (o no) nel ramo principale. Quindi è la 15 + qualità di questo codice che determinerà il successo finale del progetto. 11 16 12 - TODO ancora da tradurre 17 + Questa sezione esaminerà il processo di codifica. Inizieremo con uno sguardo 18 + sulle diverse casistiche nelle quali gli sviluppatori kernel possono 19 + sbagliare. Poi, l'attenzione si sposterà verso "il fare le cose 20 + correttamente" e sugli strumenti che possono essere utili in questa missione. 21 + 22 + Trappole 23 + -------- 24 + 25 + Lo stile del codice 26 + ******************* 27 + 28 + Il kernel ha da tempo delle norme sullo stile di codifica che sono descritte in 29 + :ref:`Documentation/translations/it_IT/process/coding-style.rst <codingstyle>`. 30 + Per la maggior parte del tempo, la politica descritta in quel file è stata 31 + praticamente informativa. Ne risulta che ci sia una quantità sostanziale di 32 + codice nel kernel che non rispetta le linee guida relative allo stile. 33 + La presenza di quel codice conduce a due distinti pericoli per gli 34 + sviluppatori kernel. 35 + 36 + Il primo di questi è credere che gli standard di codifica del kernel 37 + non sono importanti e possono non essere applicati. La verità è che 38 + aggiungere nuovo codice al kernel è davvero difficile se questo non 39 + rispetta le norme; molti sviluppatori richiederanno che il codice sia 40 + riformulato prima che anche solo lo revisionino. Una base di codice larga 41 + quanto il kernel richiede una certa uniformità, in modo da rendere possibile 42 + per gli sviluppatori una comprensione veloce di ogni sua parte. Non ci sono, 43 + quindi, più spazi per un codice formattato alla carlona. 44 + 45 + Occasionalmente, lo stile di codifica del kernel andrà in conflitto con lo 46 + stile richiesto da un datore di lavoro. In alcuni casi, lo stile del kernel 47 + dovrà prevalere prima che il codice venga inserito. Mettere il codice 48 + all'interno del kernel significa rinunciare a un certo grado di controllo 49 + in differenti modi - incluso il controllo sul come formattare il codice. 50 + 51 + L’altra trappola è quella di pensare che il codice già presente nel kernel 52 + abbia urgentemente bisogno di essere sistemato. Gli sviluppatori potrebbero 53 + iniziare a generare patch che correggono lo stile come modo per prendere 54 + famigliarità con il processo, o come modo per inserire i propri nomi nei 55 + changelog del kernel – o entrambe. La comunità di sviluppo vede un attività 56 + di codifica puramente correttiva come "rumore"; queste attività riceveranno 57 + una fredda accoglienza. Di conseguenza è meglio evitare questo tipo di patch. 58 + Mentre si lavora su un pezzo di codice è normale correggerne anche lo stile, 59 + ma le modifiche di stile non dovrebbero essere fatte fini a se stesse. 60 + 61 + Il documento sullo stile del codice non dovrebbe essere letto come una legge 62 + assoluta che non può mai essere trasgredita. Se c’è un a buona ragione 63 + (per esempio, una linea che diviene poco leggibile se divisa per rientrare 64 + nel limite di 80 colonne), fatelo e basta. 65 + 66 + Notate che potete utilizzare lo strumento “clang-format” per aiutarvi con 67 + le regole, per una riformattazione automatica e veloce del vostro codice 68 + e per revisionare interi file per individuare errori nello stile di codifica, 69 + refusi e possibili miglioramenti. Inoltre è utile anche per classificare gli 70 + ``#includes``, per allineare variabili/macro, per testi derivati ed altri 71 + compiti del genere. Consultate il file 72 + :ref:`Documentation/translations/it_IT/process/clang-format.rst <clangformat>` 73 + per maggiori dettagli 74 + 75 + 76 + Livelli di astrazione 77 + ********************* 78 + 79 + 80 + I professori di Informatica insegnano ai propri studenti a fare ampio uso dei 81 + livelli di astrazione nel nome della flessibilità e del nascondere informazioni. 82 + Certo il kernel fa un grande uso dell'astrazione; nessun progetto con milioni 83 + di righe di codice potrebbe fare altrimenti e sopravvivere. Ma l'esperienza 84 + ha dimostrato che un'eccessiva o prematura astrazione può rivelarsi dannosa 85 + al pari di una prematura ottimizzazione. L'astrazione dovrebbe essere usata 86 + fino al livello necessario e non oltre. 87 + 88 + Ad un livello base, considerate una funzione che ha un argomento che viene 89 + sempre impostato a zero da tutti i chiamanti. Uno potrebbe mantenere 90 + quell'argomento nell'eventualità qualcuno volesse sfruttare la flessibilità 91 + offerta. In ogni caso, tuttavia, ci sono buone possibilità che il codice 92 + che va ad implementare questo argomento aggiuntivo, sia stato rotto in maniera 93 + sottile, in un modo che non è mai stato notato - perché non è mai stato usato. 94 + Oppure, quando sorge la necessità di avere più flessibilità, questo argomento 95 + non la fornisce in maniera soddisfacente. Gli sviluppatori di Kernel, 96 + sottopongono costantemente patch che vanno a rimuovere gli argomenti 97 + inutilizzate; anche se, in generale, non avrebbero dovuto essere aggiunti. 98 + 99 + I livelli di astrazione che nascondono l'accesso all'hardware - 100 + spesso per poter usare dei driver su diversi sistemi operativi - vengono 101 + particolarmente disapprovati. Tali livelli oscurano il codice e possono 102 + peggiorare le prestazioni; essi non appartengono al kernel Linux. 103 + 104 + D'altro canto, se vi ritrovate a dover copiare una quantità significativa di 105 + codice proveniente da un altro sottosistema del kernel, è tempo di chiedersi 106 + se, in effetti, non avrebbe più senso togliere parte di quel codice e metterlo 107 + in una libreria separata o di implementare quella funzionalità ad un livello 108 + più elevato. Non c'è utilità nel replicare lo stesso codice per tutto 109 + il kernel. 110 + 111 + 112 + #ifdef e l'uso del preprocessore in generale 113 + ******************************************** 114 + 115 + Il preprocessore C sembra essere una fonte di attrazione per qualche 116 + programmatore C, che ci vede una via per ottenere una grande flessibilità 117 + all'interno di un file sorgente. Ma il preprocessore non è scritto in C, 118 + e un suo massiccio impiego conduce a un codice che è molto più difficile 119 + da leggere per gli altri e che rende più difficile il lavoro di verifica del 120 + compilatore. L'uso eccessivo del preprocessore è praticamente sempre il segno 121 + di un codice che necessita di un certo lavoro di pulizia. 122 + 123 + La compilazione condizionata con #ifdef è, in effetti, un potente strumento, 124 + ed esso viene usato all'interno del kernel. Ma esiste un piccolo desiderio: 125 + quello di vedere il codice coperto solo da una leggera spolverata di 126 + blocchi #ifdef. Come regola generale, quando possibile, l'uso di #ifdef 127 + dovrebbe essere confinato nei file d'intestazione. Il codice compilato 128 + condizionatamente può essere confinato a funzioni tali che, nel caso in cui 129 + il codice non deve essere presente, diventano vuote. Il compilatore poi 130 + ottimizzerà la chiamata alla funzione vuota rimuovendola. Il risultato è 131 + un codice molto più pulito, più facile da seguire. 132 + 133 + Le macro del preprocessore C presentano una serie di pericoli, inclusi 134 + valutazioni multiple di espressioni che hanno effetti collaterali e non 135 + garantiscono una sicurezza rispetto ai tipi. Se siete tentati dal definire 136 + una macro, considerate l'idea di creare invece una funzione inline. Il codice 137 + che ne risulterà sarà lo stesso, ma le funzioni inline sono più leggibili, 138 + non considerano i propri argomenti più volte, e permettono al compilatore di 139 + effettuare controlli sul tipo degli argomenti e del valore di ritorno. 140 + 141 + 142 + Funzioni inline 143 + *************** 144 + 145 + Comunque, anche le funzioni inline hanno i loro pericoli. I programmatori 146 + potrebbero innamorarsi dell'efficienza percepita derivata dalla rimozione 147 + di una chiamata a funzione. Queste funzioni, tuttavia, possono ridurre le 148 + prestazioni. Dato che il loro codice viene replicato ovunque vi sia una 149 + chiamata ad esse, si finisce per gonfiare le dimensioni del kernel compilato. 150 + Questi, a turno, creano pressione sulla memoria cache del processore, e questo 151 + può causare rallentamenti importanti. Le funzioni inline, di norma, dovrebbero 152 + essere piccole e usate raramente. Il costo di una chiamata a funzione, dopo 153 + tutto, non è così alto; la creazione di molte funzioni inline è il classico 154 + esempio di un'ottimizzazione prematura. 155 + 156 + In generale, i programmatori del kernel ignorano gli effetti della cache a 157 + loro rischio e pericolo. Il classico compromesso tempo/spazio teorizzato 158 + all'inizio delle lezioni sulle strutture dati spesso non si applica 159 + all'hardware moderno. Lo spazio *è* tempo, in questo senso un programma 160 + più grande sarà più lento rispetto ad uno più compatto. 161 + 162 + I compilatori più recenti hanno preso un ruolo attivo nel decidere se 163 + una data funzione deve essere resa inline oppure no. Quindi l'uso 164 + indiscriminato della parola chiave "inline" potrebbe non essere non solo 165 + eccessivo, ma anche irrilevante. 166 + 167 + Sincronizzazione 168 + **************** 169 + 170 + Nel maggio 2006, il sistema di rete "Devicescape" fu rilasciato in pompa magna 171 + sotto la licenza GPL e reso disponibile per la sua inclusione nella ramo 172 + principale del kernel. Questa donazione fu una notizia bene accolta; 173 + il supporto per le reti senza fili era considerata, nel migliore dei casi, 174 + al di sotto degli standard; il sistema Deviscape offrì la promessa di una 175 + risoluzione a tale situazione. Tuttavia, questo codice non fu inserito nel 176 + ramo principale fino al giugno del 2007 (2.6.22). Cosa accadde? 177 + 178 + Quel codice mostrava numerosi segnali di uno sviluppo in azienda avvenuto 179 + a porte chiuse. Ma in particolare, un grosso problema fu che non fu 180 + progettato per girare in un sistema multiprocessore. Prima che questo 181 + sistema di rete (ora chiamato mac80211) potesse essere inserito, fu necessario 182 + un lavoro sugli schemi di sincronizzazione. 183 + 184 + Una volta, il codice del kernel Linux poteva essere sviluppato senza pensare 185 + ai problemi di concorrenza presenti nei sistemi multiprocessore. Ora, 186 + comunque, questo documento è stato scritto su di un portatile dual-core. 187 + Persino su sistemi a singolo processore, il lavoro svolto per incrementare 188 + la capacità di risposta aumenterà il livello di concorrenza interno al kernel. 189 + I giorni nei quali il codice poteva essere scritto senza pensare alla 190 + sincronizzazione sono da passati tempo. 191 + 192 + Ogni risorsa (strutture dati, registri hardware, etc.) ai quali si potrebbe 193 + avere accesso simultaneo da più di un thread deve essere sincronizzato. Il 194 + nuovo codice dovrebbe essere scritto avendo tale accortezza in testa; 195 + riadattare la sincronizzazione a posteriori è un compito molto più difficile. 196 + Gli sviluppatori del kernel dovrebbero prendersi il tempo di comprendere bene 197 + le primitive di sincronizzazione, in modo da sceglier lo strumento corretto 198 + per eseguire un compito. Il codice che presenta una mancanza di attenzione 199 + alla concorrenza avrà un percorso difficile all'interno del ramo principale. 200 + 201 + Regressioni 202 + *********** 203 + 204 + Vale la pena menzionare un ultimo pericolo: potrebbe rivelarsi accattivante 205 + l'idea di eseguire un cambiamento (che potrebbe portare a grandi 206 + miglioramenti) che porterà ad alcune rotture per gli utenti esistenti. 207 + Questa tipologia di cambiamento è chiamata "regressione", e le regressioni son 208 + diventate mal viste nel ramo principale del kernel. Con alcune eccezioni, 209 + i cambiamenti che causano regressioni saranno fermati se quest'ultime non 210 + potranno essere corrette in tempo utile. È molto meglio quindi evitare 211 + la regressione fin dall'inizio. 212 + 213 + Spesso si è argomentato che una regressione può essere giustificata se essa 214 + porta risolve più problemi di quanti non ne crei. Perché, dunque, non fare 215 + un cambiamento se questo porta a nuove funzionalità a dieci sistemi per 216 + ognuno dei quali esso determina una rottura? La migliore risposta a questa 217 + domanda ci è stata fornita da Linus nel luglio 2007: 218 + 219 + :: 220 + Dunque, noi non sistemiamo bachi introducendo nuovi problemi. Quella 221 + via nasconde insidie, e nessuno può sapere del tutto se state facendo 222 + dei progressi reali. Sono due passi avanti e uno indietro, oppure 223 + un passo avanti e due indietro? 224 + 225 + (http://lwn.net/Articles/243460/). 226 + 227 + Una particolare tipologia di regressione mal vista consiste in una qualsiasi 228 + sorta di modifica all'ABI dello spazio utente. Una volta che un'interfaccia 229 + viene esportata verso lo spazio utente, dev'essere supportata all'infinito. 230 + Questo fatto rende la creazione di interfacce per lo spazio utente 231 + particolarmente complicato: dato che non possono venir cambiate introducendo 232 + incompatibilità, esse devono essere fatte bene al primo colpo. Per questa 233 + ragione sono sempre richieste: ampie riflessioni, documentazione chiara e 234 + ampie revisioni dell'interfaccia verso lo spazio utente. 235 + 236 + 237 + Strumenti di verifica del codice 238 + -------------------------------- 239 + Almeno per ora la scrittura di codice priva di errori resta un ideale 240 + irraggiungibile ai più. Quello che speriamo di poter fare, tuttavia, è 241 + trovare e correggere molti di questi errori prima che il codice entri nel 242 + ramo principale del kernel. A tal scopo gli sviluppatori del kernel devono 243 + mettere insieme una schiera impressionante di strumenti che possano 244 + localizzare automaticamente un'ampia varietà di problemi. Qualsiasi problema 245 + trovato dal computer è un problema che non affliggerà l'utente in seguito, 246 + ne consegue che gli strumenti automatici dovrebbero essere impiegati ovunque 247 + possibile. 248 + 249 + Il primo passo consiste semplicemente nel fare attenzione agli avvertimenti 250 + proveniente dal compilatore. Versioni moderne di gcc possono individuare 251 + (e segnalare) un gran numero di potenziali errori. Molto spesso, questi 252 + avvertimenti indicano problemi reali. Di regola, il codice inviato per la 253 + revisione non dovrebbe produrre nessun avvertimento da parte del compilatore. 254 + Per mettere a tacere gli avvertimenti, cercate di comprenderne le cause reali 255 + e cercate di evitare le "riparazioni" che fan sparire l'avvertimento senza 256 + però averne trovato la causa. 257 + 258 + Tenete a mente che non tutti gli avvertimenti sono disabilitati di default. 259 + Costruite il kernel con "make EXTRA_CFLAGS=-W" per ottenerli tutti. 260 + 261 + Il kernel fornisce differenti opzioni che abilitano funzionalità di debugging; 262 + molti di queste sono trovano all'interno del sotto menu "kernel hacking". 263 + La maggior parte di queste opzioni possono essere attivate per qualsiasi 264 + kernel utilizzato per lo sviluppo o a scopo di test. In particolare dovreste 265 + attivare: 266 + 267 + - ENABLE_WARN_DEPRECATED, ENABLE_MUST_CHECK, e FRAME_WARN per ottenere degli 268 + avvertimenti dedicati a problemi come l'uso di interfacce deprecate o 269 + l'ignorare un importante valore di ritorno di una funzione. Il risultato 270 + generato da questi avvertimenti può risultare verboso, ma non bisogna 271 + preoccuparsi per gli avvertimenti provenienti da altre parti del kernel. 272 + 273 + - DEBUG_OBJECTS aggiungerà un codice per tracciare il ciclo di vita di 274 + diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito 275 + fuori controllo. Se state aggiungendo un sottosistema che crea (ed 276 + esporta) oggetti complessi propri, considerate l'aggiunta di un supporto 277 + al debugging dell'oggetto. 278 + 279 + - DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria; 280 + esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo. 281 + 282 + - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo 283 + numero di errori comuni di sincronizzazione. 284 + 285 + Esistono ancora delle altre opzioni di debugging, di alcune di esse 286 + discuteremo qui sotto. Alcune di esse hanno un forte impatto e non dovrebbero 287 + essere usate tutte le volte. Ma qualche volta il tempo speso nell'capire 288 + le opzioni disponibili porterà ad un risparmio di tempo nel breve termine. 289 + 290 + Uno degli strumenti di debugging più tosti è il *locking checker*, o 291 + "lockdep". Questo strumento traccerà qualsiasi acquisizione e rilascio di 292 + ogni *lock* (spinlock o mutex) nel sistema, l'ordine con il quale i *lock* 293 + sono acquisiti in relazione l'uno con l'altro, l'ambiente corrente di 294 + interruzione, eccetera. Inoltre esso può assicurare che i *lock* vengano 295 + acquisiti sempre nello stesso ordine, che le stesse assunzioni sulle 296 + interruzioni si applichino in tutte le occasioni, e così via. In altre parole, 297 + lockdep può scovare diversi scenari nei quali il sistema potrebbe, in rari 298 + casi, trovarsi in stallo. Questa tipologia di problema può essere grave 299 + (sia per gli sviluppatori che per gli utenti) in un sistema in uso; lockdep 300 + permette di trovare tali problemi automaticamente e in anticipo. 301 + 302 + In qualità di programmatore kernel diligente, senza dubbio, dovrete controllare 303 + il valore di ritorno di ogni operazione (come l'allocazione della memoria) 304 + poiché esso potrebbe fallire. Il nocciolo della questione è che i percorsi 305 + di gestione degli errori, con grande probabilità, non sono mai stati 306 + collaudati del tutto. Il codice collaudato tende ad essere codice bacato; 307 + potrete quindi essere più a vostro agio con il vostro codice se tutti questi 308 + percorsi fossero stati verificati un po' di volte. 309 + 310 + Il kernel fornisce un framework per l'inserimento di fallimenti che fa 311 + esattamente al caso, specialmente dove sono coinvolte allocazioni di memoria. 312 + Con l'opzione per l'inserimento dei fallimenti abilitata, una certa percentuale 313 + di allocazione di memoria sarà destinata al fallimento; questi fallimenti 314 + possono essere ridotti ad uno specifico pezzo di codice. Procedere con 315 + l'inserimento dei fallimenti attivo permette al programmatore di verificare 316 + come il codice risponde quando le cose vanno male. Consultate: 317 + Documentation/fault-injection/fault-injection.txt per avere maggiori 318 + informazioni su come utilizzare questo strumento. 319 + 320 + Altre tipologie di errori possono essere riscontrati con lo strumento di 321 + analisi statica "sparse". Con Sparse, il programmatore può essere avvisato 322 + circa la confusione tra gli indirizzi dello spazio utente e dello spazio 323 + kernel, un miscuglio fra quantità big-endian e little-endian, il passaggio 324 + di un valore intero dove ci sia aspetta un gruppo di flag, e così via. 325 + Sparse deve essere installato separatamente (se il vostra distribuzione non 326 + lo prevede, potete trovarlo su https://sparse.wiki.kernel.org/index.php/Main_Page); 327 + può essere attivato sul codice aggiungendo "C=1" al comando make. 328 + 329 + Lo strumento "Coccinelle" (http://coccinelle.lip6.fr/) è in grado di trovare 330 + una vasta varietà di potenziali problemi di codifica; e può inoltre proporre 331 + soluzioni per risolverli. Un buon numero di "patch semantiche" per il kernel 332 + sono state preparate nella cartella scripts/coccinelle; utilizzando 333 + "make coccicheck" esso percorrerà tali patch semantiche e farà rapporto su 334 + qualsiasi problema trovato. Per maggiori informazioni, consultate 335 + :ref:`Documentation/dev-tools/coccinelle.rst <devtools_coccinelle>`. 336 + 337 + Altri errori di portabilità sono meglio scovati compilando il vostro codice 338 + per altre architetture. Se non vi accade di avere un sistema S/390 o una 339 + scheda di sviluppo Blackfin sotto mano, potete comunque continuare la fase 340 + di compilazione. Un vasto numero di cross-compilatori per x86 possono 341 + essere trovati al sito: 342 + 343 + http://www.kernel.org/pub/tools/crosstool/ 344 + 345 + Il tempo impiegato nell'installare e usare questi compilatori sarà d'aiuto 346 + nell'evitare situazioni imbarazzanti nel futuro. 347 + 348 + 349 + Documentazione 350 + -------------- 351 + 352 + La documentazione è spesso stata più un'eccezione che una regola nello 353 + sviluppo del kernel. Nonostante questo, un'adeguata documentazione aiuterà 354 + a facilitare l'inserimento di nuovo codice nel kernel, rende la vita più 355 + facile per gli altri sviluppatori e sarà utile per i vostri utenti. In molti 356 + casi, la documentazione è divenuta sostanzialmente obbligatoria. 357 + 358 + La prima parte di documentazione per qualsiasi patch è il suo changelog. 359 + Questi dovrebbero descrivere le problematiche risolte, la tipologia di 360 + soluzione, le persone che lavorano alla patch, ogni effetto rilevante 361 + sulle prestazioni e tutto ciò che può servire per la comprensione della 362 + patch. Assicuratevi che il changelog dica *perché*, vale la pena aggiungere 363 + la patch; un numero sorprendente di sviluppatori sbaglia nel fornire tale 364 + informazione. 365 + 366 + Qualsiasi codice che aggiunge una nuova interfaccia in spazio utente - inclusi 367 + nuovi file in sysfs o /proc - dovrebbe includere la documentazione di tale 368 + interfaccia così da permette agli sviluppatori dello spazio utente di sapere 369 + con cosa stanno lavorando. Consultate: Documentation/ABI/README per avere una 370 + descrizione di come questi documenti devono essere impostati e quali 371 + informazioni devono essere fornite. 372 + 373 + Il file :ref:`Documentation/translations/it_IT/admin-guide/kernel-parameters.rst <kernelparameters>` 374 + descrive tutti i parametri di avvio del kernel. Ogni patch che aggiunga 375 + nuovi parametri dovrebbe aggiungere nuove voci a questo file. 376 + 377 + Ogni nuova configurazione deve essere accompagnata da un testo di supporto 378 + che spieghi chiaramente le opzioni e spieghi quando l'utente potrebbe volerle 379 + selezionare. 380 + 381 + Per molti sottosistemi le informazioni sull'API interna sono documentate sotto 382 + forma di commenti formattati in maniera particolare; questi commenti possono 383 + essere estratti e formattati in differenti modi attraverso lo script 384 + "kernel-doc". Se state lavorando all'interno di un sottosistema che ha 385 + commenti kerneldoc dovreste mantenerli e aggiungerli, in maniera appropriata, 386 + per le funzioni disponibili esternamente. Anche in aree che non sono molto 387 + documentate, non c'è motivo per non aggiungere commenti kerneldoc per il 388 + futuro; infatti, questa può essere un'attività utile per sviluppatori novizi 389 + del kernel. Il formato di questi commenti, assieme alle informazione su come 390 + creare modelli per kerneldoc, possono essere trovati in 391 + :ref:`Documentation/translations/it_IT/doc-guide/ <doc_guide>`. 392 + 393 + Chiunque legga un ammontare significativo di codice kernel noterà che, spesso, 394 + i commenti si fanno maggiormente notare per la loro assenza. Ancora una volta, 395 + le aspettative verso il nuovo codice sono più alte rispetto al passato; 396 + inserire codice privo di commenti sarà più difficile. Detto ciò, va aggiunto 397 + che non si desiderano commenti prolissi per il codice. Il codice dovrebbe 398 + essere, di per sé, leggibile, con dei commenti che spieghino gli aspetti più 399 + sottili. 400 + 401 + Determinate cose dovrebbero essere sempre commentate. L'uso di barriere 402 + di memoria dovrebbero essere accompagnate da una riga che spieghi perché sia 403 + necessaria. Le regole di sincronizzazione per le strutture dati, generalmente, 404 + necessitano di una spiegazioni da qualche parte. Le strutture dati più 405 + importanti, in generale, hanno bisogno di una documentazione onnicomprensiva. 406 + Le dipendenze che non sono ovvie tra bit separati di codice dovrebbero essere 407 + indicate. Tutto ciò che potrebbe indurre un inserviente del codice a fare 408 + una "pulizia" incorretta, ha bisogno di un commento che dica perché è stato 409 + fatto in quel modo. E così via. 410 + 411 + Cambiamenti interni dell'API 412 + ---------------------------- 413 + 414 + L'interfaccia binaria fornita dal kernel allo spazio utente non può essere 415 + rotta tranne che in circostanze eccezionali. L'interfaccia di programmazione 416 + interna al kernel, invece, è estremamente fluida e può essere modificata al 417 + bisogno. Se vi trovate a dover lavorare attorno ad un'API del kernel o 418 + semplicemente non state utilizzando una funzionalità offerta perché questa 419 + non rispecchia i vostri bisogni, allora questo potrebbe essere un segno che 420 + l'API ha bisogno di essere cambiata. In qualità di sviluppatore del kernel, 421 + hai il potere di fare questo tipo di modifica. 422 + 423 + Ci sono ovviamente alcuni punti da cogliere. I cambiamenti API possono essere 424 + fatti, ma devono essere giustificati. Quindi ogni patch che porta ad una 425 + modifica dell'API interna dovrebbe essere accompagnata da una descrizione 426 + della modifica in sé e del perché essa è necessaria. Questo tipo di 427 + cambiamenti dovrebbero, inoltre, essere fatti in una patch separata, invece di 428 + essere sepolti all'interno di una patch più grande. 429 + 430 + L'altro punto da cogliere consiste nel fatto che uno sviluppatore che 431 + modifica l'API deve, in generale, essere responsabile della correzione 432 + di tutto il codice del kernel che viene rotto per via della sua modifica. 433 + Per una funzione ampiamente usata, questo compito può condurre letteralmente 434 + a centinaia o migliaia di modifiche, molte delle quali sono in conflitto con 435 + il lavoro svolto da altri sviluppatori. Non c'è bisogno di dire che questo 436 + può essere un lavoro molto grosso, quindi è meglio essere sicuri che la 437 + motivazione sia ben solida. Notate che lo strumento Coccinelle può fornire 438 + un aiuto con modifiche estese dell'API. 439 + 440 + Quando viene fatta una modifica API incompatibile, una persona dovrebbe, 441 + quando possibile, assicurarsi che quel codice non aggiornato sia trovato 442 + dal compilatore. Questo vi aiuterà ad essere sicuri d'avere trovato, 443 + tutti gli usi di quell'interfaccia. Inoltre questo avviserà gli sviluppatori 444 + di codice fuori dal kernel che c'è un cambiamento per il quale è necessario del 445 + lavoro. Il supporto al codice fuori dal kernel non è qualcosa di cui gli 446 + sviluppatori del kernel devono preoccuparsi, ma non dobbiamo nemmeno rendere 447 + più difficile del necessario la vita agli sviluppatori di questo codice.
+339 -3
Documentation/translations/it_IT/process/5.Posting.rst
··· 1 1 .. include:: ../disclaimer-ita.rst 2 2 3 - :Original: :ref:`Documentation/process/4.Posting.rst <development_posting>` 3 + :Original: :ref:`Documentation/process/5.Posting.rst <development_posting>` 4 + :Translator: Federico Vaga <federico.vaga@vaga.pv.it> 4 5 5 6 .. _it_development_posting: 6 7 7 8 Pubblicare modifiche 8 9 ==================== 9 10 10 - .. warning:: 11 + Prima o poi arriva il momento in cui il vostro lavoro è pronto per essere 12 + presentato alla comunità per una revisione ed eventualmente per la sua 13 + inclusione nel ramo principale del kernel. Com'era prevedibile, 14 + la comunità di sviluppo del kernel ha elaborato un insieme di convenzioni 15 + e di procedure per la pubblicazione delle patch; seguirle renderà la vita 16 + più facile a tutti quanti. Questo documento cercherà di coprire questi 17 + argomenti con un ragionevole livello di dettaglio; più informazioni possono 18 + essere trovare nella cartella 'Documentation', nei file 19 + :ref:`translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`, 20 + :ref:`translations/it_IT/process/submitting-drivers.rst <it_submittingdrivers>`, e 21 + :ref:`translations/it_IT/process/submit-checklist.rst <it_submitchecklist>`. 11 22 12 - TODO ancora da tradurre 23 + 24 + Quando pubblicarle 25 + ------------------ 26 + 27 + C'è sempre una certa resistenza nel pubblicare patch finché non sono 28 + veramente "pronte". Per semplici patch questo non è un problema. 29 + Ma quando il lavoro è di una certa complessità, c'è molto da guadagnare 30 + dai riscontri che la comunità può darvi prima che completiate il lavoro. 31 + Dovreste considerare l'idea di pubblicare un lavoro incompleto, o anche 32 + preparare un ramo git disponibile agli sviluppatori interessati, cosicché 33 + possano stare al passo col vostro lavoro in qualunque momento. 34 + 35 + Quando pubblicate del codice che non è considerato pronto per l'inclusione, 36 + è bene che lo diciate al momento della pubblicazione. Inoltre, aggiungete 37 + informazioni sulle cose ancora da sviluppare e sui problemi conosciuti. 38 + Poche persone guarderanno delle patch che si sa essere fatte a metà, 39 + ma quelli che lo faranno penseranno di potervi aiutare a condurre il vostro 40 + sviluppo nella giusta direzione. 41 + 42 + 43 + Prima di creare patch 44 + --------------------- 45 + 46 + Ci sono un certo numero di cose che dovreste fare prima di considerare 47 + l'invio delle patch alla comunità di sviluppo. Queste cose includono: 48 + 49 + - Verificare il codice fino al massimo che vi è consentito. Usate gli 50 + strumenti di debug del kernel, assicuratevi che il kernel compili con 51 + tutte le più ragionevoli combinazioni d'opzioni, usate cross-compilatori 52 + per compilare il codice per differenti architetture, eccetera. 53 + 54 + - Assicuratevi che il vostro codice sia conforme alla linee guida del 55 + kernel sullo stile del codice. 56 + 57 + - La vostra patch ha delle conseguenze in termini di prestazioni? 58 + Se è così, dovreste eseguire dei *benchmark* che mostrino il loro 59 + impatto (anche positivo); un riassunto dei risultati dovrebbe essere 60 + incluso nella patch. 61 + 62 + - Siate certi d'avere i diritti per pubblicare il codice. Se questo 63 + lavoro è stato fatto per un datore di lavoro, egli avrà dei diritti su 64 + questo lavoro e dovrà quindi essere d'accordo alla sua pubblicazione 65 + con una licenza GPL 66 + 67 + Come regola generale, pensarci un po' di più prima di inviare il codice 68 + ripaga quasi sempre lo sforzo. 69 + 70 + 71 + Preparazione di una patch 72 + ------------------------- 73 + 74 + La preparazione delle patch per la pubblicazione può richiedere una quantità 75 + di lavoro significativa, ma, ripetiamolo ancora, generalmente sconsigliamo 76 + di risparmiare tempo in questa fase, anche sul breve periodo. 77 + 78 + Le patch devono essere preparate per una specifica versione del kernel. 79 + Come regola generale, una patch dovrebbe basarsi sul ramo principale attuale 80 + così come lo si trova nei sorgenti git di Linus. Quando vi basate sul ramo 81 + principale, cominciate da un punto di rilascio ben noto - uno stabile o 82 + un -rc - piuttosto che creare il vostro ramo da quello principale in un punto 83 + a caso. 84 + 85 + Per facilitare una revisione e una verifica più estesa, potrebbe diventare 86 + necessaria la produzione di versioni per -mm, linux-next o i sorgenti di un 87 + sottosistema. Basare questa patch sui suddetti sorgenti potrebbe richiedere 88 + un lavoro significativo nella risoluzione dei conflitti e nella correzione dei 89 + cambiamenti di API; questo potrebbe variare a seconda dell'area d'interesse 90 + della vostra patch e da quello che succede altrove nel kernel. 91 + 92 + Solo le modifiche più semplici dovrebbero essere preparate come una singola 93 + patch; tutto il resto dovrebbe essere preparato come una serie logica di 94 + modifiche. Spezzettare le patch è un po' un'arte; alcuni sviluppatori 95 + passano molto tempo nel capire come farlo in modo che piaccia alla comunità. 96 + Ci sono alcune regole spannometriche, che comunque possono aiutare 97 + considerevolmente: 98 + 99 + - La serie di patch che pubblicherete, quasi sicuramente, non sarà 100 + come quella che trovate nel vostro sistema di controllo di versione. 101 + Invece, le vostre modifiche dovranno essere considerate nella loro forma 102 + finale, e quindi separate in parti che abbiano un senso. Gli sviluppatori 103 + sono interessati in modifiche che siano discrete e indipendenti, non 104 + alla strada che avete percorso per ottenerle. 105 + 106 + - Ogni modifica logicamente indipendente dovrebbe essere preparata come una 107 + patch separata. Queste modifiche possono essere piccole ("aggiunto un 108 + campo in questa struttura") o grandi (l'aggiunta di un driver nuovo, 109 + per esempio), ma dovrebbero essere concettualmente piccole da permettere 110 + una descrizione in una sola riga. Ogni patch dovrebbe fare modifiche 111 + specifiche che si possano revisionare indipendentemente e di cui si possa 112 + verificare la veridicità. 113 + 114 + - Giusto per riaffermare quando detto sopra: non mischiate diversi tipi di 115 + modifiche nella stessa patch. Se una modifica corregge un baco critico 116 + per la sicurezza, riorganizza alcune strutture, e riformatta il codice, 117 + ci sono buone probabilità che venga ignorata e che la correzione importante 118 + venga persa. 119 + 120 + - Ogni modifica dovrebbe portare ad un kernel che compila e funziona 121 + correttamente; se la vostra serie di patch si interrompe a metà il 122 + risultato dovrebbe essere comunque un kernel funzionante. L'applicazione 123 + parziale di una serie di patch è uno scenario comune nel quale il 124 + comando "git bisect" viene usato per trovare delle regressioni; se il 125 + risultato è un kernel guasto, renderete la vita degli sviluppatori più 126 + difficile così come quella di chi s'impegna nel nobile lavoro di 127 + scovare i problemi. 128 + 129 + - Però, non strafate. Una volta uno sviluppatore pubblicò una serie di 500 130 + patch che modificavano un unico file - un atto che non lo rese la persona 131 + più popolare sulla lista di discussione del kernel. Una singola patch 132 + può essere ragionevolmente grande fintanto che contenga un singolo 133 + cambiamento *logico*. 134 + 135 + - Potrebbe essere allettante l'idea di aggiungere una nuova infrastruttura 136 + come una serie di patch, ma di lasciare questa infrastruttura inutilizzata 137 + finché l'ultima patch della serie non abilita tutto quanto. Quando è 138 + possibile, questo dovrebbe essere evitato; se questa serie aggiunge delle 139 + regressioni, "bisect" indicherà quest'ultima patch come causa del 140 + problema anche se il baco si trova altrove. Possibilmente, quando una 141 + patch aggiunge del nuovo codice dovrebbe renderlo attivo immediatamente. 142 + 143 + Lavorare per creare la serie di patch perfetta potrebbe essere frustrante 144 + perché richiede un certo tempo e soprattutto dopo che il "vero lavoro" è 145 + già stato fatto. Quando ben fatto, comunque, è tempo ben speso. 146 + 147 + 148 + Formattazione delle patch e i changelog 149 + --------------------------------------- 150 + 151 + Quindi adesso avete una serie perfetta di patch pronte per la pubblicazione, 152 + ma il lavoro non è davvero finito. Ogni patch deve essere preparata con 153 + un messaggio che spieghi al resto del mondo, in modo chiaro e veloce, 154 + il suo scopo. Per ottenerlo, ogni patch sarà composta dai seguenti elementi: 155 + 156 + - Un campo opzionale "From" col nome dell'autore della patch. Questa riga 157 + è necessaria solo se state passando la patch di qualcun altro via email, 158 + ma nel dubbio non fa di certo male aggiungerlo. 159 + 160 + - Una descrizione di una riga che spieghi cosa fa la patch. Questo 161 + messaggio dovrebbe essere sufficiente per far comprendere al lettore lo 162 + scopo della patch senza altre informazioni. Questo messaggio, 163 + solitamente, presenta in testa il nome del sottosistema a cui si riferisce, 164 + seguito dallo scopo della patch. Per esempio: 165 + 166 + :: 167 + 168 + gpio: fix build on CONFIG_GPIO_SYSFS=n 169 + 170 + - Una riga bianca seguita da una descrizione dettagliata della patch. 171 + Questa descrizione può essere lunga tanto quanto serve; dovrebbe spiegare 172 + cosa fa e perché dovrebbe essere aggiunta al kernel. 173 + 174 + - Una o più righe etichette, con, minimo, una riga *Signed-off-by:* 175 + col nome dall'autore della patch. Queste etichette verranno descritte 176 + meglio più avanti. 177 + 178 + Gli elementi qui sopra, assieme, formano il changelog di una patch. 179 + Scrivere un buon changelog è cruciale ma è spesso un'arte trascurata; 180 + vale la pena spendere qualche parola in più al riguardo. Quando scrivete 181 + un changelog dovreste tenere ben presente che molte persone leggeranno 182 + le vostre parole. Queste includono i manutentori di un sotto-sistema, e i 183 + revisori che devono decidere se la patch debba essere inclusa o no, 184 + le distribuzioni e altri manutentori che cercano di valutare se la patch 185 + debba essere applicata su kernel più vecchi, i cacciatori di bachi che si 186 + chiederanno se la patch è la causa di un problema che stanno cercando, 187 + gli utenti che vogliono sapere com'è cambiato il kernel, e molti altri. 188 + Un buon changelog fornisce le informazioni necessarie a tutte queste 189 + persone nel modo più diretto e conciso possibile. 190 + 191 + A questo scopo, la riga riassuntiva dovrebbe descrivere gli effetti della 192 + modifica e la motivazione della patch nel modo migliore possibile nonostante 193 + il limite di una sola riga. La descrizione dettagliata può spiegare meglio 194 + i temi e fornire maggiori informazioni. Se una patch corregge un baco, 195 + citate, se possibile, il commit che lo introdusse (e per favore, quando 196 + citate un commit aggiungete sia il suo identificativo che il titolo), 197 + Se il problema è associabile ad un file di log o all' output del compilatore, 198 + includeteli al fine d'aiutare gli altri a trovare soluzioni per lo stesso 199 + problema. Se la modifica ha lo scopo di essere di supporto a sviluppi 200 + successivi, ditelo. Se le API interne vengono cambiate, dettagliate queste 201 + modifiche e come gli altri dovrebbero agire per applicarle. In generale, 202 + più riuscirete ad entrare nei panni di tutti quelli che leggeranno il 203 + vostro changelog, meglio sarà il changelog (e il kernel nel suo insieme). 204 + 205 + Non serve dirlo, un changelog dovrebbe essere il testo usato nel messaggio 206 + di commit in un sistema di controllo di versione. Sarà seguito da: 207 + 208 + - La patch stessa, nel formato unificato per patch ("-u"). Usare 209 + l'opzione "-p" assocerà alla modifica il nome della funzione alla quale 210 + si riferisce, rendendo il risultato più facile da leggere per gli altri. 211 + 212 + Dovreste evitare di includere nelle patch delle modifiche per file 213 + irrilevanti (quelli generati dal processo di generazione, per esempio, o i file 214 + di backup del vostro editor). Il file "dontdiff" nella cartella Documentation 215 + potrà esservi d'aiuto su questo punto; passatelo a diff con l'opzione "-X". 216 + 217 + Le etichette sopra menzionante sono usate per descrivere come i vari 218 + sviluppatori sono stati associati allo sviluppo di una patch. Sono descritte 219 + in dettaglio nel documento :ref:`translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`; 220 + quello che segue è un breve riassunto. Ognuna di queste righe ha il seguente 221 + formato: 222 + 223 + :: 224 + 225 + tag: Full Name <email address> optional-other-stuff 226 + 227 + Le etichette in uso più comuni sono: 228 + 229 + - Signed-off-by: questa è la certificazione che lo sviluppatore ha il diritto 230 + di sottomettere la patch per l'integrazione nel kernel. Questo rappresenta 231 + il consenso verso il certificato d'origine degli sviluppatori, il testo 232 + completo potrà essere trovato in 233 + :ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`. 234 + Codice che non presenta una firma appropriata non potrà essere integrato. 235 + 236 + - Co-developed-by: indica che la patch è stata sviluppata anche da un altro 237 + sviluppatore assieme all'autore originale. Questo è utile quando più 238 + persone lavorano sulla stessa patch. Da notare che questa persona deve 239 + avere anche una riga "Signed-off-by:" nella patch. 240 + 241 + - Acked-by: indica il consenso di un altro sviluppatore (spesso il manutentore 242 + del codice in oggetto) all'integrazione della patch nel kernel. 243 + 244 + - Tested-by: menziona la persona che ha verificato la patch e l'ha trovata 245 + funzionante. 246 + 247 + - Reviwed-by: menziona lo sviluppatore che ha revisionato la patch; per 248 + maggiori dettagli leggete la dichiarazione dei revisori in 249 + :ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>` 250 + 251 + - Reported-by: menziona l'utente che ha riportato il problema corretto da 252 + questa patch; quest'etichetta viene usata per dare credito alle persone 253 + che hanno verificato il codice e ci hanno fatto sapere quando le cose non 254 + funzionavano correttamente. 255 + 256 + - Cc: la persona menzionata ha ricevuto una copia della patch ed ha avuto 257 + l'opportunità di commentarla. 258 + 259 + State attenti ad aggiungere queste etichette alla vostra patch: solo 260 + "Cc:" può essere aggiunta senza il permesso esplicito della persona menzionata. 261 + 262 + Inviare la modifica 263 + ------------------- 264 + 265 + Prima di inviare la vostra patch, ci sarebbero ancora un paio di cose di cui 266 + dovreste aver cura: 267 + 268 + - Siete sicuri che il vostro programma di posta non corromperà le patch? 269 + Le patch che hanno spazi bianchi in libertà o andate a capo aggiunti 270 + dai programmi di posta non funzioneranno per chi le riceve, e spesso 271 + non verranno nemmeno esaminate in dettaglio. Se avete un qualsiasi dubbio, 272 + inviate la patch a voi stessi e verificate che sia integra. 273 + 274 + :ref:`Documentation/translations/it_IT/process/email-clients.rst <it_email_clients>` 275 + contiene alcuni suggerimenti utili sulla configurazione dei programmi 276 + di posta al fine di inviare patch. 277 + 278 + - Siete sicuri che la vostra patch non contenga sciocchi errori? Dovreste 279 + sempre processare le patch con scripts/checkpatch.pl e correggere eventuali 280 + problemi riportati. Per favore tenete ben presente che checkpatch.pl non è 281 + più intelligente di voi, nonostante sia il risultato di un certa quantità di 282 + ragionamenti su come debba essere una patch per il kernel. Se seguire 283 + i suggerimenti di checkpatch.pl rende il codice peggiore, allora non fatelo. 284 + 285 + Le patch dovrebbero essere sempre inviate come testo puro. Per favore non 286 + inviatele come allegati; questo rende molto più difficile, per i revisori, 287 + citare parti della patch che si vogliono commentare. Invece, mettete la vostra 288 + patch direttamente nel messaggio. 289 + 290 + Quando inviate le patch, è importante inviarne una copia a tutte le persone che 291 + potrebbero esserne interessate. Al contrario di altri progetti, il kernel 292 + incoraggia le persone a peccare nell'invio di tante copie; non presumente che 293 + le persone interessate vedano i vostri messaggi sulla lista di discussione. 294 + In particolare le copie dovrebbero essere inviate a: 295 + 296 + - I manutentori dei sottosistemi affetti della modifica. Come descritto 297 + in precedenza, il file MAINTAINERS è il primo luogo dove cercare i nomi 298 + di queste persone. 299 + 300 + - Altri sviluppatori che hanno lavorato nello stesso ambiente - specialmente 301 + quelli che potrebbero lavorarci proprio ora. Usate git potrebbe essere 302 + utile per vedere chi altri ha modificato i file su cui state lavorando. 303 + 304 + - Se state rispondendo a un rapporto su un baco, o a una richiesta di 305 + funzionalità, includete anche gli autori di quei rapporti/richieste. 306 + 307 + - Inviate una copia alle liste di discussione interessate, o, se nient'altro 308 + è adatto, alla lista linux-kernel 309 + 310 + - Se state correggendo un baco, pensate se la patch dovrebbe essere inclusa 311 + nel prossimo rilascio stabile. Se è così, la lista di discussione 312 + stable@vger.kernel.org dovrebbe riceverne una copia. Aggiungete anche 313 + l'etichetta "Cc: stable@vger.kernel.org" nella patch stessa; questo 314 + permetterà alla squadra *stable* di ricevere una notifica quando questa 315 + correzione viene integrata nel ramo principale. 316 + 317 + Quando scegliete i destinatari della patch, è bene avere un'idea di chi 318 + pensiate che sia colui che, eventualmente, accetterà la vostra patch e 319 + la integrerà. Nonostante sia possibile inviare patch direttamente a 320 + Linus Torvalds, e lasciare che sia lui ad integrarle,solitamente non è la 321 + strada migliore da seguire. Linus è occupato, e ci sono dei manutentori di 322 + sotto-sistema che controllano una parte specifica del kernel. Solitamente, 323 + vorreste che siano questi manutentori ad integrare le vostre patch. Se non 324 + c'è un chiaro manutentore, l'ultima spiaggia è spesso Andrew Morton. 325 + 326 + Le patch devono avere anche un buon oggetto. Il tipico formato per l'oggetto 327 + di una patch assomiglia a questo: 328 + 329 + :: 330 + 331 + [PATCH nn/mm] subsys: one-line description of the patch 332 + 333 + dove "nn" è il numero ordinale della patch, "mm" è il numero totale delle patch 334 + nella serie, e "subsys" è il nome del sottosistema interessato. Chiaramente, 335 + nn/mm può essere omesso per una serie composta da una singola patch. 336 + 337 + Se avete una significative serie di patch, è prassi inviare una descrizione 338 + introduttiva come parte zero. Tuttavia questa convenzione non è universalmente 339 + seguita; se la usate, ricordate che le informazioni nell'introduzione non 340 + faranno parte del changelog del kernel. Quindi per favore, assicuratevi che 341 + ogni patch abbia un changelog completo. 342 + 343 + In generale, la seconda parte e quelle successive di una patch "composta" 344 + dovrebbero essere inviate come risposta alla prima, cosicché vengano viste 345 + come un unico *thread*. Strumenti come git e quilt hanno comandi per inviare 346 + gruppi di patch con la struttura appropriata. Se avete una serie lunga 347 + e state usando git, per favore state alla larga dall'opzione --chain-reply-to 348 + per evitare di creare un annidamento eccessivo.
+232 -2
Documentation/translations/it_IT/process/6.Followthrough.rst
··· 1 1 .. include:: ../disclaimer-ita.rst 2 2 3 3 :Original: :ref:`Documentation/process/6.Followthrough.rst <development_followthrough>` 4 + :Translator: Alessia Mantegazza <amantegazza@vaga.pv.it> 4 5 6 + .. _it_development_followthrough: 7 + 8 + ============= 5 9 Completamento 6 10 ============= 7 11 8 - .. warning:: 12 + A questo punto, avete seguito le linee guida fino a questo punto e, con 13 + l'aggiunta delle vostre capacità ingegneristiche, avete pubblicato una serie 14 + perfetta di patch. Uno dei più grandi errori che possono essere commessi 15 + persino da sviluppatori kernel esperti è quello di concludere che il 16 + lavoro sia ormai finito. In verità, la pubblicazione delle patch 17 + simboleggia una transizione alla fase successiva del processo, con, 18 + probabilmente, ancora un po' di lavoro da fare. 9 19 10 - TODO ancora da tradurre 20 + È raro che una modifica sia così bella alla sua prima pubblicazione che non 21 + ci sia alcuno spazio di miglioramento. Il programma di sviluppo del kernel 22 + riconosce questo fatto e quindi, è fortemente orientato al miglioramento 23 + del codice pubblicato. Voi, in qualità di autori del codice, dovrete 24 + lavorare con la comunità del kernel per assicurare che il vostro codice 25 + mantenga gli standard qualitativi richiesti. Un fallimento in questo 26 + processo è quasi come impedire l'inclusione delle vostre patch nel 27 + ramo principale. 28 + 29 + Lavorare con i revisori 30 + ======================= 31 + 32 + Una patch che abbia una certa rilevanza avrà ricevuto numerosi commenti 33 + da parte di altri sviluppatori dato che avranno revisionato il codice. 34 + Lavorare con i revisori può rivelarsi, per molti sviluppatori, la parte 35 + più intimidatoria del processo di sviluppo del kernel. La vita può esservi 36 + resa molto più facile se tenete presente alcuni dettagli: 37 + 38 + - Se avete descritto la vostra modifica correttamente, i revisori ne 39 + comprenderanno il valore e il perché vi siete presi il disturbo di 40 + scriverla. Ma tale valore non li tratterrà dal porvi una domanda 41 + fondamentale: come verrà mantenuto questo codice nel kernel nei prossimi 42 + cinque o dieci anni? Molti dei cambiamenti che potrebbero esservi 43 + richiesti - da piccoli problemi di stile a sostanziali ristesure - 44 + vengono dalla consapevolezza che Linux resterà in circolazione e in 45 + continuo sviluppo ancora per diverse decadi. 46 + 47 + - La revisione del codice è un duro lavoro, ed è un mestiere poco 48 + riconosciuto; le persone ricordano chi ha scritto il codice, ma meno 49 + fama è attribuita a chi lo ha revisionato. Quindi i revisori potrebbero 50 + divenire burberi, specialmente quando vendono i medesimi errori venire 51 + fatti ancora e ancora. Se ricevete una revisione che vi sembra abbia 52 + un tono arrabbiato, insultante o addirittura offensivo, resistente alla 53 + tentazione di rispondere a tono. La revisione riguarda il codice e non 54 + la persona, e i revisori non vi stanno attaccando personalmente. 55 + 56 + - Similarmente, i revisori del codice non stanno cercando di promuovere 57 + i loro interessi a vostre spese. Gli sviluppatori del kernel spesso si 58 + aspettano di lavorare sul kernel per anni, ma sanno che il loro datore 59 + di lavoro può cambiare. Davvero, senza praticamente eccezioni, loro 60 + stanno lavorando per la creazione del miglior kernel possibile; non 61 + stanno cercando di creare un disagio ad aziende concorrenti. 62 + 63 + Quello che si sta cercando di dire è che, quando i revisori vi inviano degli 64 + appunti dovete fare attenzione alle osservazioni tecniche che vi stanno 65 + facendo. Non lasciate che il loro modo di esprimersi o il vostro orgoglio 66 + impediscano che ciò accada. Quando avete dei suggerimenti sulla revisione, 67 + prendetevi il tempo per comprendere cosa il revisore stia cercando di 68 + comunicarvi. Se possibile, sistemate le cose che il revisore vi chiede di 69 + modificare. E rispondete al revisore ringraziandolo e spiegando come 70 + intendete fare. 71 + 72 + Notate che non dovete per forza essere d'accordo con ogni singola modifica 73 + suggerita dai revisori. Se credete che il revisore non abbia compreso 74 + il vostro codice, spiegateglielo. Se avete un'obiezione tecnica da fargli 75 + su di una modifica suggerita, spiegatela inserendo anche la vostra soluzione 76 + al problema. Se la vostra spiegazione ha senso, il revisore la accetterà. 77 + Tuttavia, la vostra motivazione potrebbe non essere del tutto persuasiva, 78 + specialmente se altri iniziano ad essere d'accordo con il revisore. 79 + Prendetevi quindi un po' di tempo per pensare ancora alla cosa. Può risultare 80 + facile essere accecati dalla propria soluzione al punto che non realizzate che 81 + c'è qualcosa di fondamentalmente sbagliato o, magari, non state nemmeno 82 + risolvendo il problema giusto. 83 + 84 + Andrew Morton suggerisce che ogni suggerimento di revisione che non è 85 + presente nella modifica del codice dovrebbe essere inserito in un commento 86 + aggiuntivo; ciò può essere d'aiuto ai futuri revisori nell'evitare domande 87 + che sorgono al primo sguardo. 88 + 89 + Un errore fatale è quello di ignorare i commenti di revisione nella speranza 90 + che se ne andranno. Non andranno via. Se pubblicherete nuovamente il 91 + codice senza aver risposto ai commenti ricevuti, probabilmente le vostre 92 + modifiche non andranno da nessuna parte. 93 + 94 + Parlando di ripubblicazione del codice: per favore tenete a mente che i 95 + revisori non ricorderanno tutti i dettagli del codice che avete pubblicato 96 + l'ultima volta. Quindi è sempre una buona idea quella di ricordare ai 97 + revisori le questioni sollevate precedetemene e come le avete risolte. 98 + I revisori non dovrebbero star lì a cercare all'interno degli archivi per 99 + famigliarizzare con ciò che è stato detto l'ultima volta; se li aiutate 100 + in questo senso, saranno di umore migliore quando riguarderanno il vostro 101 + codice. 102 + 103 + Se invece avete cercato di far tutto correttamente ma le cose continuano 104 + a non andar bene? Molti disaccordi di natura tecnica possono essere risolti 105 + attraverso la discussione, ma ci sono volte dove qualcuno deve prendere 106 + una decisione. Se credete veramente che tale decisione andrà contro di voi 107 + ingiustamente, potete sempre tentare di rivolgervi a qualcuno più 108 + in alto di voi. Per cose di questo genere la persona con più potere è 109 + Andrew Morton. Andrew è una figura molto rispettata all'interno della 110 + comunità di sviluppo del kernel; lui può spesso sbrogliare situazioni che 111 + sembrano irrimediabilmente bloccate. Rivolgersi ad Andrew non deve essere 112 + fatto alla leggera, e non deve essere fatto prima di aver esplorato tutte 113 + le altre alternative. E tenete a mente, ovviamente, che nemmeno lui 114 + potrebbe non essere d'accordo con voi. 115 + 116 + Cosa accade poi 117 + =============== 118 + 119 + Se la modifica è ritenuta un elemento valido da essere aggiunta al kernel, 120 + e una volta che la maggior parte degli appunti dei revisori sono stati 121 + sistemati, il passo successivo solitamente è quello di entrare in un 122 + sottosistema gestito da un manutentore. Come ciò avviene dipende dal 123 + sottosistema medesimo; ogni manutentore ha il proprio modo di fare le cose. 124 + In particolare, ci potrebbero essere diversi sorgenti - uno, magari, dedicato 125 + alle modifiche pianificate per la finestra di fusione successiva, e un altro 126 + per il lavoro di lungo periodo. 127 + 128 + Per le modifiche proposte in aree per le quali non esiste un sottosistema 129 + preciso (modifiche di gestione della memoria, per esempio), i sorgenti di 130 + ripiego finiscono per essere -mm. Ed anche le modifiche che riguardano 131 + più sottosistemi possono finire in quest'ultimo. 132 + 133 + L'inclusione nei sorgenti di un sottosistema può comportare per una patch, 134 + un alto livello di visibilità. Ora altri sviluppatori che stanno lavorando 135 + in quei medesimi sorgenti avranno le vostre modifiche. I sottosistemi 136 + solitamente riforniscono anche Linux-next, rendendo i propri contenuti 137 + visibili all'intera comunità di sviluppo. A questo punto, ci sono buone 138 + possibilità per voi di ricevere ulteriori commenti da un nuovo gruppo di 139 + revisori; anche a questi commenti dovrete rispondere come avete già fatto per 140 + gli altri. 141 + 142 + Ciò che potrebbe accadere a questo punto, in base alla natura della vostra 143 + modifica, riguarda eventuali conflitti con il lavoro svolto da altri. 144 + Nella peggiore delle situazioni, i conflitti più pesanti tra modifiche possono 145 + concludersi con la messa a lato di alcuni dei lavori svolti cosicché le 146 + modifiche restanti possano funzionare ed essere integrate. Altre volte, la 147 + risoluzione dei conflitti richiederà del lavoro con altri sviluppatori e, 148 + possibilmente, lo spostamento di alcune patch da dei sorgenti a degli altri 149 + in modo da assicurare che tutto sia applicato in modo pulito. Questo lavoro 150 + può rivelarsi una spina nel fianco, ma consideratevi fortunati: prima 151 + dell'avvento dei sorgenti linux-next, questi conflitti spesso emergevano solo 152 + durante l'apertura della finestra di integrazione e dovevano essere smaltiti 153 + in fretta. Ora essi possono essere risolti comodamente, prima dell'apertura 154 + della finestra. 155 + 156 + Un giorno, se tutto va bene, vi collegherete e vedrete che la vostra patch 157 + è stata inserita nel ramo principale de kernel. Congratulazioni! Terminati 158 + i festeggiamenti (nel frattempo avrete inserito il vostro nome nel file 159 + MAINTAINERS) vale la pena ricordare una piccola cosa, ma importante: il 160 + lavoro non è ancora finito. L'inserimento nel ramo principale porta con se 161 + nuove sfide. 162 + 163 + Cominciamo con il dire che ora la visibilità della vostra modifica è 164 + ulteriormente cresciuta. Ci potrebbe portare ad una nuova fase di 165 + commenti dagli sviluppatori che non erano ancora a conoscenza della vostra 166 + patch. Ignorarli potrebbe essere allettante dato che non ci sono più 167 + dubbi sull'integrazione della modifica. Resistete a tale tentazione, dovete 168 + mantenervi disponibili agli sviluppatori che hanno domande o suggerimenti 169 + per voi. 170 + 171 + Ancora più importante: l'inclusione nel ramo principale mette il vostro 172 + codice nelle mani di un gruppo di *tester* molto più esteso. Anche se avete 173 + contribuito ad un driver per un hardware che non è ancora disponibile, sarete 174 + sorpresi da quante persone inseriranno il vostro codice nei loro kernel. 175 + E, ovviamente, dove ci sono *tester*, ci saranno anche dei rapporti su 176 + eventuali bachi. 177 + 178 + La peggior specie di rapporti sono quelli che indicano delle regressioni. 179 + Se la vostra modifica causa una regressione, avrete un gran numero di 180 + occhi puntati su di voi; la regressione deve essere sistemata il prima 181 + possibile. Se non vorrete o non sarete capaci di sistemarla (e nessuno 182 + lo farà per voi), la vostra modifica sarà quasi certamente rimossa durante 183 + la fase di stabilizzazione. Oltre alla perdita di tutto il lavoro svolto 184 + per far si che la vostra modifica fosse inserita nel ramo principale, 185 + l'avere una modifica rimossa a causa del fallimento nel sistemare una 186 + regressione, potrebbe rendere più difficile per voi far accettare 187 + il vostro lavoro in futuro. 188 + 189 + Dopo che ogni regressione è stata affrontata, ci potrebbero essere altri 190 + bachi ordinari da "sconfiggere". Il periodo di stabilizzazione è la 191 + vostra migliore opportunità per sistemare questi bachi e assicurarvi che 192 + il debutto del vostro codice nel ramo principale del kernel sia il più solido 193 + possibile. Quindi, per favore, rispondete ai rapporti sui bachi e ponete 194 + rimedio, se possibile, a tutti i problemi. È a questo che serve il periodo 195 + di stabilizzazione; potete iniziare creando nuove fantastiche modifiche 196 + una volta che ogni problema con le vecchie sia stato risolto. 197 + 198 + Non dimenticate che esistono altre pietre miliari che possono generare 199 + rapporti sui bachi: il successivo rilascio stabile, quando una distribuzione 200 + importante usa una versione del kernel nel quale è presente la vostra 201 + modifica, eccetera. Il continuare a rispondere a questi rapporti è fonte di 202 + orgoglio per il vostro lavoro. Se questa non è una sufficiente motivazione, 203 + allora, è anche consigliabile considera che la comunità di sviluppo ricorda 204 + gli sviluppatori che hanno perso interesse per il loro codice una volta 205 + integrato. La prossima volta che pubblicherete una patch, la comunità 206 + la valuterà anche sulla base del fatto che non sarete disponibili a 207 + prendervene cura anche nel futuro. 208 + 209 + 210 + Altre cose che posso accadere 211 + ============================= 212 + 213 + Un giorno, potreste aprire la vostra email e vedere che qualcuno vi ha 214 + inviato una patch per il vostro codice. Questo, dopo tutto, è uno dei 215 + vantaggi di avere il vostro codice "là fuori". Se siete d'accordo con 216 + la modifica, potrete anche inoltrarla ad un manutentore di sottosistema 217 + (assicuratevi di includere la riga "From:" cosicché l'attribuzione sia 218 + corretta, e aggiungete una vostra firma "Signed-off-by"), oppure inviate 219 + un "Acked-by:" e lasciate che l'autore originale la invii. 220 + 221 + Se non siete d'accordo con la patch, inviate una risposta educata 222 + spiegando il perché. Se possibile, dite all'autore quali cambiamenti 223 + servirebbero per rendere la patch accettabile da voi. C'è una certa 224 + riluttanza nell'inserire modifiche con un conflitto fra autore 225 + e manutentore del codice, ma solo fino ad un certo punto. Se siete visti 226 + come qualcuno che blocca un buon lavoro senza motivo, quelle patch vi 227 + passeranno oltre e andranno nel ramo principale in ogni caso. Nel kernel 228 + Linux, nessuno ha potere di veto assoluto su alcun codice. Eccezione 229 + fatta per Linus, forse. 230 + 231 + In rarissime occasioni, potreste vedere qualcosa di completamente diverso: 232 + un altro sviluppatore che pubblica una soluzione differente al vostro 233 + problema. A questo punto, c'è una buona probabilità che una delle due 234 + modifiche non verrà integrata, e il "c'ero prima io" non è considerato 235 + un argomento tecnico rilevante. Se la modifica di qualcun'altro rimpiazza 236 + la vostra ed entra nel ramo principale, esiste un unico modo di reagire: 237 + siate contenti che il vostro problema sia stato risolto e andate avanti con 238 + il vostro lavoro. L'avere un vostro lavoro spintonato da parte in questo 239 + modo può essere avvilente e scoraggiante, ma la comunità ricorderà come 240 + avrete reagito anche dopo che avrà dimenticato quale fu la modifica accettata.
+181 -3
Documentation/translations/it_IT/process/7.AdvancedTopics.rst
··· 1 1 .. include:: ../disclaimer-ita.rst 2 2 3 3 :Original: :ref:`Documentation/process/7.AdvancedTopics.rst <development_advancedtopics>` 4 - 4 + :Translator: Federico Vaga <federico.vaga@vaga.pv.it> 5 5 6 6 .. _it_development_advancedtopics: 7 7 8 8 Argomenti avanzati 9 9 ================== 10 10 11 - .. warning:: 11 + A questo punto, si spera, dovreste avere un'idea su come funziona il processo 12 + di sviluppo. Ma rimane comunque molto da imparare! Questo capitolo copre 13 + alcuni argomenti che potrebbero essere utili per gli sviluppatori che stanno 14 + per diventare parte integrante del processo di sviluppo del kernel. 12 15 13 - TODO ancora da tradurre 16 + Gestire le modifiche con git 17 + ----------------------------- 18 + 19 + L'uso di un sistema distribuito per il controllo delle versioni del kernel 20 + ebbe iniziò nel 2002 quando Linux iniziò a provare il programma proprietario 21 + BitKeeper. Nonostante l'uso di BitKeeper fosse opinabile, di certo il suo 22 + approccio alla gestione dei sorgenti non lo era. Un sistema distribuito per 23 + il controllo delle versioni accelerò immediatamente lo sviluppo del kernel. 24 + Oggigiorno, ci sono diverse alternative libere a BitKeeper. Per il meglio o il 25 + peggio, il progetto del kernel ha deciso di usare git per gestire i sorgenti. 26 + 27 + Gestire le modifiche con git può rendere la vita dello sviluppatore molto 28 + più facile, specialmente quando il volume delle modifiche cresce. 29 + Git ha anche i suoi lati taglienti che possono essere pericolosi; è uno 30 + strumento giovane e potente che è ancora in fase di civilizzazione da parte 31 + dei suoi sviluppatori. Questo documento non ha lo scopo di insegnare l'uso 32 + di git ai suoi lettori; ci sarebbe materiale a sufficienza per un lungo 33 + documento al riguardo. Invece, qui ci concentriamo in particolare su come 34 + git è parte del processo di sviluppo del kernel. Gli sviluppatori che 35 + desiderassero diventare agili con git troveranno più informazioni ai 36 + seguenti indirizzi: 37 + 38 + http://git-scm.com/ 39 + 40 + http://www.kernel.org/pub/software/scm/git/docs/user-manual.html 41 + 42 + e su varie guide che potrete trovare su internet. 43 + 44 + La prima cosa da fare prima di usarlo per produrre patch che saranno 45 + disponibili ad altri, è quella di leggere i siti qui sopra e di acquisire una 46 + base solida su come funziona git. Uno sviluppatore che sappia usare git 47 + dovrebbe essere capace di ottenere una copia del repositorio principale, 48 + esplorare la storia della revisione, registrare le modifiche, usare i rami, 49 + eccetera. Una certa comprensione degli strumenti git per riscrivere la storia 50 + (come ``rebase``) è altrettanto utile. Git ha i propri concetti e la propria 51 + terminologia; un nuovo utente dovrebbe conoscere *refs*, *remote branch*, 52 + *index*, *fast-forward merge*, *push* e *pull*, *detached head*, eccetera. 53 + Il tutto potrebbe essere un po' intimidatorio visto da fuori, ma con un po' 54 + di studio i concetti non saranno così difficili da capire. 55 + 56 + Utilizzare git per produrre patch da sottomettere via email può essere 57 + un buon esercizio da fare mentre si sta prendendo confidenza con lo strumento. 58 + 59 + Quando sarete in grado di creare rami git che siano guardabili da altri, 60 + vi servirà, ovviamente, un server dal quale sia possibile attingere le vostre 61 + modifiche. Se avete un server accessibile da Internet, configurarlo per 62 + eseguire git-daemon è relativamente semplice . Altrimenti, iniziano a 63 + svilupparsi piattaforme che offrono spazi pubblici, e gratuiti (Github, 64 + per esempio). Gli sviluppatori permanenti possono ottenere un account 65 + su kernel.org, ma non è proprio facile da ottenere; per maggiori informazioni 66 + consultate la pagina web http://kernel.org/faq/. 67 + 68 + In git è normale avere a che fare con tanti rami. Ogni linea di sviluppo 69 + può essere separata in "rami per argomenti" e gestiti indipendentemente. 70 + In git i rami sono facilissimi, per cui non c'è motivo per non usarli 71 + in libertà. In ogni caso, non dovreste sviluppare su alcun ramo dal 72 + quale altri potrebbero attingere. I rami disponibili pubblicamente dovrebbero 73 + essere creati con attenzione; integrate patch dai rami di sviluppo 74 + solo quando sono complete e pronte ad essere consegnate - non prima. 75 + 76 + Git offre alcuni strumenti che vi permettono di riscrivere la storia del 77 + vostro sviluppo. Una modifica errata (diciamo, una che rompe la bisezione, 78 + oppure che ha un qualche tipo di baco evidente) può essere corretta sul posto 79 + o fatta sparire completamente dalla storia. Una serie di patch può essere 80 + riscritta come se fosse stata scritta in cima al ramo principale di oggi, 81 + anche se ci avete lavorato per mesi. Le modifiche possono essere spostate 82 + in modo trasparente da un ramo ad un altro. E così via. Un uso giudizioso 83 + di git per revisionare la storia può aiutare nella creazione di una serie 84 + di patch pulite e con meno problemi. 85 + 86 + Un uso eccessivo può portare ad altri tipi di problemi, tuttavia, oltre 87 + alla semplice ossessione per la creazione di una storia del progetto che sia 88 + perfetta. Riscrivere la storia riscriverà le patch contenute in quella 89 + storia, trasformando un kernel verificato (si spera) in uno da verificare. 90 + Ma, oltre a questo, gli sviluppatori non possono collaborare se non condividono 91 + la stessa vista sulla storia del progetto; se riscrivete la storia dalla quale 92 + altri sviluppatori hanno attinto per i loro repositori, renderete la loro vita 93 + molto più difficile. Quindi tenete conto di questa semplice regola generale: 94 + la storia che avete esposto ad altri, generalmente, dovrebbe essere vista come 95 + immutabile. 96 + 97 + Dunque, una volta che il vostro insieme di patch è stato reso disponibile 98 + pubblicamente non dovrebbe essere più sovrascritto. Git tenterà di imporre 99 + questa regola, e si rifiuterà di pubblicare nuove patch che non risultino 100 + essere dirette discendenti di quelle pubblicate in precedenza (in altre parole, 101 + patch che non condividono la stessa storia). È possibile ignorare questo 102 + controllo, e ci saranno momenti in cui sarà davvero necessario riscrivere 103 + un ramo già pubblicato. Un esempio è linux-next dove le patch vengono 104 + spostate da un ramo all'altro al fine di evitare conflitti. Ma questo tipo 105 + d'azione dovrebbe essere un'eccezione. Questo è uno dei motivi per cui lo 106 + sviluppo dovrebbe avvenire in rami privati (che possono essere sovrascritti 107 + quando lo si ritiene necessario) e reso pubblico solo quando è in uno stato 108 + avanzato. 109 + 110 + Man mano che il ramo principale (o altri rami su cui avete basato le 111 + modifiche) avanza, diventa allettante l'idea di integrare tutte le patch 112 + per rimanere sempre aggiornati. Per un ramo privato, il *rebase* può essere 113 + un modo semplice per rimanere aggiornati, ma questa non è un'opzione nel 114 + momento in cui il vostro ramo è stato esposto al mondo intero. 115 + *Merge* occasionali possono essere considerati di buon senso, ma quando 116 + diventano troppo frequenti confondono inutilmente la storia. La tecnica 117 + suggerita in questi casi è quella di fare *merge* raramente, e più in generale 118 + solo nei momenti di rilascio (per esempio gli -rc del ramo principale). 119 + Se siete nervosi circa alcune patch in particolare, potete sempre fare 120 + dei *merge* di test in un ramo privato. In queste situazioni git "rerere" 121 + può essere utile; questo strumento si ricorda come i conflitti di *merge* 122 + furono risolti in passato cosicché non dovrete fare lo stesso lavoro due volte. 123 + 124 + Una delle lamentele più grosse e ricorrenti sull'uso di strumenti come git 125 + è il grande movimento di patch da un repositorio all'altro che rende 126 + facile l'integrazione nel ramo principale di modifiche mediocri, il tutto 127 + sotto il naso dei revisori. Gli sviluppatori del kernel tendono ad essere 128 + scontenti quando vedono succedere queste cose; preparare un ramo git con 129 + patch che non hanno ricevuto alcuna revisione o completamente avulse, potrebbe 130 + influire sulla vostra capacita di proporre, in futuro, l'integrazione dei 131 + vostri rami. Citando Linus 132 + 133 + :: 134 + 135 + Potete inviarmi le vostre patch, ma per far si che io integri una 136 + vostra modifica da git, devo sapere che voi sappiate cosa state 137 + facendo, e ho bisogno di fidarmi *senza* dover passare tutte 138 + le modifiche manualmente una per una. 139 + 140 + (http://lwn.net/Articles/224135/). 141 + 142 + Per evitare queste situazioni, assicuratevi che tutte le patch in un ramo 143 + siano strettamente correlate al tema delle modifiche; un ramo "driver fixes" 144 + non dovrebbe fare modifiche al codice principale per la gestione della memoria. 145 + E, più importante ancora, non usate un repositorio git per tentare di 146 + evitare il processo di revisione. Pubblicate un sommario di quello che il 147 + vostro ramo contiene sulle liste di discussione più opportune, e , quando 148 + sarà il momento, richiedete che il vostro ramo venga integrato in linux-next. 149 + 150 + Se e quando altri inizieranno ad inviarvi patch per essere incluse nel 151 + vostro repositorio, non dovete dimenticare di revisionarle. Inoltre 152 + assicuratevi di mantenerne le informazioni di paternità; al riguardo git "am" 153 + fa del suo meglio, ma potreste dover aggiungere una riga "From:" alla patch 154 + nel caso in cui sia arrivata per vie traverse. 155 + 156 + Quando richiedete l'integrazione, siate certi di fornire tutte le informazioni: 157 + dov'è il vostro repositorio, quale ramo integrare, e quali cambiamenti si 158 + otterranno dall'integrazione. Il comando git request-pull può essere d'aiuto; 159 + preparerà una richiesta nel modo in cui gli altri sviluppatori se l'aspettano, 160 + e verificherà che vi siate ricordati di pubblicare quelle patch su un 161 + server pubblico. 162 + 163 + Revisionare le patch 164 + -------------------- 165 + 166 + Alcuni lettori potrebbero avere obiezioni sulla presenza di questa sezione 167 + negli "argomenti avanzati" sulla base che anche gli sviluppatori principianti 168 + dovrebbero revisionare le patch. É certamente vero che non c'è modo 169 + migliore di imparare come programmare per il kernel che guardare il codice 170 + pubblicato dagli altri. In aggiunta, i revisori sono sempre troppo pochi; 171 + guardando il codice potete apportare un significativo contributo all'intero 172 + processo. 173 + 174 + Revisionare il codice potrebbe risultare intimidatorio, specialmente per i 175 + nuovi arrivati che potrebbero sentirsi un po' nervosi nel questionare 176 + il codice - in pubblico - pubblicato da sviluppatori più esperti. Perfino 177 + il codice scritto dagli sviluppatori più esperti può essere migliorato. 178 + Forse il suggerimento migliore per i revisori (tutti) è questo: formulate 179 + i commenti come domande e non come critiche. Chiedere "Come viene rilasciato 180 + il *lock* in questo percorso?" funziona sempre molto meglio che 181 + "qui la sincronizzazione è sbagliata". 182 + 183 + Diversi sviluppatori revisioneranno il codice con diversi punti di vista. 184 + Alcuni potrebbero concentrarsi principalmente sullo stile del codice e se 185 + alcune linee hanno degli spazio bianchi di troppo. Altri si chiederanno 186 + se accettare una modifica interamente è una cosa positiva per il kernel 187 + o no. E altri ancora si focalizzeranno sui problemi di sincronizzazione, 188 + l'uso eccessivo di *stack*, problemi di sicurezza, duplicazione del codice 189 + in altri contesti, documentazione, effetti negativi sulle prestazioni, cambi 190 + all'ABI dello spazio utente, eccetera. Qualunque tipo di revisione è ben 191 + accetta e di valore, se porta ad avere un codice migliore nel kernel.
+75 -2
Documentation/translations/it_IT/process/8.Conclusion.rst
··· 1 1 .. include:: ../disclaimer-ita.rst 2 2 3 3 :Original: :ref:`Documentation/process/8.Conclusion.rst <development_conclusion>` 4 + :Translator: Alessia Mantegazza <amantegazza@vaga.pv.it> 4 5 5 6 .. _it_development_conclusion: 6 7 7 8 Per maggiori informazioni 8 9 ========================= 9 10 10 - .. warning:: 11 + Esistono numerose fonti di informazioni sullo sviluppo del kernel Linux 12 + e argomenti correlati. Primo tra questi sarà sempre la cartella Documentation 13 + che si trova nei sorgenti kernel. 11 14 12 - TODO ancora da tradurre 15 + Il file :ref:`process/howto.rst <it_process_howto>` è un punto di partenza 16 + importante; :ref:`process/submitting-patches.rst <it_submittingpatches>` e 17 + :ref:`process/submitting-drivers.rst <it_submittingdrivers>` sono 18 + anch'essi qualcosa che tutti gli sviluppatori del kernel dovrebbero leggere. 19 + Molte API interne al kernel sono documentate utilizzando il meccanismo 20 + kerneldoc; "make htmldocs" o "make pdfdocs" possono essere usati per generare 21 + quei documenti in HTML o PDF (sebbene le versioni di TeX di alcune 22 + distribuzioni hanno dei limiti interni e fallisce nel processare 23 + appropriatamente i documenti). 24 + 25 + Diversi siti web approfondiscono lo sviluppo del kernel ad ogni livello 26 + di dettaglio. Il vostro autore vorrebbe umilmente suggerirvi 27 + http://lwn.net/ come fonte; usando l'indice 'kernel' su LWN troverete 28 + molti argomenti specifici sul kernel: 29 + 30 + http://lwn.net/Kernel/Index/ 31 + 32 + Oltre a ciò, una risorsa valida per gli sviluppatori kernel è: 33 + 34 + http://kernelnewbies.org/ 35 + 36 + E, ovviamente, una fonte da non dimenticare è http://kernel.org/, il luogo 37 + definitivo per le informazioni sui rilasci del kernel. 38 + 39 + Ci sono numerosi libri sullo sviluppo del kernel: 40 + 41 + Linux Device Drivers, 3rd Edition (Jonathan Corbet, Alessandro 42 + Rubini, and Greg Kroah-Hartman). In linea all'indirizzo 43 + http://lwn.net/Kernel/LDD3/. 44 + 45 + Linux Kernel Development (Robert Love). 46 + 47 + Understanding the Linux Kernel (Daniel Bovet and Marco Cesati). 48 + 49 + Tutti questi libri soffrono di un errore comune: tendono a risultare in un 50 + certo senso obsoleti dal momento che si trovano in libreria da diverso 51 + tempo. Comunque contengono informazioni abbastanza buone. 52 + 53 + La documentazione per git la troverete su: 54 + 55 + http://www.kernel.org/pub/software/scm/git/docs/ 56 + 57 + http://www.kernel.org/pub/software/scm/git/docs/user-manual.html 58 + 59 + 60 + 61 + Conclusioni 62 + =========== 63 + 64 + Congratulazioni a chiunque ce l'abbia fatta a terminare questo documento di 65 + lungo-respiro. Si spera che abbia fornito un'utile comprensione d'insieme 66 + di come il kernel Linux viene sviluppato e di come potete partecipare a 67 + tale processo. 68 + 69 + Infine, quello che conta è partecipare. Qualsiasi progetto software 70 + open-source non è altro che la somma di quello che i suoi contributori 71 + mettono al suo interno. Il kernel Linux è cresciuto velocemente e bene 72 + perché ha ricevuto il supporto di un impressionante gruppo di sviluppatori, 73 + ognuno dei quali sta lavorando per renderlo migliore. Il kernel è un esempio 74 + importante di cosa può essere fatto quando migliaia di persone lavorano 75 + insieme verso un obiettivo comune. 76 + 77 + Il kernel può sempre beneficiare di una larga base di sviluppatori, tuttavia, 78 + c'è sempre molto lavoro da fare. Ma, cosa non meno importante, molti degli 79 + altri partecipanti all'ecosistema Linux possono trarre beneficio attraverso 80 + il contributo al kernel. Inserire codice nel ramo principale è la chiave 81 + per arrivare ad una qualità del codice più alta, bassa manutenzione e 82 + bassi prezzi di distribuzione, alti livelli d'influenza sulla direzione 83 + dello sviluppo del kernel, e molto altro. È una situazione nella quale 84 + tutti coloro che sono coinvolti vincono. Mollate il vostro editor e 85 + raggiungeteci; sarete più che benvenuti.
+633 -2
Documentation/translations/it_IT/process/adding-syscalls.rst
··· 1 1 .. include:: ../disclaimer-ita.rst 2 2 3 3 :Original: :ref:`Documentation/process/adding-syscalls.rst <addsyscalls>` 4 + :Translator: Federico Vaga <federico.vaga@vaga.pv.it> 4 5 5 6 .. _it_addsyscalls: 6 7 7 8 Aggiungere una nuova chiamata di sistema 8 9 ======================================== 9 10 10 - .. warning:: 11 + Questo documento descrive quello che è necessario sapere per aggiungere 12 + nuove chiamate di sistema al kernel Linux; questo è da considerarsi come 13 + un'aggiunta ai soliti consigli su come proporre nuove modifiche 14 + :ref:`Documentation/translations/it_IT/process/submitting-patches.rst <it_submittingpatches>`. 11 15 12 - TODO ancora da tradurre 16 + 17 + Alternative alle chiamate di sistema 18 + ------------------------------------ 19 + 20 + La prima considerazione da fare quando si aggiunge una nuova chiamata di 21 + sistema è quella di valutare le alternative. Nonostante le chiamate di sistema 22 + siano il punto di interazione fra spazio utente e kernel più tradizionale ed 23 + ovvio, esistono altre possibilità - scegliete quella che meglio si adatta alle 24 + vostra interfaccia. 25 + 26 + - Se le operazioni coinvolte possono rassomigliare a quelle di un filesystem, 27 + allora potrebbe avere molto più senso la creazione di un nuovo filesystem o 28 + dispositivo. Inoltre, questo rende più facile incapsulare la nuova 29 + funzionalità in un modulo kernel piuttosto che essere sviluppata nel cuore 30 + del kernel. 31 + 32 + - Se la nuova funzionalità prevede operazioni dove il kernel notifica 33 + lo spazio utente su un avvenimento, allora restituire un descrittore 34 + di file all'oggetto corrispondente permette allo spazio utente di 35 + utilizzare ``poll``/``select``/``epoll`` per ricevere quelle notifiche. 36 + - Tuttavia, le operazioni che non si sposano bene con operazioni tipo 37 + :manpage:`read(2)`/:manpage:`write(2)` dovrebbero essere implementate 38 + come chiamate :manpage:`ioctl(2)`, il che potrebbe portare ad un'API in 39 + un qualche modo opaca. 40 + 41 + - Se dovete esporre solo delle informazioni sul sistema, un nuovo nodo in 42 + sysfs (vedere ``Documentation/translations/it_IT/filesystems/sysfs.txt``) o 43 + in procfs potrebbe essere sufficiente. Tuttavia, l'accesso a questi 44 + meccanismi richiede che il filesystem sia montato, il che potrebbe non 45 + essere sempre vero (per esempio, in ambienti come namespace/sandbox/chroot). 46 + Evitate d'aggiungere nuove API in debugfs perché questo non viene 47 + considerata un'interfaccia di 'produzione' verso lo spazio utente. 48 + - Se l'operazione è specifica ad un particolare file o descrittore, allora 49 + potrebbe essere appropriata l'aggiunta di un comando :manpage:`fcntl(2)`. 50 + Tuttavia, :manpage:`fcntl(2)` è una chiamata di sistema multiplatrice che 51 + nasconde una notevole complessità, quindi è ottima solo quando la nuova 52 + funzione assomiglia a quelle già esistenti in :manpage:`fcntl(2)`, oppure 53 + la nuova funzionalità è veramente semplice (per esempio, leggere/scrivere 54 + un semplice flag associato ad un descrittore di file). 55 + - Se l'operazione è specifica ad un particolare processo, allora 56 + potrebbe essere appropriata l'aggiunta di un comando :manpage:`prctl(2)`. 57 + Come per :manpage:`fcntl(2)`, questa chiamata di sistema è un complesso 58 + multiplatore quindi è meglio usarlo per cose molto simili a quelle esistenti 59 + nel comando ``prctl`` oppure per leggere/scrivere un semplice flag relativo 60 + al processo. 61 + 62 + 63 + Progettare l'API: pianificare le estensioni 64 + ------------------------------------------- 65 + 66 + Una nuova chiamata di sistema diventerà parte dell'API del kernel, e 67 + dev'essere supportata per un periodo indefinito. Per questo, è davvero 68 + un'ottima idea quella di discutere apertamente l'interfaccia sulla lista 69 + di discussione del kernel, ed è altrettanto importante pianificarne eventuali 70 + estensioni future. 71 + 72 + (Nella tabella delle chiamate di sistema sono disseminati esempi dove questo 73 + non fu fatto, assieme ai corrispondenti aggiornamenti - 74 + ``eventfd``/``eventfd2``, ``dup2``/``dup3``, ``inotify_init``/``inotify_init1``, 75 + ``pipe``/``pipe2``, ``renameat``/``renameat2`` --quindi imparate dalla storia 76 + del kernel e pianificate le estensioni fin dall'inizio) 77 + 78 + Per semplici chiamate di sistema che accettano solo un paio di argomenti, 79 + il modo migliore di permettere l'estensibilità è quello di includere un 80 + argomento *flags* alla chiamata di sistema. Per assicurarsi che i programmi 81 + dello spazio utente possano usare in sicurezza *flags* con diverse versioni 82 + del kernel, verificate se *flags* contiene un qualsiasi valore sconosciuto, 83 + in qual caso rifiutate la chiamata di sistema (con ``EINVAL``):: 84 + 85 + if (flags & ~(THING_FLAG1 | THING_FLAG2 | THING_FLAG3)) 86 + return -EINVAL; 87 + 88 + (Se *flags* non viene ancora utilizzato, verificate che l'argomento sia zero) 89 + 90 + Per chiamate di sistema più sofisticate che coinvolgono un numero più grande di 91 + argomenti, il modo migliore è quello di incapsularne la maggior parte in una 92 + struttura dati che verrà passata per puntatore. Questa struttura potrà 93 + funzionare con future estensioni includendo un campo *size*:: 94 + 95 + struct xyzzy_params { 96 + u32 size; /* userspace sets p->size = sizeof(struct xyzzy_params) */ 97 + u32 param_1; 98 + u64 param_2; 99 + u64 param_3; 100 + }; 101 + 102 + Fintanto che un qualsiasi campo nuovo, diciamo ``param_4``, è progettato per 103 + offrire il comportamento precedente quando vale zero, allora questo permetterà 104 + di gestire un conflitto di versione in entrambe le direzioni: 105 + 106 + - un vecchio kernel può gestire l'accesso di una versione moderna di un 107 + programma in spazio utente verificando che la memoria oltre la dimensione 108 + della struttura dati attesa sia zero (in pratica verificare che 109 + ``param_4 == 0``). 110 + - un nuovo kernel può gestire l'accesso di una versione vecchia di un 111 + programma in spazio utente estendendo la struttura dati con zeri (in pratica 112 + ``param_4 = 0``). 113 + 114 + Vedere :manpage:`perf_event_open(2)` e la funzione ``perf_copy_attr()`` (in 115 + ``kernel/events/core.c``) per un esempio pratico di questo approccio. 116 + 117 + 118 + Progettare l'API: altre considerazioni 119 + -------------------------------------- 120 + 121 + Se la vostra nuova chiamata di sistema permette allo spazio utente di fare 122 + riferimento ad un oggetto del kernel, allora questa dovrebbe usare un 123 + descrittore di file per accesso all'oggetto - non inventatevi nuovi tipi di 124 + accesso da spazio utente quando il kernel ha già dei meccanismi e una semantica 125 + ben definita per utilizzare i descrittori di file. 126 + 127 + Se la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ritorna un nuovo 128 + descrittore di file, allora l'argomento *flags* dovrebbe includere un valore 129 + equivalente a ``O_CLOEXEC`` per i nuovi descrittori. Questo rende possibile, 130 + nello spazio utente, la chiusura della finestra temporale fra le chiamate a 131 + ``xyzzy()`` e ``fcntl(fd, F_SETFD, FD_CLOEXEC)``, dove un inaspettato 132 + ``fork()`` o ``execve()`` potrebbe trasferire il descrittore al programma 133 + eseguito (Comunque, resistete alla tentazione di riutilizzare il valore di 134 + ``O_CLOEXEC`` dato che è specifico dell'architettura e fa parte di una 135 + enumerazione di flag ``O_*`` che è abbastanza ricca). 136 + 137 + Se la vostra nuova chiamata di sistema ritorna un nuovo descrittore di file, 138 + dovreste considerare che significato avrà l'uso delle chiamate di sistema 139 + della famiglia di :manpage:`poll(2)`. Rendere un descrittore di file pronto 140 + per la lettura o la scrittura è il tipico modo del kernel per notificare lo 141 + spazio utente circa un evento associato all'oggetto del kernel. 142 + 143 + Se la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` ha un argomento 144 + che è il percorso ad un file:: 145 + 146 + int sys_xyzzy(const char __user *path, ..., unsigned int flags); 147 + 148 + dovreste anche considerare se non sia più appropriata una versione 149 + :manpage:`xyzzyat(2)`:: 150 + 151 + int sys_xyzzyat(int dfd, const char __user *path, ..., unsigned int flags); 152 + 153 + Questo permette più flessibilità su come lo spazio utente specificherà il file 154 + in questione; in particolare, permette allo spazio utente di richiedere la 155 + funzionalità su un descrittore di file già aperto utilizzando il *flag* 156 + ``AT_EMPTY_PATH``, in pratica otterremmo gratuitamente l'operazione 157 + :manpage:`fxyzzy(3)`:: 158 + 159 + - xyzzyat(AT_FDCWD, path, ..., 0) is equivalent to xyzzy(path,...) 160 + - xyzzyat(fd, "", ..., AT_EMPTY_PATH) is equivalent to fxyzzy(fd, ...) 161 + 162 + (Per maggiori dettagli sulla logica delle chiamate \*at(), leggete la pagina 163 + man :manpage:`openat(2)`; per un esempio di AT_EMPTY_PATH, leggere la pagina 164 + man :manpage:`fstatat(2)`). 165 + 166 + Se la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede un parametro 167 + per descrivere uno scostamento all'interno di un file, usate ``loff_t`` come 168 + tipo cosicché scostamenti a 64-bit potranno essere supportati anche su 169 + architetture a 32-bit. 170 + 171 + Se la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` prevede l'uso di 172 + funzioni riservate, allora dev'essere gestita da un opportuno bit di privilegio 173 + (verificato con una chiamata a ``capable()``), come descritto nella pagina man 174 + :manpage:`capabilities(7)`. Scegliete un bit di privilegio già esistente per 175 + gestire la funzionalità associata, ma evitate la combinazione di diverse 176 + funzionalità vagamente collegate dietro lo stesso bit, in quanto va contro il 177 + principio di *capabilities* di separare i poteri di root. In particolare, 178 + evitate di aggiungere nuovi usi al fin-troppo-generico privilegio 179 + ``CAP_SYS_ADMIN``. 180 + 181 + Se la vostra nuova chiamata di sistema :manpage:`xyzzy(2)` manipola altri 182 + processi oltre a quello chiamato, allora dovrebbe essere limitata (usando 183 + la chiamata ``ptrace_may_access()``) di modo che solo un processo chiamante 184 + con gli stessi permessi del processo in oggetto, o con i necessari privilegi, 185 + possa manipolarlo. 186 + 187 + Infine, state attenti che in alcune architetture non-x86 la vita delle chiamate 188 + di sistema con argomenti a 64-bit viene semplificata se questi argomenti 189 + ricadono in posizioni dispari (pratica, i parametri 1, 3, 5); questo permette 190 + l'uso di coppie contigue di registri a 32-bit. (Questo non conta se gli 191 + argomenti sono parte di una struttura dati che viene passata per puntatore). 192 + 193 + 194 + Proporre l'API 195 + -------------- 196 + 197 + Al fine di rendere le nuove chiamate di sistema di facile revisione, è meglio 198 + che dividiate le modifiche i pezzi separati. Questi dovrebbero includere 199 + almeno le seguenti voci in *commit* distinti (ognuno dei quali sarà descritto 200 + più avanti): 201 + 202 + - l'essenza dell'implementazione della chiamata di sistema, con i prototipi, 203 + i numeri generici, le modifiche al Kconfig e l'implementazione *stub* di 204 + ripiego. 205 + - preparare la nuova chiamata di sistema per un'architettura specifica, 206 + solitamente x86 (ovvero tutti: x86_64, x86_32 e x32). 207 + - un programma di auto-verifica da mettere in ``tools/testing/selftests/`` 208 + che mostri l'uso della chiamata di sistema. 209 + - una bozza di pagina man per la nuova chiamata di sistema. Può essere 210 + scritta nell'email di presentazione, oppure come modifica vera e propria 211 + al repositorio delle pagine man. 212 + 213 + Le proposte di nuove chiamate di sistema, come ogni altro modifica all'API del 214 + kernel, deve essere sottomessa alla lista di discussione 215 + linux-api@vger.kernel.org. 216 + 217 + 218 + Implementazione di chiamate di sistema generiche 219 + ------------------------------------------------ 220 + 221 + Il principale punto d'accesso alla vostra nuova chiamata di sistema 222 + :manpage:`xyzzy(2)` verrà chiamato ``sys_xyzzy()``; ma, piuttosto che in modo 223 + esplicito, lo aggiungerete tramite la macro ``SYSCALL_DEFINEn``. La 'n' 224 + indica il numero di argomenti della chiamata di sistema; la macro ha come 225 + argomento il nome della chiamata di sistema, seguito dalle coppie (tipo, nome) 226 + per definire i suoi parametri. L'uso di questa macro permette di avere 227 + i metadati della nuova chiamata di sistema disponibili anche per altri 228 + strumenti. 229 + 230 + Il nuovo punto d'accesso necessita anche del suo prototipo di funzione in 231 + ``include/linux/syscalls.h``, marcato come asmlinkage di modo da abbinargli 232 + il modo in cui quelle chiamate di sistema verranno invocate:: 233 + 234 + asmlinkage long sys_xyzzy(...); 235 + 236 + Alcune architetture (per esempio x86) hanno le loro specifiche tabelle di 237 + chiamate di sistema (syscall), ma molte altre architetture condividono una 238 + tabella comune di syscall. Aggiungete alla lista generica la vostra nuova 239 + chiamata di sistema aggiungendo un nuovo elemento alla lista in 240 + ``include/uapi/asm-generic/unistd.h``:: 241 + 242 + #define __NR_xyzzy 292 243 + __SYSCALL(__NR_xyzzy, sys_xyzzy) 244 + 245 + Aggiornate anche il contatore __NR_syscalls di modo che sia coerente con 246 + l'aggiunta della nuove chiamate di sistema; va notato che se più di una nuova 247 + chiamata di sistema viene aggiunga nella stessa finestra di sviluppo, il numero 248 + della vostra nuova syscall potrebbe essere aggiustato al fine di risolvere i 249 + conflitti. 250 + 251 + Il file ``kernel/sys_ni.c`` fornisce le implementazioni *stub* di ripiego che 252 + ritornano ``-ENOSYS``. Aggiungete la vostra nuova chiamata di sistema anche 253 + qui:: 254 + 255 + COND_SYSCALL(xyzzy); 256 + 257 + La vostra nuova funzionalità del kernel, e la chiamata di sistema che la 258 + controlla, dovrebbero essere opzionali. Quindi, aggiungete un'opzione 259 + ``CONFIG`` (solitamente in ``init/Kconfig``). Come al solito per le nuove 260 + opzioni ``CONFIG``: 261 + 262 + - Includete una descrizione della nuova funzionalità e della chiamata di 263 + sistema che la controlla. 264 + - Rendete l'opzione dipendente da EXPERT se dev'essere nascosta agli utenti 265 + normali. 266 + - Nel Makefile, rendere tutti i nuovi file sorgenti, che implementano la 267 + nuova funzionalità, dipendenti dall'opzione CONFIG (per esempio 268 + ``obj-$(CONFIG_XYZZY_SYSCALL) += xyzzy.o``). 269 + - Controllate due volte che sia possibile generare il kernel con la nuova 270 + opzione CONFIG disabilitata. 271 + 272 + Per riassumere, vi serve un *commit* che includa: 273 + 274 + - un'opzione ``CONFIG``per la nuova funzione, normalmente in ``init/Kconfig`` 275 + - ``SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso 276 + - il corrispondente prototipo in ``include/linux/syscalls.h`` 277 + - un elemento nella tabella generica in ``include/uapi/asm-generic/unistd.h`` 278 + - *stub* di ripiego in ``kernel/sys_ni.c`` 279 + 280 + 281 + Implementazione delle chiamate di sistema x86 282 + --------------------------------------------- 283 + 284 + Per collegare la vostra nuova chiamate di sistema alle piattaforme x86, 285 + dovete aggiornate la tabella principale di syscall. Assumendo che la vostra 286 + nuova chiamata di sistema non sia particolarmente speciale (vedere sotto), 287 + dovete aggiungere un elemento *common* (per x86_64 e x32) in 288 + arch/x86/entry/syscalls/syscall_64.tbl:: 289 + 290 + 333 common xyzzy sys_xyzzy 291 + 292 + e un elemento per *i386* ``arch/x86/entry/syscalls/syscall_32.tbl``:: 293 + 294 + 380 i386 xyzzy sys_xyzzy 295 + 296 + Ancora una volta, questi numeri potrebbero essere cambiati se generano 297 + conflitti durante la finestra di integrazione. 298 + 299 + 300 + Chiamate di sistema compatibili (generico) 301 + ------------------------------------------ 302 + 303 + Per molte chiamate di sistema, la stessa implementazione a 64-bit può essere 304 + invocata anche quando il programma in spazio utente è a 32-bit; anche se la 305 + chiamata di sistema include esplicitamente un puntatore, questo viene gestito 306 + in modo trasparente. 307 + 308 + Tuttavia, ci sono un paio di situazione dove diventa necessario avere un 309 + livello di gestione della compatibilità per risolvere le differenze di 310 + dimensioni fra 32-bit e 64-bit. 311 + 312 + Il primo caso è quando un kernel a 64-bit supporta anche programmi in spazio 313 + utente a 32-bit, perciò dovrà ispezionare aree della memoria (``__user``) che 314 + potrebbero contenere valori a 32-bit o a 64-bit. In particolar modo, questo 315 + è necessario quando un argomento di una chiamata di sistema è: 316 + 317 + - un puntatore ad un puntatore 318 + - un puntatore ad una struttura dati contenente a sua volta un puntatore 319 + ( ad esempio ``struct iovec __user *``) 320 + - un puntatore ad un tipo intero di dimensione variabile (``time_t``, 321 + ``off_t``, ``long``, ...) 322 + - un puntatore ad una struttura dati contenente un tipo intero di dimensione 323 + variabile. 324 + 325 + Il secondo caso che richiede un livello di gestione della compatibilità è 326 + quando uno degli argomenti di una chiamata a sistema è esplicitamente un tipo 327 + a 64-bit anche su architetture a 32-bit, per esempio ``loff_t`` o ``__u64``. 328 + In questo caso, un valore che arriva ad un kernel a 64-bit da un'applicazione 329 + a 32-bit verrà diviso in due valori a 32-bit che dovranno essere riassemblati 330 + in questo livello di compatibilità. 331 + 332 + (Da notare che non serve questo livello di compatibilità per argomenti che 333 + sono puntatori ad un tipo esplicitamente a 64-bit; per esempio, in 334 + :manpage:`splice(2)` l'argomento di tipo ``loff_t __user *`` non necessita 335 + di una chiamata di sistema ``compat_``) 336 + 337 + La versione compatibile della nostra chiamata di sistema si chiamerà 338 + ``compat_sys_xyzzy()``, e viene aggiunta utilizzando la macro 339 + ``COMPAT_SYSCALL_DEFINEn()`` (simile a SYSCALL_DEFINEn). Questa versione 340 + dell'implementazione è parte del kernel a 64-bit ma accetta parametri a 32-bit 341 + che trasformerà secondo le necessità (tipicamente, la versione 342 + ``compat_sys_`` converte questi valori nello loro corrispondente a 64-bit e 343 + può chiamare la versione ``sys_`` oppure invocare una funzione che implementa 344 + le parti comuni). 345 + 346 + Il punto d'accesso *compat* deve avere il corrispondente prototipo di funzione 347 + in ``include/linux/compat.h``, marcato come asmlinkage di modo da abbinargli 348 + il modo in cui quelle chiamate di sistema verranno invocate:: 349 + 350 + asmlinkage long compat_sys_xyzzy(...); 351 + 352 + Se la chiamata di sistema prevede una struttura dati organizzata in modo 353 + diverso per sistemi a 32-bit e per quelli a 64-bit, diciamo 354 + ``struct xyzzy_args``, allora il file d'intestazione 355 + ``then the include/linux/compat.h`` deve includere la sua versione 356 + *compatibile* (``struct compat_xyzzy_args``); ogni variabile con 357 + dimensione variabile deve avere il proprio tipo ``compat_`` corrispondente 358 + a quello in ``struct xyzzy_args``. La funzione ``compat_sys_xyzzy()`` 359 + può usare la struttura ``compat_`` per analizzare gli argomenti ricevuti 360 + da una chiamata a 32-bit. 361 + 362 + Per esempio, se avete i seguenti campi:: 363 + 364 + struct xyzzy_args { 365 + const char __user *ptr; 366 + __kernel_long_t varying_val; 367 + u64 fixed_val; 368 + /* ... */ 369 + }; 370 + 371 + nella struttura ``struct xyzzy_args``, allora la struttura 372 + ``struct compat_xyzzy_args`` dovrebbe avere:: 373 + 374 + struct compat_xyzzy_args { 375 + compat_uptr_t ptr; 376 + compat_long_t varying_val; 377 + u64 fixed_val; 378 + /* ... */ 379 + }; 380 + 381 + La lista generica delle chiamate di sistema ha bisogno di essere 382 + aggiustata al fine di permettere l'uso della versione *compatibile*; 383 + la voce in ``include/uapi/asm-generic/unistd.h`` dovrebbero usare 384 + ``__SC_COMP`` piuttosto di ``__SYSCALL``:: 385 + 386 + #define __NR_xyzzy 292 387 + __SC_COMP(__NR_xyzzy, sys_xyzzy, compat_sys_xyzzy) 388 + 389 + Riassumendo, vi serve: 390 + 391 + - un ``COMPAT_SYSCALL_DEFINEn(xyzzy, ...)`` per il punto d'accesso 392 + *compatibile* 393 + - un prototipo in ``include/linux/compat.h`` 394 + - (se necessario) una struttura di compatibilità a 32-bit in 395 + ``include/linux/compat.h`` 396 + - una voce ``__SC_COMP``, e non ``__SYSCALL``, in 397 + ``include/uapi/asm-generic/unistd.h`` 398 + 399 + Compatibilità delle chiamate di sistema (x86) 400 + --------------------------------------------- 401 + 402 + Per collegare una chiamata di sistema, su un'architettura x86, con la sua 403 + versione *compatibile*, è necessario aggiustare la voce nella tabella 404 + delle syscall. 405 + 406 + Per prima cosa, la voce in ``arch/x86/entry/syscalls/syscall_32.tbl`` prende 407 + un argomento aggiuntivo per indicare che un programma in spazio utente 408 + a 32-bit, eseguito su un kernel a 64-bit, dovrebbe accedere tramite il punto 409 + d'accesso compatibile:: 410 + 411 + 380 i386 xyzzy sys_xyzzy __ia32_compat_sys_xyzzy 412 + 413 + Secondo, dovete capire cosa dovrebbe succedere alla nuova chiamata di sistema 414 + per la versione dell'ABI x32. Qui C'è una scelta da fare: gli argomenti 415 + possono corrisponde alla versione a 64-bit o a quella a 32-bit. 416 + 417 + Se c'è un puntatore ad un puntatore, la decisione è semplice: x32 è ILP32, 418 + quindi gli argomenti dovrebbero corrispondere a quelli a 32-bit, e la voce in 419 + ``arch/x86/entry/syscalls/syscall_64.tbl`` sarà divisa cosicché i programmi 420 + x32 eseguano la chiamata *compatibile*:: 421 + 422 + 333 64 xyzzy sys_xyzzy 423 + ... 424 + 555 x32 xyzzy __x32_compat_sys_xyzzy 425 + 426 + Se non ci sono puntatori, allora è preferibile riutilizzare la chiamata di 427 + sistema a 64-bit per l'ABI x32 (e di conseguenza la voce in 428 + arch/x86/entry/syscalls/syscall_64.tbl rimane immutata). 429 + 430 + In ambo i casi, dovreste verificare che i tipi usati dagli argomenti 431 + abbiano un'esatta corrispondenza da x32 (-mx32) al loro equivalente a 432 + 32-bit (-m32) o 64-bit (-m64). 433 + 434 + 435 + Chiamate di sistema che ritornano altrove 436 + ----------------------------------------- 437 + 438 + Nella maggior parte delle chiamate di sistema, al termine della loro 439 + esecuzione, i programmi in spazio utente riprendono esattamente dal punto 440 + in cui si erano interrotti -- quindi dall'istruzione successiva, con lo 441 + stesso *stack* e con la maggior parte del registri com'erano stati 442 + lasciati prima della chiamata di sistema, e anche con la stessa memoria 443 + virtuale. 444 + 445 + Tuttavia, alcune chiamata di sistema fanno le cose in modo differente. 446 + Potrebbero ritornare ad un punto diverso (``rt_sigreturn``) o cambiare 447 + la memoria in spazio utente (``fork``/``vfork``/``clone``) o perfino 448 + l'architettura del programma (``execve``/``execveat``). 449 + 450 + Per permettere tutto ciò, l'implementazione nel kernel di questo tipo di 451 + chiamate di sistema potrebbero dover salvare e ripristinare registri 452 + aggiuntivi nello *stack* del kernel, permettendo così un controllo completo 453 + su dove e come l'esecuzione dovrà continuare dopo l'esecuzione della 454 + chiamata di sistema. 455 + 456 + Queste saranno specifiche per ogni architettura, ma tipicamente si definiscono 457 + dei punti d'accesso in *assembly* per salvare/ripristinare i registri 458 + aggiuntivi e quindi chiamare il vero punto d'accesso per la chiamata di 459 + sistema. 460 + 461 + Per l'architettura x86_64, questo è implementato come un punto d'accesso 462 + ``stub_xyzzy`` in ``arch/x86/entry/entry_64.S``, e la voce nella tabella 463 + di syscall (``arch/x86/entry/syscalls/syscall_64.tbl``) verrà corretta di 464 + conseguenza:: 465 + 466 + 333 common xyzzy stub_xyzzy 467 + 468 + L'equivalente per programmi a 32-bit eseguiti su un kernel a 64-bit viene 469 + normalmente chiamato ``stub32_xyzzy`` e implementato in 470 + ``arch/x86/entry/entry_64_compat.S`` con la corrispondente voce nella tabella 471 + di syscall ``arch/x86/entry/syscalls/syscall_32.tbl`` corretta nel 472 + seguente modo:: 473 + 474 + 380 i386 xyzzy sys_xyzzy stub32_xyzzy 475 + 476 + Se una chiamata di sistema necessita di un livello di compatibilità (come 477 + nella sezione precedente), allora la versione ``stub32_`` deve invocare 478 + la versione ``compat_sys_`` piuttosto che quella nativa a 64-bit. In aggiunta, 479 + se l'implementazione dell'ABI x32 è diversa da quella x86_64, allora la sua 480 + voce nella tabella di syscall dovrà chiamare uno *stub* che invoca la versione 481 + ``compat_sys_``, 482 + 483 + Per completezza, sarebbe carino impostare una mappatura cosicché 484 + *user-mode* Linux (UML) continui a funzionare -- la sua tabella di syscall 485 + farà riferimento a stub_xyzzy, ma UML non include l'implementazione 486 + in ``arch/x86/entry/entry_64.S`` (perché UML simula i registri eccetera). 487 + Correggerlo è semplice, basta aggiungere una #define in 488 + ``arch/x86/um/sys_call_table_64.c``:: 489 + 490 + #define stub_xyzzy sys_xyzzy 491 + 492 + 493 + Altri dettagli 494 + -------------- 495 + 496 + La maggior parte dei kernel tratta le chiamate di sistema allo stesso modo, 497 + ma possono esserci rare eccezioni per le quali potrebbe essere necessario 498 + l'aggiornamento della vostra chiamata di sistema. 499 + 500 + Il sotto-sistema di controllo (*audit subsystem*) è uno di questi casi 501 + speciali; esso include (per architettura) funzioni che classificano alcuni 502 + tipi di chiamate di sistema -- in particolare apertura dei file 503 + (``open``/``openat``), esecuzione dei programmi (``execve``/``exeveat``) 504 + oppure multiplatori di socket (``socketcall``). Se la vostra nuova chiamata 505 + di sistema è simile ad una di queste, allora il sistema di controllo dovrebbe 506 + essere aggiornato. 507 + 508 + Più in generale, se esiste una chiamata di sistema che è simile alla vostra, 509 + vale la pena fare una ricerca con ``grep`` su tutto il kernel per la chiamata 510 + di sistema esistente per verificare che non ci siano altri casi speciali. 511 + 512 + 513 + Verifica 514 + -------- 515 + 516 + Una nuova chiamata di sistema dev'essere, ovviamente, provata; è utile fornire 517 + ai revisori un programma in spazio utente che mostri l'uso della chiamata di 518 + sistema. Un buon modo per combinare queste cose è quello di aggiungere un 519 + semplice programma di auto-verifica in una nuova cartella in 520 + ``tools/testing/selftests/``. 521 + 522 + Per una nuova chiamata di sistema, ovviamente, non ci sarà alcuna funzione 523 + in libc e quindi il programma di verifica dovrà invocarla usando ``syscall()``; 524 + inoltre, se la nuova chiamata di sistema prevede un nuova struttura dati 525 + visibile in spazio utente, il file d'intestazione necessario dev'essere 526 + installato al fine di compilare il programma. 527 + 528 + Assicuratevi che il programma di auto-verifica possa essere eseguito 529 + correttamente su tutte le architetture supportate. Per esempio, verificate che 530 + funzioni quando viene compilato per x86_64 (-m64), x86_32 (-m32) e x32 (-mx32). 531 + 532 + Al fine di una più meticolosa ed estesa verifica della nuova funzionalità, 533 + dovreste considerare l'aggiunta di nuove verifica al progetto 'Linux Test', 534 + oppure al progetto xfstests per cambiamenti relativi al filesystem. 535 + 536 + - https://linux-test-project.github.io/ 537 + - git://git.kernel.org/pub/scm/fs/xfs/xfstests-dev.git 538 + 539 + 540 + Pagine man 541 + ---------- 542 + 543 + Tutte le nuove chiamate di sistema dovrebbero avere una pagina man completa, 544 + idealmente usando i marcatori groff, ma anche il puro testo può andare. Se 545 + state usando groff, è utile che includiate nella email di presentazione una 546 + versione già convertita in formato ASCII: semplificherà la vita dei revisori. 547 + 548 + Le pagine man dovrebbero essere in copia-conoscenza verso 549 + linux-man@vger.kernel.org 550 + Per maggiori dettagli, leggere 551 + https://www.kernel.org/doc/man-pages/patches.html 552 + 553 + 554 + Non invocate chiamate di sistema dal kernel 555 + ------------------------------------------- 556 + 557 + Le chiamate di sistema sono, come già detto prima, punti di interazione fra 558 + lo spazio utente e il kernel. Perciò, le chiamate di sistema come 559 + ``sys_xyzzy()`` o ``compat_sys_xyzzy()`` dovrebbero essere chiamate solo dallo 560 + spazio utente attraverso la tabella syscall, ma non da nessun altro punto nel 561 + kernel. Se la nuova funzionalità è utile all'interno del kernel, per esempio 562 + dev'essere condivisa fra una vecchia e una nuova chiamata di sistema o 563 + dev'essere utilizzata da una chiamata di sistema e la sua variante compatibile, 564 + allora dev'essere implementata come una funzione di supporto 565 + (*helper function*) (per esempio ``kern_xyzzy()``). Questa funzione potrà 566 + essere chiamata dallo *stub* (``sys_xyzzy()``), dalla variante compatibile 567 + (``compat_sys_xyzzy()``), e/o da altri parti del kernel. 568 + 569 + Sui sistemi x86 a 64-bit, a partire dalla versione v4.17 è un requisito 570 + fondamentale quello di non invocare chiamate di sistema all'interno del kernel. 571 + Esso usa una diversa convenzione per l'invocazione di chiamate di sistema dove 572 + ``struct pt_regs`` viene decodificata al volo in una funzione che racchiude 573 + la chiamata di sistema la quale verrà eseguita successivamente. 574 + Questo significa che verranno passati solo i parametri che sono davvero 575 + necessari ad una specifica chiamata di sistema, invece che riempire ogni volta 576 + 6 registri del processore con contenuti presi dallo spazio utente (potrebbe 577 + causare seri problemi nella sequenza di chiamate). 578 + 579 + Inoltre, le regole su come i dati possano essere usati potrebbero differire 580 + fra il kernel e l'utente. Questo è un altro motivo per cui invocare 581 + ``sys_xyzzy()`` è generalmente una brutta idea. 582 + 583 + Eccezioni a questa regola vengono accettate solo per funzioni d'architetture 584 + che surclassano quelle generiche, per funzioni d'architettura di compatibilità, 585 + o per altro codice in arch/ 586 + 587 + 588 + Riferimenti e fonti 589 + ------------------- 590 + 591 + - Articolo di Michael Kerris su LWN sull'uso dell'argomento flags nelle 592 + chiamate di sistema: https://lwn.net/Articles/585415/ 593 + - Articolo di Michael Kerris su LWN su come gestire flag sconosciuti in 594 + una chiamata di sistema: https://lwn.net/Articles/588444/ 595 + - Articolo di Jake Edge su LWN che descrive i limiti degli argomenti a 64-bit 596 + delle chiamate di sistema: https://lwn.net/Articles/311630/ 597 + - Una coppia di articoli di David Drysdale che descrivono i dettagli del 598 + percorso implementativo di una chiamata di sistema per la versione v3.14: 599 + 600 + - https://lwn.net/Articles/604287/ 601 + - https://lwn.net/Articles/604515/ 602 + 603 + - Requisiti specifici alle architetture sono discussi nella pagina man 604 + :manpage:`syscall(2)` : 605 + http://man7.org/linux/man-pages/man2/syscall.2.html#NOTES 606 + - Collezione di email di Linux Torvalds sui problemi relativi a ``ioctl()``: 607 + http://yarchive.net/comp/linux/ioctl.html 608 + - "Come non inventare interfacce del kernel", Arnd Bergmann, 609 + http://www.ukuug.org/events/linux2007/2007/papers/Bergmann.pdf 610 + - Articolo di Michael Kerris su LWN sull'evitare nuovi usi di CAP_SYS_ADMIN: 611 + https://lwn.net/Articles/486306/ 612 + - Raccomandazioni da Andrew Morton circa il fatto che tutte le informazioni 613 + su una nuova chiamata di sistema dovrebbero essere contenute nello stesso 614 + filone di discussione di email: https://lkml.org/lkml/2014/7/24/641 615 + - Raccomandazioni da Michael Kerrisk circa il fatto che le nuove chiamate di 616 + sistema dovrebbero avere una pagina man: https://lkml.org/lkml/2014/6/13/309 617 + - Consigli da Thomas Gleixner sul fatto che il collegamento all'architettura 618 + x86 dovrebbe avvenire in un *commit* differente: 619 + https://lkml.org/lkml/2014/11/19/254 620 + - Consigli da Greg Kroah-Hartman circa la bontà d'avere una pagina man e un 621 + programma di auto-verifica per le nuove chiamate di sistema: 622 + https://lkml.org/lkml/2014/3/19/710 623 + - Discussione di Michael Kerrisk sulle nuove chiamate di sistema contro 624 + le estensioni :manpage:`prctl(2)`: https://lkml.org/lkml/2014/6/3/411 625 + - Consigli da Ingo Molnar che le chiamate di sistema con più argomenti 626 + dovrebbero incapsularli in una struttura che includa un argomento 627 + *size* per garantire l'estensibilità futura: 628 + https://lkml.org/lkml/2015/7/30/117 629 + - Un certo numero di casi strani emersi dall'uso (riuso) dei flag O_*: 630 + 631 + - commit 75069f2b5bfb ("vfs: renumber FMODE_NONOTIFY and add to uniqueness 632 + check") 633 + - commit 12ed2e36c98a ("fanotify: FMODE_NONOTIFY and __O_SYNC in sparc 634 + conflict") 635 + - commit bb458c644a59 ("Safer ABI for O_TMPFILE") 636 + 637 + - Discussion from Matthew Wilcox about restrictions on 64-bit arguments: 638 + https://lkml.org/lkml/2008/12/12/187 639 + - Raccomandazioni da Greg Kroah-Hartman sul fatto che i flag sconosciuti dovrebbero 640 + essere controllati: https://lkml.org/lkml/2014/7/17/577 641 + - Raccomandazioni da Linus Torvalds che le chiamate di sistema x32 dovrebbero 642 + favorire la compatibilità con le versioni a 64-bit piuttosto che quelle a 32-bit: 643 + https://lkml.org/lkml/2011/8/31/244