cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

7.AdvancedTopics.rst (10997B)


      1.. include:: ../disclaimer-ita.rst
      2
      3:Original: :ref:`Documentation/process/7.AdvancedTopics.rst <development_advancedtopics>`
      4:Translator: Federico Vaga <federico.vaga@vaga.pv.it>
      5
      6.. _it_development_advancedtopics:
      7
      8Argomenti avanzati
      9==================
     10
     11A questo punto, si spera, dovreste avere un'idea su come funziona il processo
     12di sviluppo.  Ma rimane comunque molto da imparare!  Questo capitolo copre
     13alcuni argomenti che potrebbero essere utili per gli sviluppatori che stanno
     14per diventare parte integrante del processo di sviluppo del kernel.
     15
     16Gestire le modifiche con git
     17-----------------------------
     18
     19L'uso di un sistema distribuito per il controllo delle versioni del kernel
     20ebbe iniziò nel 2002 quando Linux iniziò a provare il programma proprietario
     21BitKeeper.  Nonostante l'uso di BitKeeper fosse opinabile, di certo il suo
     22approccio alla gestione dei sorgenti non lo era.  Un sistema distribuito per
     23il controllo delle versioni accelerò immediatamente lo sviluppo del kernel.
     24Oggigiorno, ci sono diverse alternative libere a BitKeeper.  Per il meglio o il
     25peggio, il progetto del kernel ha deciso di usare git per gestire i sorgenti.
     26
     27Gestire le modifiche con git può rendere la vita dello sviluppatore molto
     28più facile, specialmente quando il volume delle modifiche cresce.
     29Git ha anche i suoi lati taglienti che possono essere pericolosi; è uno
     30strumento giovane e potente che è ancora in fase di civilizzazione da parte
     31dei suoi sviluppatori.  Questo documento non ha lo scopo di insegnare l'uso
     32di git ai suoi lettori; ci sarebbe materiale a sufficienza per un lungo
     33documento al riguardo.  Invece, qui ci concentriamo in particolare su come
     34git è parte del processo di sviluppo del kernel.  Gli sviluppatori che
     35desiderassero diventare agili con git troveranno più informazioni ai
     36seguenti indirizzi:
     37
     38	http://git-scm.com/
     39
     40	http://www.kernel.org/pub/software/scm/git/docs/user-manual.html
     41
     42e su varie guide che potrete trovare su internet.
     43
     44La prima cosa da fare prima di usarlo per produrre patch che saranno
     45disponibili ad altri, è quella di leggere i siti qui sopra e di acquisire una
     46base solida su come funziona git.  Uno sviluppatore che sappia usare git
     47dovrebbe essere capace di ottenere una copia del repositorio principale,
     48esplorare la storia della revisione, registrare le modifiche, usare i rami,
     49eccetera.  Una certa comprensione degli strumenti git per riscrivere la storia
     50(come ``rebase``) è altrettanto utile.  Git ha i propri concetti e la propria
     51terminologia; un nuovo utente dovrebbe conoscere *refs*, *remote branch*,
     52*index*, *fast-forward merge*, *push* e *pull*, *detached head*, eccetera.
     53Il tutto potrebbe essere un po' intimidatorio visto da fuori, ma con un po'
     54di studio i concetti non saranno così difficili da capire.
     55
     56Utilizzare git per produrre patch da sottomettere via email può essere
     57un buon esercizio da fare mentre si sta prendendo confidenza con lo strumento.
     58
     59Quando sarete in grado di creare rami git che siano guardabili da altri,
     60vi servirà, ovviamente, un server dal quale sia possibile attingere le vostre
     61modifiche.  Se avete un server accessibile da Internet, configurarlo per
     62eseguire git-daemon è relativamente semplice .  Altrimenti, iniziano a
     63svilupparsi piattaforme che offrono spazi pubblici, e gratuiti (Github,
     64per esempio).  Gli sviluppatori permanenti possono ottenere un account
     65su kernel.org, ma non è proprio facile da ottenere; per maggiori informazioni
     66consultate la pagina web http://kernel.org/faq/.
     67
     68In git è normale avere a che fare con tanti rami.  Ogni linea di sviluppo
     69può essere separata in "rami per argomenti" e gestiti indipendentemente.
     70In git i rami sono facilissimi, per cui non c'è motivo per non usarli
     71in libertà.  In ogni caso, non dovreste sviluppare su alcun ramo dal
     72quale altri potrebbero attingere.  I rami disponibili pubblicamente dovrebbero
     73essere creati con attenzione; integrate patch dai rami di sviluppo
     74solo quando sono complete e pronte ad essere consegnate - non prima.
     75
     76Git offre alcuni strumenti che vi permettono di riscrivere la storia del
     77vostro sviluppo.  Una modifica errata (diciamo, una che rompe la bisezione,
     78oppure che ha un qualche tipo di baco evidente) può essere corretta sul posto
     79o fatta sparire completamente dalla storia.  Una serie di patch può essere
     80riscritta come se fosse stata scritta in cima al ramo principale di oggi,
     81anche se ci avete lavorato per mesi.  Le modifiche possono essere spostate
     82in modo trasparente da un ramo ad un altro.  E così via.  Un uso giudizioso
     83di git per revisionare la storia può aiutare nella creazione di una serie
     84di patch pulite e con meno problemi.
     85
     86Un uso eccessivo può portare ad altri tipi di problemi, tuttavia, oltre
     87alla semplice ossessione per la creazione di una storia del progetto che sia
     88perfetta.  Riscrivere la storia riscriverà le patch contenute in quella
     89storia, trasformando un kernel verificato (si spera) in uno da verificare.
     90Ma, oltre a questo, gli sviluppatori non possono collaborare se non condividono
     91la stessa vista sulla storia del progetto; se riscrivete la storia dalla quale
     92altri sviluppatori hanno attinto per i loro repositori, renderete la loro vita
     93molto più difficile.  Quindi tenete conto di questa semplice regola generale:
     94la storia che avete esposto ad altri, generalmente, dovrebbe essere vista come
     95immutabile.
     96
     97Dunque, una volta che il vostro insieme di patch è stato reso disponibile
     98pubblicamente non dovrebbe essere più sovrascritto.  Git tenterà di imporre
     99questa regola, e si rifiuterà di pubblicare nuove patch che non risultino
    100essere dirette discendenti di quelle pubblicate in precedenza (in altre parole,
    101patch che non condividono la stessa storia).  È possibile ignorare questo
    102controllo, e ci saranno momenti in cui sarà davvero necessario riscrivere
    103un ramo già pubblicato.  Un esempio è linux-next dove le patch vengono
    104spostate da un ramo all'altro al fine di evitare conflitti.  Ma questo tipo
    105d'azione dovrebbe essere un'eccezione.  Questo è uno dei motivi per cui lo
    106sviluppo dovrebbe avvenire in rami privati (che possono essere sovrascritti
    107quando lo si ritiene necessario) e reso pubblico solo quando è in uno stato
    108avanzato.
    109
    110Man mano che il ramo principale (o altri rami su cui avete basato le
    111modifiche) avanza, diventa allettante l'idea di integrare tutte le patch
    112per rimanere sempre aggiornati.  Per un ramo privato, il *rebase* può essere
    113un modo semplice per rimanere aggiornati, ma questa non è un'opzione nel
    114momento in cui il vostro ramo è stato esposto al mondo intero.
    115*Merge* occasionali possono essere considerati di buon senso, ma quando
    116diventano troppo frequenti confondono inutilmente la storia.  La tecnica
    117suggerita in questi casi è quella di fare *merge* raramente, e più in generale
    118solo nei momenti di rilascio (per esempio gli -rc del ramo principale).
    119Se siete nervosi circa alcune patch in particolare, potete sempre fare
    120dei *merge* di test in un ramo privato.  In queste situazioni git "rerere"
    121può essere utile; questo strumento si ricorda come i conflitti di *merge*
    122furono risolti in passato cosicché non dovrete fare lo stesso lavoro due volte.
    123
    124Una 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
    126facile l'integrazione nel ramo principale di modifiche mediocri, il tutto
    127sotto il naso dei revisori.  Gli sviluppatori del kernel tendono ad essere
    128scontenti quando vedono succedere queste cose; preparare un ramo git con
    129patch che non hanno ricevuto alcuna revisione o completamente avulse, potrebbe
    130influire sulla vostra capacita di proporre, in futuro, l'integrazione dei
    131vostri 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
    142Per evitare queste situazioni, assicuratevi che tutte le patch in un ramo
    143siano strettamente correlate al tema delle modifiche; un ramo "driver fixes"
    144non dovrebbe fare modifiche al codice principale per la gestione della memoria.
    145E, più importante ancora, non usate un repositorio git per tentare di
    146evitare il processo di revisione.  Pubblicate un sommario di quello che il
    147vostro ramo contiene sulle liste di discussione più opportune, e , quando
    148sarà il momento, richiedete che il vostro ramo venga integrato in linux-next.
    149
    150Se e quando altri inizieranno ad inviarvi patch per essere incluse nel
    151vostro repositorio, non dovete dimenticare di revisionarle.  Inoltre
    152assicuratevi di mantenerne le informazioni di paternità; al riguardo git "am"
    153fa del suo meglio, ma potreste dover aggiungere una riga "From:" alla patch
    154nel caso in cui sia arrivata per vie traverse.
    155
    156Quando richiedete l'integrazione, siate certi di fornire tutte le informazioni:
    157dov'è il vostro repositorio, quale ramo integrare, e quali cambiamenti si
    158otterranno dall'integrazione.  Il comando git request-pull può essere d'aiuto;
    159preparerà una richiesta nel modo in cui gli altri sviluppatori se l'aspettano,
    160e verificherà che vi siate ricordati di pubblicare quelle patch su un
    161server pubblico.
    162
    163Revisionare le patch
    164--------------------
    165
    166Alcuni lettori potrebbero avere obiezioni sulla presenza di questa sezione
    167negli "argomenti avanzati" sulla base che anche gli sviluppatori principianti
    168dovrebbero revisionare le patch.  É certamente vero che non c'è modo
    169migliore di imparare come programmare per il kernel che guardare il codice
    170pubblicato dagli altri.  In aggiunta, i revisori sono sempre troppo pochi;
    171guardando il codice potete apportare un significativo contributo all'intero
    172processo.
    173
    174Revisionare il codice potrebbe risultare intimidatorio, specialmente per i
    175nuovi arrivati che potrebbero sentirsi un po' nervosi nel questionare
    176il codice - in pubblico - pubblicato da sviluppatori più esperti.  Perfino
    177il codice scritto dagli sviluppatori più esperti può essere migliorato.
    178Forse il suggerimento migliore per i revisori (tutti) è questo: formulate
    179i commenti come domande e non come critiche.  Chiedere "Come viene rilasciato
    180il *lock* in questo percorso?" funziona sempre molto meglio che
    181"qui la sincronizzazione è sbagliata".
    182
    183Diversi sviluppatori revisioneranno il codice con diversi punti di vista.
    184Alcuni potrebbero concentrarsi principalmente sullo stile del codice e se
    185alcune linee hanno degli spazio bianchi di troppo.  Altri si chiederanno
    186se accettare una modifica interamente è una cosa positiva per il kernel
    187o no.  E altri ancora si focalizzeranno sui problemi di sincronizzazione,
    188l'uso eccessivo di *stack*, problemi di sicurezza, duplicazione del codice
    189in altri contesti, documentazione, effetti negativi sulle prestazioni, cambi
    190all'ABI dello spazio utente, eccetera.  Qualunque tipo di revisione è ben
    191accetta e di valore, se porta ad avere un codice migliore nel kernel.