1edba5eecSFederico Vaga.. include:: ../disclaimer-ita.rst 2edba5eecSFederico Vaga 3edba5eecSFederico Vaga:Original: :ref:`Documentation/process/4.Coding.rst <development_coding>` 4fdf0345eSFederico Vaga:Translator: Alessia Mantegazza <amantegazza@vaga.pv.it> 5edba5eecSFederico Vaga 6edba5eecSFederico Vaga.. _it_development_coding: 7edba5eecSFederico Vaga 8edba5eecSFederico VagaScrivere codice corretto 9edba5eecSFederico Vaga======================== 10edba5eecSFederico Vaga 11fdf0345eSFederico VagaNonostante ci sia molto da dire sul processo di creazione, sulla sua solidità 12fdf0345eSFederico Vagae sul suo orientamento alla comunità, la prova di ogni progetto di sviluppo 13fdf0345eSFederico Vagadel kernel si trova nel codice stesso. È il codice che sarà esaminato dagli 14fdf0345eSFederico Vagaaltri sviluppatori ed inserito (o no) nel ramo principale. Quindi è la 15fdf0345eSFederico Vagaqualità di questo codice che determinerà il successo finale del progetto. 16edba5eecSFederico Vaga 17fdf0345eSFederico VagaQuesta sezione esaminerà il processo di codifica. Inizieremo con uno sguardo 18fdf0345eSFederico Vagasulle diverse casistiche nelle quali gli sviluppatori kernel possono 19fdf0345eSFederico Vagasbagliare. Poi, l'attenzione si sposterà verso "il fare le cose 20fdf0345eSFederico Vagacorrettamente" e sugli strumenti che possono essere utili in questa missione. 21fdf0345eSFederico Vaga 22fdf0345eSFederico VagaTrappole 23fdf0345eSFederico Vaga-------- 24fdf0345eSFederico Vaga 25fdf0345eSFederico VagaLo stile del codice 26fdf0345eSFederico Vaga******************* 27fdf0345eSFederico Vaga 28fdf0345eSFederico VagaIl kernel ha da tempo delle norme sullo stile di codifica che sono descritte in 29fdf0345eSFederico Vaga:ref:`Documentation/translations/it_IT/process/coding-style.rst <codingstyle>`. 30fdf0345eSFederico VagaPer la maggior parte del tempo, la politica descritta in quel file è stata 31fdf0345eSFederico Vagapraticamente informativa. Ne risulta che ci sia una quantità sostanziale di 32fdf0345eSFederico Vagacodice nel kernel che non rispetta le linee guida relative allo stile. 33fdf0345eSFederico VagaLa presenza di quel codice conduce a due distinti pericoli per gli 34fdf0345eSFederico Vagasviluppatori kernel. 35fdf0345eSFederico Vaga 36fdf0345eSFederico VagaIl primo di questi è credere che gli standard di codifica del kernel 37fdf0345eSFederico Vaganon sono importanti e possono non essere applicati. La verità è che 38fdf0345eSFederico Vagaaggiungere nuovo codice al kernel è davvero difficile se questo non 39fdf0345eSFederico Vagarispetta le norme; molti sviluppatori richiederanno che il codice sia 40fdf0345eSFederico Vagariformulato prima che anche solo lo revisionino. Una base di codice larga 41fdf0345eSFederico Vagaquanto il kernel richiede una certa uniformità, in modo da rendere possibile 42fdf0345eSFederico Vagaper gli sviluppatori una comprensione veloce di ogni sua parte. Non ci sono, 43fdf0345eSFederico Vagaquindi, più spazi per un codice formattato alla carlona. 44fdf0345eSFederico Vaga 45fdf0345eSFederico VagaOccasionalmente, lo stile di codifica del kernel andrà in conflitto con lo 46fdf0345eSFederico Vagastile richiesto da un datore di lavoro. In alcuni casi, lo stile del kernel 47fdf0345eSFederico Vagadovrà prevalere prima che il codice venga inserito. Mettere il codice 48fdf0345eSFederico Vagaall'interno del kernel significa rinunciare a un certo grado di controllo 49fdf0345eSFederico Vagain differenti modi - incluso il controllo sul come formattare il codice. 50fdf0345eSFederico Vaga 51fdf0345eSFederico VagaL’altra trappola è quella di pensare che il codice già presente nel kernel 52fdf0345eSFederico Vagaabbia urgentemente bisogno di essere sistemato. Gli sviluppatori potrebbero 53fdf0345eSFederico Vagainiziare a generare patch che correggono lo stile come modo per prendere 54fdf0345eSFederico Vagafamigliarità con il processo, o come modo per inserire i propri nomi nei 55fdf0345eSFederico Vagachangelog del kernel – o entrambe. La comunità di sviluppo vede un attività 56fdf0345eSFederico Vagadi codifica puramente correttiva come "rumore"; queste attività riceveranno 57fdf0345eSFederico Vagauna fredda accoglienza. Di conseguenza è meglio evitare questo tipo di patch. 58fdf0345eSFederico VagaMentre si lavora su un pezzo di codice è normale correggerne anche lo stile, 59fdf0345eSFederico Vagama le modifiche di stile non dovrebbero essere fatte fini a se stesse. 60fdf0345eSFederico Vaga 61fdf0345eSFederico VagaIl documento sullo stile del codice non dovrebbe essere letto come una legge 62fdf0345eSFederico Vagaassoluta che non può mai essere trasgredita. Se c’è un a buona ragione 63fdf0345eSFederico Vaga(per esempio, una linea che diviene poco leggibile se divisa per rientrare 64fdf0345eSFederico Vaganel limite di 80 colonne), fatelo e basta. 65fdf0345eSFederico Vaga 66fdf0345eSFederico VagaNotate che potete utilizzare lo strumento “clang-format” per aiutarvi con 67fdf0345eSFederico Vagale regole, per una riformattazione automatica e veloce del vostro codice 68fdf0345eSFederico Vagae per revisionare interi file per individuare errori nello stile di codifica, 69fdf0345eSFederico Vagarefusi e possibili miglioramenti. Inoltre è utile anche per classificare gli 70fdf0345eSFederico Vaga``#includes``, per allineare variabili/macro, per testi derivati ed altri 71fdf0345eSFederico Vagacompiti del genere. Consultate il file 72fdf0345eSFederico Vaga:ref:`Documentation/translations/it_IT/process/clang-format.rst <clangformat>` 73fdf0345eSFederico Vagaper maggiori dettagli 74fdf0345eSFederico Vaga 75fdf0345eSFederico Vaga 76fdf0345eSFederico VagaLivelli di astrazione 77fdf0345eSFederico Vaga********************* 78fdf0345eSFederico Vaga 79fdf0345eSFederico Vaga 80fdf0345eSFederico VagaI professori di Informatica insegnano ai propri studenti a fare ampio uso dei 81fdf0345eSFederico Vagalivelli di astrazione nel nome della flessibilità e del nascondere informazioni. 82fdf0345eSFederico VagaCerto il kernel fa un grande uso dell'astrazione; nessun progetto con milioni 83fdf0345eSFederico Vagadi righe di codice potrebbe fare altrimenti e sopravvivere. Ma l'esperienza 84fdf0345eSFederico Vagaha dimostrato che un'eccessiva o prematura astrazione può rivelarsi dannosa 85fdf0345eSFederico Vagaal pari di una prematura ottimizzazione. L'astrazione dovrebbe essere usata 86fdf0345eSFederico Vagafino al livello necessario e non oltre. 87fdf0345eSFederico Vaga 88fdf0345eSFederico VagaAd un livello base, considerate una funzione che ha un argomento che viene 89fdf0345eSFederico Vagasempre impostato a zero da tutti i chiamanti. Uno potrebbe mantenere 90fdf0345eSFederico Vagaquell'argomento nell'eventualità qualcuno volesse sfruttare la flessibilità 91fdf0345eSFederico Vagaofferta. In ogni caso, tuttavia, ci sono buone possibilità che il codice 92fdf0345eSFederico Vagache va ad implementare questo argomento aggiuntivo, sia stato rotto in maniera 93fdf0345eSFederico Vagasottile, in un modo che non è mai stato notato - perché non è mai stato usato. 94fdf0345eSFederico VagaOppure, quando sorge la necessità di avere più flessibilità, questo argomento 95fdf0345eSFederico Vaganon la fornisce in maniera soddisfacente. Gli sviluppatori di Kernel, 96fdf0345eSFederico Vagasottopongono costantemente patch che vanno a rimuovere gli argomenti 97fdf0345eSFederico Vagainutilizzate; anche se, in generale, non avrebbero dovuto essere aggiunti. 98fdf0345eSFederico Vaga 99fdf0345eSFederico VagaI livelli di astrazione che nascondono l'accesso all'hardware - 100fdf0345eSFederico Vagaspesso per poter usare dei driver su diversi sistemi operativi - vengono 101fdf0345eSFederico Vagaparticolarmente disapprovati. Tali livelli oscurano il codice e possono 102fdf0345eSFederico Vagapeggiorare le prestazioni; essi non appartengono al kernel Linux. 103fdf0345eSFederico Vaga 104fdf0345eSFederico VagaD'altro canto, se vi ritrovate a dover copiare una quantità significativa di 105fdf0345eSFederico Vagacodice proveniente da un altro sottosistema del kernel, è tempo di chiedersi 106fdf0345eSFederico Vagase, in effetti, non avrebbe più senso togliere parte di quel codice e metterlo 107fdf0345eSFederico Vagain una libreria separata o di implementare quella funzionalità ad un livello 108fdf0345eSFederico Vagapiù elevato. Non c'è utilità nel replicare lo stesso codice per tutto 109fdf0345eSFederico Vagail kernel. 110fdf0345eSFederico Vaga 111fdf0345eSFederico Vaga 112fdf0345eSFederico Vaga#ifdef e l'uso del preprocessore in generale 113fdf0345eSFederico Vaga******************************************** 114fdf0345eSFederico Vaga 115fdf0345eSFederico VagaIl preprocessore C sembra essere una fonte di attrazione per qualche 116fdf0345eSFederico Vagaprogrammatore C, che ci vede una via per ottenere una grande flessibilità 117fdf0345eSFederico Vagaall'interno di un file sorgente. Ma il preprocessore non è scritto in C, 118fdf0345eSFederico Vagae un suo massiccio impiego conduce a un codice che è molto più difficile 119fdf0345eSFederico Vagada leggere per gli altri e che rende più difficile il lavoro di verifica del 120fdf0345eSFederico Vagacompilatore. L'uso eccessivo del preprocessore è praticamente sempre il segno 121fdf0345eSFederico Vagadi un codice che necessita di un certo lavoro di pulizia. 122fdf0345eSFederico Vaga 123fdf0345eSFederico VagaLa compilazione condizionata con #ifdef è, in effetti, un potente strumento, 124fdf0345eSFederico Vagaed esso viene usato all'interno del kernel. Ma esiste un piccolo desiderio: 125fdf0345eSFederico Vagaquello di vedere il codice coperto solo da una leggera spolverata di 126fdf0345eSFederico Vagablocchi #ifdef. Come regola generale, quando possibile, l'uso di #ifdef 127fdf0345eSFederico Vagadovrebbe essere confinato nei file d'intestazione. Il codice compilato 128fdf0345eSFederico Vagacondizionatamente può essere confinato a funzioni tali che, nel caso in cui 129fdf0345eSFederico Vagail codice non deve essere presente, diventano vuote. Il compilatore poi 130fdf0345eSFederico Vagaottimizzerà la chiamata alla funzione vuota rimuovendola. Il risultato è 131fdf0345eSFederico Vagaun codice molto più pulito, più facile da seguire. 132fdf0345eSFederico Vaga 133fdf0345eSFederico VagaLe macro del preprocessore C presentano una serie di pericoli, inclusi 134fdf0345eSFederico Vagavalutazioni multiple di espressioni che hanno effetti collaterali e non 135fdf0345eSFederico Vagagarantiscono una sicurezza rispetto ai tipi. Se siete tentati dal definire 136fdf0345eSFederico Vagauna macro, considerate l'idea di creare invece una funzione inline. Il codice 137fdf0345eSFederico Vagache ne risulterà sarà lo stesso, ma le funzioni inline sono più leggibili, 138fdf0345eSFederico Vaganon considerano i propri argomenti più volte, e permettono al compilatore di 139fdf0345eSFederico Vagaeffettuare controlli sul tipo degli argomenti e del valore di ritorno. 140fdf0345eSFederico Vaga 141fdf0345eSFederico Vaga 142fdf0345eSFederico VagaFunzioni inline 143fdf0345eSFederico Vaga*************** 144fdf0345eSFederico Vaga 145fdf0345eSFederico VagaComunque, anche le funzioni inline hanno i loro pericoli. I programmatori 146fdf0345eSFederico Vagapotrebbero innamorarsi dell'efficienza percepita derivata dalla rimozione 147fdf0345eSFederico Vagadi una chiamata a funzione. Queste funzioni, tuttavia, possono ridurre le 148fdf0345eSFederico Vagaprestazioni. Dato che il loro codice viene replicato ovunque vi sia una 149fdf0345eSFederico Vagachiamata ad esse, si finisce per gonfiare le dimensioni del kernel compilato. 150fdf0345eSFederico VagaQuesti, a turno, creano pressione sulla memoria cache del processore, e questo 151fdf0345eSFederico Vagapuò causare rallentamenti importanti. Le funzioni inline, di norma, dovrebbero 152fdf0345eSFederico Vagaessere piccole e usate raramente. Il costo di una chiamata a funzione, dopo 153fdf0345eSFederico Vagatutto, non è così alto; la creazione di molte funzioni inline è il classico 154fdf0345eSFederico Vagaesempio di un'ottimizzazione prematura. 155fdf0345eSFederico Vaga 156fdf0345eSFederico VagaIn generale, i programmatori del kernel ignorano gli effetti della cache a 157fdf0345eSFederico Vagaloro rischio e pericolo. Il classico compromesso tempo/spazio teorizzato 158fdf0345eSFederico Vagaall'inizio delle lezioni sulle strutture dati spesso non si applica 159fdf0345eSFederico Vagaall'hardware moderno. Lo spazio *è* tempo, in questo senso un programma 160fdf0345eSFederico Vagapiù grande sarà più lento rispetto ad uno più compatto. 161fdf0345eSFederico Vaga 162fdf0345eSFederico VagaI compilatori più recenti hanno preso un ruolo attivo nel decidere se 163fdf0345eSFederico Vagauna data funzione deve essere resa inline oppure no. Quindi l'uso 164fdf0345eSFederico Vagaindiscriminato della parola chiave "inline" potrebbe non essere non solo 165fdf0345eSFederico Vagaeccessivo, ma anche irrilevante. 166fdf0345eSFederico Vaga 167fdf0345eSFederico VagaSincronizzazione 168fdf0345eSFederico Vaga**************** 169fdf0345eSFederico Vaga 170fdf0345eSFederico VagaNel maggio 2006, il sistema di rete "Devicescape" fu rilasciato in pompa magna 171fdf0345eSFederico Vagasotto la licenza GPL e reso disponibile per la sua inclusione nella ramo 172fdf0345eSFederico Vagaprincipale del kernel. Questa donazione fu una notizia bene accolta; 173fdf0345eSFederico Vagail supporto per le reti senza fili era considerata, nel migliore dei casi, 174fdf0345eSFederico Vagaal di sotto degli standard; il sistema Deviscape offrì la promessa di una 175fdf0345eSFederico Vagarisoluzione a tale situazione. Tuttavia, questo codice non fu inserito nel 176fdf0345eSFederico Vagaramo principale fino al giugno del 2007 (2.6.22). Cosa accadde? 177fdf0345eSFederico Vaga 178fdf0345eSFederico VagaQuel codice mostrava numerosi segnali di uno sviluppo in azienda avvenuto 179fdf0345eSFederico Vagaa porte chiuse. Ma in particolare, un grosso problema fu che non fu 180fdf0345eSFederico Vagaprogettato per girare in un sistema multiprocessore. Prima che questo 181fdf0345eSFederico Vagasistema di rete (ora chiamato mac80211) potesse essere inserito, fu necessario 182fdf0345eSFederico Vagaun lavoro sugli schemi di sincronizzazione. 183fdf0345eSFederico Vaga 184fdf0345eSFederico VagaUna volta, il codice del kernel Linux poteva essere sviluppato senza pensare 185fdf0345eSFederico Vagaai problemi di concorrenza presenti nei sistemi multiprocessore. Ora, 186fdf0345eSFederico Vagacomunque, questo documento è stato scritto su di un portatile dual-core. 187fdf0345eSFederico VagaPersino su sistemi a singolo processore, il lavoro svolto per incrementare 188fdf0345eSFederico Vagala capacità di risposta aumenterà il livello di concorrenza interno al kernel. 189fdf0345eSFederico VagaI giorni nei quali il codice poteva essere scritto senza pensare alla 190fdf0345eSFederico Vagasincronizzazione sono da passati tempo. 191fdf0345eSFederico Vaga 192fdf0345eSFederico VagaOgni risorsa (strutture dati, registri hardware, etc.) ai quali si potrebbe 193fdf0345eSFederico Vagaavere accesso simultaneo da più di un thread deve essere sincronizzato. Il 194fdf0345eSFederico Vaganuovo codice dovrebbe essere scritto avendo tale accortezza in testa; 195fdf0345eSFederico Vagariadattare la sincronizzazione a posteriori è un compito molto più difficile. 196fdf0345eSFederico VagaGli sviluppatori del kernel dovrebbero prendersi il tempo di comprendere bene 197fdf0345eSFederico Vagale primitive di sincronizzazione, in modo da sceglier lo strumento corretto 198fdf0345eSFederico Vagaper eseguire un compito. Il codice che presenta una mancanza di attenzione 199fdf0345eSFederico Vagaalla concorrenza avrà un percorso difficile all'interno del ramo principale. 200fdf0345eSFederico Vaga 201fdf0345eSFederico VagaRegressioni 202fdf0345eSFederico Vaga*********** 203fdf0345eSFederico Vaga 204fdf0345eSFederico VagaVale la pena menzionare un ultimo pericolo: potrebbe rivelarsi accattivante 205fdf0345eSFederico Vagal'idea di eseguire un cambiamento (che potrebbe portare a grandi 206fdf0345eSFederico Vagamiglioramenti) che porterà ad alcune rotture per gli utenti esistenti. 207fdf0345eSFederico VagaQuesta tipologia di cambiamento è chiamata "regressione", e le regressioni son 208fdf0345eSFederico Vagadiventate mal viste nel ramo principale del kernel. Con alcune eccezioni, 209fdf0345eSFederico Vagai cambiamenti che causano regressioni saranno fermati se quest'ultime non 210fdf0345eSFederico Vagapotranno essere corrette in tempo utile. È molto meglio quindi evitare 211fdf0345eSFederico Vagala regressione fin dall'inizio. 212fdf0345eSFederico Vaga 213fdf0345eSFederico VagaSpesso si è argomentato che una regressione può essere giustificata se essa 214fdf0345eSFederico Vagaporta risolve più problemi di quanti non ne crei. Perché, dunque, non fare 215fdf0345eSFederico Vagaun cambiamento se questo porta a nuove funzionalità a dieci sistemi per 216fdf0345eSFederico Vagaognuno dei quali esso determina una rottura? La migliore risposta a questa 217fdf0345eSFederico Vagadomanda ci è stata fornita da Linus nel luglio 2007: 218fdf0345eSFederico Vaga 219fdf0345eSFederico Vaga:: 220fdf0345eSFederico Vaga Dunque, noi non sistemiamo bachi introducendo nuovi problemi. Quella 221fdf0345eSFederico Vaga via nasconde insidie, e nessuno può sapere del tutto se state facendo 222fdf0345eSFederico Vaga dei progressi reali. Sono due passi avanti e uno indietro, oppure 223fdf0345eSFederico Vaga un passo avanti e due indietro? 224fdf0345eSFederico Vaga 225fdf0345eSFederico Vaga(http://lwn.net/Articles/243460/). 226fdf0345eSFederico Vaga 227fdf0345eSFederico VagaUna particolare tipologia di regressione mal vista consiste in una qualsiasi 228fdf0345eSFederico Vagasorta di modifica all'ABI dello spazio utente. Una volta che un'interfaccia 229fdf0345eSFederico Vagaviene esportata verso lo spazio utente, dev'essere supportata all'infinito. 230fdf0345eSFederico VagaQuesto fatto rende la creazione di interfacce per lo spazio utente 231fdf0345eSFederico Vagaparticolarmente complicato: dato che non possono venir cambiate introducendo 232fdf0345eSFederico Vagaincompatibilità, esse devono essere fatte bene al primo colpo. Per questa 233fdf0345eSFederico Vagaragione sono sempre richieste: ampie riflessioni, documentazione chiara e 234fdf0345eSFederico Vagaampie revisioni dell'interfaccia verso lo spazio utente. 235fdf0345eSFederico Vaga 236fdf0345eSFederico Vaga 237fdf0345eSFederico VagaStrumenti di verifica del codice 238fdf0345eSFederico Vaga-------------------------------- 239fdf0345eSFederico VagaAlmeno per ora la scrittura di codice priva di errori resta un ideale 240fdf0345eSFederico Vagairraggiungibile ai più. Quello che speriamo di poter fare, tuttavia, è 241fdf0345eSFederico Vagatrovare e correggere molti di questi errori prima che il codice entri nel 242fdf0345eSFederico Vagaramo principale del kernel. A tal scopo gli sviluppatori del kernel devono 243fdf0345eSFederico Vagamettere insieme una schiera impressionante di strumenti che possano 244fdf0345eSFederico Vagalocalizzare automaticamente un'ampia varietà di problemi. Qualsiasi problema 245fdf0345eSFederico Vagatrovato dal computer è un problema che non affliggerà l'utente in seguito, 246fdf0345eSFederico Vagane consegue che gli strumenti automatici dovrebbero essere impiegati ovunque 247fdf0345eSFederico Vagapossibile. 248fdf0345eSFederico Vaga 249fdf0345eSFederico VagaIl primo passo consiste semplicemente nel fare attenzione agli avvertimenti 250fdf0345eSFederico Vagaproveniente dal compilatore. Versioni moderne di gcc possono individuare 251fdf0345eSFederico Vaga(e segnalare) un gran numero di potenziali errori. Molto spesso, questi 252fdf0345eSFederico Vagaavvertimenti indicano problemi reali. Di regola, il codice inviato per la 253fdf0345eSFederico Vagarevisione non dovrebbe produrre nessun avvertimento da parte del compilatore. 254fdf0345eSFederico VagaPer mettere a tacere gli avvertimenti, cercate di comprenderne le cause reali 255fdf0345eSFederico Vagae cercate di evitare le "riparazioni" che fan sparire l'avvertimento senza 256fdf0345eSFederico Vagaperò averne trovato la causa. 257fdf0345eSFederico Vaga 258fdf0345eSFederico VagaTenete a mente che non tutti gli avvertimenti sono disabilitati di default. 259163ba35fSMasahiro YamadaCostruite il kernel con "make KCFLAGS=-W" per ottenerli tutti. 260fdf0345eSFederico Vaga 261fdf0345eSFederico VagaIl kernel fornisce differenti opzioni che abilitano funzionalità di debugging; 262fdf0345eSFederico Vagamolti di queste sono trovano all'interno del sotto menu "kernel hacking". 263fdf0345eSFederico VagaLa maggior parte di queste opzioni possono essere attivate per qualsiasi 264fdf0345eSFederico Vagakernel utilizzato per lo sviluppo o a scopo di test. In particolare dovreste 265fdf0345eSFederico Vagaattivare: 266fdf0345eSFederico Vaga 267*511aaf2bSFederico Vaga - FRAME_WARN per ottenere degli avvertimenti su stack frame più 268*511aaf2bSFederico Vaga grandi di un dato valore. Il risultato generato da questi 269*511aaf2bSFederico Vaga avvertimenti può risultare verboso, ma non bisogna preoccuparsi per 270*511aaf2bSFederico Vaga gli avvertimenti provenienti da altre parti del kernel. 271fdf0345eSFederico Vaga 272fdf0345eSFederico Vaga - DEBUG_OBJECTS aggiungerà un codice per tracciare il ciclo di vita di 273fdf0345eSFederico Vaga diversi oggetti creati dal kernel e avvisa quando qualcosa viene eseguito 274fdf0345eSFederico Vaga fuori controllo. Se state aggiungendo un sottosistema che crea (ed 275fdf0345eSFederico Vaga esporta) oggetti complessi propri, considerate l'aggiunta di un supporto 276fdf0345eSFederico Vaga al debugging dell'oggetto. 277fdf0345eSFederico Vaga 278fdf0345eSFederico Vaga - DEBUG_SLAB può trovare svariati errori di uso e di allocazione di memoria; 279fdf0345eSFederico Vaga esso dovrebbe esser usato dalla maggior parte dei kernel di sviluppo. 280fdf0345eSFederico Vaga 281fdf0345eSFederico Vaga - DEBUG_SPINLOCK, DEBUG_ATOMIC_SLEEP, e DEBUG_MUTEXES troveranno un certo 282fdf0345eSFederico Vaga numero di errori comuni di sincronizzazione. 283fdf0345eSFederico Vaga 284fdf0345eSFederico VagaEsistono ancora delle altre opzioni di debugging, di alcune di esse 285fdf0345eSFederico Vagadiscuteremo qui sotto. Alcune di esse hanno un forte impatto e non dovrebbero 286fdf0345eSFederico Vagaessere usate tutte le volte. Ma qualche volta il tempo speso nell'capire 287fdf0345eSFederico Vagale opzioni disponibili porterà ad un risparmio di tempo nel breve termine. 288fdf0345eSFederico Vaga 289fdf0345eSFederico VagaUno degli strumenti di debugging più tosti è il *locking checker*, o 290fdf0345eSFederico Vaga"lockdep". Questo strumento traccerà qualsiasi acquisizione e rilascio di 291fdf0345eSFederico Vagaogni *lock* (spinlock o mutex) nel sistema, l'ordine con il quale i *lock* 292fdf0345eSFederico Vagasono acquisiti in relazione l'uno con l'altro, l'ambiente corrente di 293fdf0345eSFederico Vagainterruzione, eccetera. Inoltre esso può assicurare che i *lock* vengano 294fdf0345eSFederico Vagaacquisiti sempre nello stesso ordine, che le stesse assunzioni sulle 295fdf0345eSFederico Vagainterruzioni si applichino in tutte le occasioni, e così via. In altre parole, 296fdf0345eSFederico Vagalockdep può scovare diversi scenari nei quali il sistema potrebbe, in rari 297fdf0345eSFederico Vagacasi, trovarsi in stallo. Questa tipologia di problema può essere grave 298fdf0345eSFederico Vaga(sia per gli sviluppatori che per gli utenti) in un sistema in uso; lockdep 299fdf0345eSFederico Vagapermette di trovare tali problemi automaticamente e in anticipo. 300fdf0345eSFederico Vaga 301fdf0345eSFederico VagaIn qualità di programmatore kernel diligente, senza dubbio, dovrete controllare 302fdf0345eSFederico Vagail valore di ritorno di ogni operazione (come l'allocazione della memoria) 303fdf0345eSFederico Vagapoiché esso potrebbe fallire. Il nocciolo della questione è che i percorsi 304fdf0345eSFederico Vagadi gestione degli errori, con grande probabilità, non sono mai stati 305fdf0345eSFederico Vagacollaudati del tutto. Il codice collaudato tende ad essere codice bacato; 306fdf0345eSFederico Vagapotrete quindi essere più a vostro agio con il vostro codice se tutti questi 307fdf0345eSFederico Vagapercorsi fossero stati verificati un po' di volte. 308fdf0345eSFederico Vaga 309fdf0345eSFederico VagaIl kernel fornisce un framework per l'inserimento di fallimenti che fa 310fdf0345eSFederico Vagaesattamente al caso, specialmente dove sono coinvolte allocazioni di memoria. 311fdf0345eSFederico VagaCon l'opzione per l'inserimento dei fallimenti abilitata, una certa percentuale 312fdf0345eSFederico Vagadi allocazione di memoria sarà destinata al fallimento; questi fallimenti 313fdf0345eSFederico Vagapossono essere ridotti ad uno specifico pezzo di codice. Procedere con 314fdf0345eSFederico Vagal'inserimento dei fallimenti attivo permette al programmatore di verificare 315fdf0345eSFederico Vagacome il codice risponde quando le cose vanno male. Consultate: 31610ffebbeSMauro Carvalho ChehabDocumentation/fault-injection/fault-injection.rst per avere maggiori 317fdf0345eSFederico Vagainformazioni su come utilizzare questo strumento. 318fdf0345eSFederico Vaga 319fdf0345eSFederico VagaAltre tipologie di errori possono essere riscontrati con lo strumento di 320fdf0345eSFederico Vagaanalisi statica "sparse". Con Sparse, il programmatore può essere avvisato 321fdf0345eSFederico Vagacirca la confusione tra gli indirizzi dello spazio utente e dello spazio 322fdf0345eSFederico Vagakernel, un miscuglio fra quantità big-endian e little-endian, il passaggio 323fdf0345eSFederico Vagadi un valore intero dove ci sia aspetta un gruppo di flag, e così via. 324fdf0345eSFederico VagaSparse deve essere installato separatamente (se il vostra distribuzione non 325fdf0345eSFederico Vagalo prevede, potete trovarlo su https://sparse.wiki.kernel.org/index.php/Main_Page); 326fdf0345eSFederico Vagapuò essere attivato sul codice aggiungendo "C=1" al comando make. 327fdf0345eSFederico Vaga 328fdf0345eSFederico VagaLo strumento "Coccinelle" (http://coccinelle.lip6.fr/) è in grado di trovare 329fdf0345eSFederico Vagauna vasta varietà di potenziali problemi di codifica; e può inoltre proporre 330fdf0345eSFederico Vagasoluzioni per risolverli. Un buon numero di "patch semantiche" per il kernel 331fdf0345eSFederico Vagasono state preparate nella cartella scripts/coccinelle; utilizzando 332fdf0345eSFederico Vaga"make coccicheck" esso percorrerà tali patch semantiche e farà rapporto su 333fdf0345eSFederico Vagaqualsiasi problema trovato. Per maggiori informazioni, consultate 334fdf0345eSFederico Vaga:ref:`Documentation/dev-tools/coccinelle.rst <devtools_coccinelle>`. 335fdf0345eSFederico Vaga 336fdf0345eSFederico VagaAltri errori di portabilità sono meglio scovati compilando il vostro codice 337fdf0345eSFederico Vagaper altre architetture. Se non vi accade di avere un sistema S/390 o una 338fdf0345eSFederico Vagascheda di sviluppo Blackfin sotto mano, potete comunque continuare la fase 339fdf0345eSFederico Vagadi compilazione. Un vasto numero di cross-compilatori per x86 possono 340fdf0345eSFederico Vagaessere trovati al sito: 341fdf0345eSFederico Vaga 342fdf0345eSFederico Vaga http://www.kernel.org/pub/tools/crosstool/ 343fdf0345eSFederico Vaga 344fdf0345eSFederico VagaIl tempo impiegato nell'installare e usare questi compilatori sarà d'aiuto 345fdf0345eSFederico Vaganell'evitare situazioni imbarazzanti nel futuro. 346fdf0345eSFederico Vaga 347fdf0345eSFederico Vaga 348fdf0345eSFederico VagaDocumentazione 349fdf0345eSFederico Vaga-------------- 350fdf0345eSFederico Vaga 351fdf0345eSFederico VagaLa documentazione è spesso stata più un'eccezione che una regola nello 352fdf0345eSFederico Vagasviluppo del kernel. Nonostante questo, un'adeguata documentazione aiuterà 353fdf0345eSFederico Vagaa facilitare l'inserimento di nuovo codice nel kernel, rende la vita più 354fdf0345eSFederico Vagafacile per gli altri sviluppatori e sarà utile per i vostri utenti. In molti 355fdf0345eSFederico Vagacasi, la documentazione è divenuta sostanzialmente obbligatoria. 356fdf0345eSFederico Vaga 357fdf0345eSFederico VagaLa prima parte di documentazione per qualsiasi patch è il suo changelog. 358fdf0345eSFederico VagaQuesti dovrebbero descrivere le problematiche risolte, la tipologia di 359fdf0345eSFederico Vagasoluzione, le persone che lavorano alla patch, ogni effetto rilevante 360fdf0345eSFederico Vagasulle prestazioni e tutto ciò che può servire per la comprensione della 361fdf0345eSFederico Vagapatch. Assicuratevi che il changelog dica *perché*, vale la pena aggiungere 362fdf0345eSFederico Vagala patch; un numero sorprendente di sviluppatori sbaglia nel fornire tale 363fdf0345eSFederico Vagainformazione. 364fdf0345eSFederico Vaga 365fdf0345eSFederico VagaQualsiasi codice che aggiunge una nuova interfaccia in spazio utente - inclusi 366fdf0345eSFederico Vaganuovi file in sysfs o /proc - dovrebbe includere la documentazione di tale 367fdf0345eSFederico Vagainterfaccia così da permette agli sviluppatori dello spazio utente di sapere 368fdf0345eSFederico Vagacon cosa stanno lavorando. Consultate: Documentation/ABI/README per avere una 369fdf0345eSFederico Vagadescrizione di come questi documenti devono essere impostati e quali 370fdf0345eSFederico Vagainformazioni devono essere fornite. 371fdf0345eSFederico Vaga 372fdf0345eSFederico VagaIl file :ref:`Documentation/translations/it_IT/admin-guide/kernel-parameters.rst <kernelparameters>` 373fdf0345eSFederico Vagadescrive tutti i parametri di avvio del kernel. Ogni patch che aggiunga 374fdf0345eSFederico Vaganuovi parametri dovrebbe aggiungere nuove voci a questo file. 375fdf0345eSFederico Vaga 376fdf0345eSFederico VagaOgni nuova configurazione deve essere accompagnata da un testo di supporto 377fdf0345eSFederico Vagache spieghi chiaramente le opzioni e spieghi quando l'utente potrebbe volerle 378fdf0345eSFederico Vagaselezionare. 379fdf0345eSFederico Vaga 380fdf0345eSFederico VagaPer molti sottosistemi le informazioni sull'API interna sono documentate sotto 381fdf0345eSFederico Vagaforma di commenti formattati in maniera particolare; questi commenti possono 382fdf0345eSFederico Vagaessere estratti e formattati in differenti modi attraverso lo script 383fdf0345eSFederico Vaga"kernel-doc". Se state lavorando all'interno di un sottosistema che ha 384fdf0345eSFederico Vagacommenti kerneldoc dovreste mantenerli e aggiungerli, in maniera appropriata, 385fdf0345eSFederico Vagaper le funzioni disponibili esternamente. Anche in aree che non sono molto 386fdf0345eSFederico Vagadocumentate, non c'è motivo per non aggiungere commenti kerneldoc per il 387fdf0345eSFederico Vagafuturo; infatti, questa può essere un'attività utile per sviluppatori novizi 388fdf0345eSFederico Vagadel kernel. Il formato di questi commenti, assieme alle informazione su come 389fdf0345eSFederico Vagacreare modelli per kerneldoc, possono essere trovati in 390fdf0345eSFederico Vaga:ref:`Documentation/translations/it_IT/doc-guide/ <doc_guide>`. 391fdf0345eSFederico Vaga 392fdf0345eSFederico VagaChiunque legga un ammontare significativo di codice kernel noterà che, spesso, 393fdf0345eSFederico Vagai commenti si fanno maggiormente notare per la loro assenza. Ancora una volta, 394fdf0345eSFederico Vagale aspettative verso il nuovo codice sono più alte rispetto al passato; 395fdf0345eSFederico Vagainserire codice privo di commenti sarà più difficile. Detto ciò, va aggiunto 396fdf0345eSFederico Vagache non si desiderano commenti prolissi per il codice. Il codice dovrebbe 397fdf0345eSFederico Vagaessere, di per sé, leggibile, con dei commenti che spieghino gli aspetti più 398fdf0345eSFederico Vagasottili. 399fdf0345eSFederico Vaga 400fdf0345eSFederico VagaDeterminate cose dovrebbero essere sempre commentate. L'uso di barriere 401fdf0345eSFederico Vagadi memoria dovrebbero essere accompagnate da una riga che spieghi perché sia 402fdf0345eSFederico Vaganecessaria. Le regole di sincronizzazione per le strutture dati, generalmente, 403fdf0345eSFederico Vaganecessitano di una spiegazioni da qualche parte. Le strutture dati più 404fdf0345eSFederico Vagaimportanti, in generale, hanno bisogno di una documentazione onnicomprensiva. 405fdf0345eSFederico VagaLe dipendenze che non sono ovvie tra bit separati di codice dovrebbero essere 406fdf0345eSFederico Vagaindicate. Tutto ciò che potrebbe indurre un inserviente del codice a fare 407fdf0345eSFederico Vagauna "pulizia" incorretta, ha bisogno di un commento che dica perché è stato 408fdf0345eSFederico Vagafatto in quel modo. E così via. 409fdf0345eSFederico Vaga 410fdf0345eSFederico VagaCambiamenti interni dell'API 411fdf0345eSFederico Vaga---------------------------- 412fdf0345eSFederico Vaga 413fdf0345eSFederico VagaL'interfaccia binaria fornita dal kernel allo spazio utente non può essere 414fdf0345eSFederico Vagarotta tranne che in circostanze eccezionali. L'interfaccia di programmazione 415fdf0345eSFederico Vagainterna al kernel, invece, è estremamente fluida e può essere modificata al 416fdf0345eSFederico Vagabisogno. Se vi trovate a dover lavorare attorno ad un'API del kernel o 417fdf0345eSFederico Vagasemplicemente non state utilizzando una funzionalità offerta perché questa 418fdf0345eSFederico Vaganon rispecchia i vostri bisogni, allora questo potrebbe essere un segno che 419fdf0345eSFederico Vagal'API ha bisogno di essere cambiata. In qualità di sviluppatore del kernel, 420fdf0345eSFederico Vagahai il potere di fare questo tipo di modifica. 421fdf0345eSFederico Vaga 422fdf0345eSFederico VagaCi sono ovviamente alcuni punti da cogliere. I cambiamenti API possono essere 423fdf0345eSFederico Vagafatti, ma devono essere giustificati. Quindi ogni patch che porta ad una 424fdf0345eSFederico Vagamodifica dell'API interna dovrebbe essere accompagnata da una descrizione 425fdf0345eSFederico Vagadella modifica in sé e del perché essa è necessaria. Questo tipo di 426fdf0345eSFederico Vagacambiamenti dovrebbero, inoltre, essere fatti in una patch separata, invece di 427fdf0345eSFederico Vagaessere sepolti all'interno di una patch più grande. 428fdf0345eSFederico Vaga 429fdf0345eSFederico VagaL'altro punto da cogliere consiste nel fatto che uno sviluppatore che 430fdf0345eSFederico Vagamodifica l'API deve, in generale, essere responsabile della correzione 431fdf0345eSFederico Vagadi tutto il codice del kernel che viene rotto per via della sua modifica. 432fdf0345eSFederico VagaPer una funzione ampiamente usata, questo compito può condurre letteralmente 433fdf0345eSFederico Vagaa centinaia o migliaia di modifiche, molte delle quali sono in conflitto con 434fdf0345eSFederico Vagail lavoro svolto da altri sviluppatori. Non c'è bisogno di dire che questo 435fdf0345eSFederico Vagapuò essere un lavoro molto grosso, quindi è meglio essere sicuri che la 436fdf0345eSFederico Vagamotivazione sia ben solida. Notate che lo strumento Coccinelle può fornire 437fdf0345eSFederico Vagaun aiuto con modifiche estese dell'API. 438fdf0345eSFederico Vaga 439fdf0345eSFederico VagaQuando viene fatta una modifica API incompatibile, una persona dovrebbe, 440fdf0345eSFederico Vagaquando possibile, assicurarsi che quel codice non aggiornato sia trovato 441fdf0345eSFederico Vagadal compilatore. Questo vi aiuterà ad essere sicuri d'avere trovato, 442fdf0345eSFederico Vagatutti gli usi di quell'interfaccia. Inoltre questo avviserà gli sviluppatori 443fdf0345eSFederico Vagadi codice fuori dal kernel che c'è un cambiamento per il quale è necessario del 444fdf0345eSFederico Vagalavoro. Il supporto al codice fuori dal kernel non è qualcosa di cui gli 445fdf0345eSFederico Vagasviluppatori del kernel devono preoccuparsi, ma non dobbiamo nemmeno rendere 446fdf0345eSFederico Vagapiù difficile del necessario la vita agli sviluppatori di questo codice. 447