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

kernel-doc.rst (19581B)


      1.. include:: ../disclaimer-ita.rst
      2
      3.. note:: Per leggere la documentazione originale in inglese:
      4	  :ref:`Documentation/doc-guide/index.rst <doc_guide>`
      5
      6.. _it_kernel_doc:
      7
      8Scrivere i commenti in kernel-doc
      9=================================
     10
     11Nei file sorgenti del kernel Linux potrete trovare commenti di documentazione
     12strutturanti secondo il formato kernel-doc. Essi possono descrivere funzioni,
     13tipi di dati, e l'architettura del codice.
     14
     15.. note:: Il formato kernel-doc può sembrare simile a gtk-doc o Doxygen ma
     16   in realtà è molto differente per ragioni storiche. I sorgenti del kernel
     17   contengono decine di migliaia di commenti kernel-doc. Siete pregati
     18   d'attenervi allo stile qui descritto.
     19
     20La struttura kernel-doc è estratta a partire dai commenti; da questi viene
     21generato il `dominio Sphinx per il C`_ con un'adeguata descrizione per le
     22funzioni ed i tipi di dato con i loro relativi collegamenti. Le descrizioni
     23vengono filtrare per cercare i riferimenti ed i marcatori.
     24
     25Vedere di seguito per maggiori dettagli.
     26
     27.. _`dominio Sphinx per il C`: http://www.sphinx-doc.org/en/stable/domains.html
     28
     29Tutte le funzioni esportate verso i moduli esterni utilizzando
     30``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL`` dovrebbero avere un commento
     31kernel-doc. Quando l'intenzione è di utilizzarle nei moduli, anche le funzioni
     32e le strutture dati nei file d'intestazione dovrebbero avere dei commenti
     33kernel-doc.
     34
     35È considerata una buona pratica quella di fornire una documentazione formattata
     36secondo kernel-doc per le funzioni che sono visibili da altri file del kernel
     37(ovvero, che non siano dichiarate utilizzando ``static``). Raccomandiamo,
     38inoltre, di fornire una documentazione kernel-doc anche per procedure private
     39(ovvero, dichiarate "static") al fine di fornire una struttura più coerente
     40dei sorgenti. Quest'ultima raccomandazione ha una priorità più bassa ed è a
     41discrezione dal manutentore (MAINTAINER) del file sorgente.
     42
     43
     44
     45Sicuramente la documentazione formattata con kernel-doc è necessaria per
     46le funzioni che sono esportate verso i moduli esterni utilizzando
     47``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL``.
     48
     49Cerchiamo anche di fornire una documentazione formattata secondo kernel-doc
     50per le funzioni che sono visibili da altri file del kernel (ovvero, che non
     51siano dichiarate utilizzando "static")
     52
     53Raccomandiamo, inoltre, di fornire una documentazione formattata con kernel-doc
     54anche per procedure private (ovvero, dichiarate "static") al fine di fornire
     55una struttura più coerente dei sorgenti. Questa raccomandazione ha una priorità
     56più bassa ed è a discrezione dal manutentore (MAINTAINER) del file sorgente.
     57
     58Le strutture dati visibili nei file di intestazione dovrebbero essere anch'esse
     59documentate utilizzando commenti formattati con kernel-doc.
     60
     61Come formattare i commenti kernel-doc
     62-------------------------------------
     63
     64I commenti kernel-doc iniziano con il marcatore ``/**``. Il programma
     65``kernel-doc`` estrarrà i commenti marchiati in questo modo. Il resto
     66del commento è formattato come un normale commento multilinea, ovvero
     67con un asterisco all'inizio d'ogni riga e che si conclude con ``*/``
     68su una riga separata.
     69
     70I commenti kernel-doc di funzioni e tipi dovrebbero essere posizionati
     71appena sopra la funzione od il tipo che descrivono. Questo allo scopo di
     72aumentare la probabilità che chi cambia il codice si ricordi di aggiornare
     73anche la documentazione. I commenti kernel-doc di tipo più generale possono
     74essere posizionati ovunque nel file.
     75
     76Al fine di verificare che i commenti siano formattati correttamente, potete
     77eseguire il programma ``kernel-doc`` con un livello di verbosità alto e senza
     78che questo produca alcuna documentazione. Per esempio::
     79
     80	scripts/kernel-doc -v -none drivers/foo/bar.c
     81
     82Il formato della documentazione è verificato della procedura di generazione
     83del kernel quando viene richiesto di effettuare dei controlli extra con GCC::
     84
     85	make W=n
     86
     87Documentare le funzioni
     88------------------------
     89
     90Generalmente il formato di un commento kernel-doc per funzioni e
     91macro simil-funzioni è il seguente::
     92
     93  /**
     94   * function_name() - Brief description of function.
     95   * @arg1: Describe the first argument.
     96   * @arg2: Describe the second argument.
     97   *        One can provide multiple line descriptions
     98   *        for arguments.
     99   *
    100   * A longer description, with more discussion of the function function_name()
    101   * that might be useful to those using or modifying it. Begins with an
    102   * empty comment line, and may include additional embedded empty
    103   * comment lines.
    104   *
    105   * The longer description may have multiple paragraphs.
    106   *
    107   * Context: Describes whether the function can sleep, what locks it takes,
    108   *          releases, or expects to be held. It can extend over multiple
    109   *          lines.
    110   * Return: Describe the return value of function_name.
    111   *
    112   * The return value description can also have multiple paragraphs, and should
    113   * be placed at the end of the comment block.
    114   */
    115
    116La descrizione introduttiva (*brief description*) che segue il nome della
    117funzione può continuare su righe successive e termina con la descrizione di
    118un argomento, una linea di commento vuota, oppure la fine del commento.
    119
    120Parametri delle funzioni
    121~~~~~~~~~~~~~~~~~~~~~~~~
    122
    123Ogni argomento di una funzione dovrebbe essere descritto in ordine, subito
    124dopo la descrizione introduttiva.  Non lasciare righe vuote né fra la
    125descrizione introduttiva e quella degli argomenti, né fra gli argomenti.
    126
    127Ogni ``@argument:`` può estendersi su più righe.
    128
    129.. note::
    130
    131   Se la descrizione di ``@argument:`` si estende su più righe,
    132   la continuazione dovrebbe iniziare alla stessa colonna della riga
    133   precedente::
    134
    135      * @argument: some long description
    136      *            that continues on next lines
    137
    138   or::
    139
    140      * @argument:
    141      *		some long description
    142      *		that continues on next lines
    143
    144Se una funzione ha un numero variabile di argomento, la sua descrizione
    145dovrebbe essere scritta con la notazione kernel-doc::
    146
    147      * @...: description
    148
    149Contesto delle funzioni
    150~~~~~~~~~~~~~~~~~~~~~~~
    151
    152Il contesto in cui le funzioni vengono chiamate viene descritto in una
    153sezione chiamata ``Context``. Questo dovrebbe informare sulla possibilità
    154che una funzione dorma (*sleep*) o che possa essere chiamata in un contesto
    155d'interruzione, così come i *lock* che prende, rilascia e che si aspetta che
    156vengano presi dal chiamante.
    157
    158Esempi::
    159
    160  * Context: Any context.
    161  * Context: Any context. Takes and releases the RCU lock.
    162  * Context: Any context. Expects <lock> to be held by caller.
    163  * Context: Process context. May sleep if @gfp flags permit.
    164  * Context: Process context. Takes and releases <mutex>.
    165  * Context: Softirq or process context. Takes and releases <lock>, BH-safe.
    166  * Context: Interrupt context.
    167
    168Valore di ritorno
    169~~~~~~~~~~~~~~~~~
    170
    171Il valore di ritorno, se c'è, viene descritto in una sezione dedicata di nome
    172``Return``.
    173
    174.. note::
    175
    176  #) La descrizione multiriga non riconosce il termine d'una riga, per cui
    177     se provate a formattare bene il vostro testo come nel seguente esempio::
    178
    179	* Return:
    180	* 0 - OK
    181	* -EINVAL - invalid argument
    182	* -ENOMEM - out of memory
    183
    184     le righe verranno unite e il risultato sarà::
    185
    186	Return: 0 - OK -EINVAL - invalid argument -ENOMEM - out of memory
    187
    188     Quindi, se volete che le righe vengano effettivamente generate, dovete
    189     utilizzare una lista ReST, ad esempio::
    190
    191      * Return:
    192      * * 0		- OK to runtime suspend the device
    193      * * -EBUSY	- Device should not be runtime suspended
    194
    195  #) Se il vostro testo ha delle righe che iniziano con una frase seguita dai
    196     due punti, allora ognuna di queste frasi verrà considerata come il nome
    197     di una nuova sezione, e probabilmente non produrrà gli effetti desiderati.
    198
    199Documentare strutture, unioni ed enumerazioni
    200---------------------------------------------
    201
    202Generalmente il formato di un commento kernel-doc per struct, union ed enum è::
    203
    204  /**
    205   * struct struct_name - Brief description.
    206   * @member1: Description of member1.
    207   * @member2: Description of member2.
    208   *           One can provide multiple line descriptions
    209   *           for members.
    210   *
    211   * Description of the structure.
    212   */
    213
    214Nell'esempio qui sopra, potete sostituire ``struct`` con ``union`` o ``enum``
    215per descrivere unioni ed enumerati. ``member`` viene usato per indicare i
    216membri di strutture ed unioni, ma anche i valori di un tipo enumerato.
    217
    218La descrizione introduttiva (*brief description*) che segue il nome della
    219funzione può continuare su righe successive e termina con la descrizione di
    220un argomento, una linea di commento vuota, oppure la fine del commento.
    221
    222Membri
    223~~~~~~
    224
    225I membri di strutture, unioni ed enumerati devo essere documentati come i
    226parametri delle funzioni; seguono la descrizione introduttiva e possono
    227estendersi su più righe.
    228
    229All'interno d'una struttura o d'un unione, potete utilizzare le etichette
    230``private:`` e ``public:``. I campi che sono nell'area ``private:`` non
    231verranno inclusi nella documentazione finale.
    232
    233Le etichette ``private:`` e ``public:`` devono essere messe subito dopo
    234il marcatore di un commento ``/*``. Opzionalmente, possono includere commenti
    235fra ``:`` e il marcatore di fine commento ``*/``.
    236
    237Esempio::
    238
    239  /**
    240   * struct my_struct - short description
    241   * @a: first member
    242   * @b: second member
    243   * @d: fourth member
    244   *
    245   * Longer description
    246   */
    247  struct my_struct {
    248      int a;
    249      int b;
    250  /* private: internal use only */
    251      int c;
    252  /* public: the next one is public */
    253      int d;
    254  };
    255
    256Strutture ed unioni annidate
    257~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    258
    259È possibile documentare strutture ed unioni annidate, ad esempio::
    260
    261      /**
    262       * struct nested_foobar - a struct with nested unions and structs
    263       * @memb1: first member of anonymous union/anonymous struct
    264       * @memb2: second member of anonymous union/anonymous struct
    265       * @memb3: third member of anonymous union/anonymous struct
    266       * @memb4: fourth member of anonymous union/anonymous struct
    267       * @bar: non-anonymous union
    268       * @bar.st1: struct st1 inside @bar
    269       * @bar.st2: struct st2 inside @bar
    270       * @bar.st1.memb1: first member of struct st1 on union bar
    271       * @bar.st1.memb2: second member of struct st1 on union bar
    272       * @bar.st2.memb1: first member of struct st2 on union bar
    273       * @bar.st2.memb2: second member of struct st2 on union bar
    274       */
    275      struct nested_foobar {
    276        /* Anonymous union/struct*/
    277        union {
    278          struct {
    279            int memb1;
    280            int memb2;
    281        }
    282          struct {
    283            void *memb3;
    284            int memb4;
    285          }
    286        }
    287        union {
    288          struct {
    289            int memb1;
    290            int memb2;
    291          } st1;
    292          struct {
    293            void *memb1;
    294            int memb2;
    295          } st2;
    296        } bar;
    297      };
    298
    299.. note::
    300
    301   #) Quando documentate una struttura od unione annidata, ad esempio
    302      di nome ``foo``, il suo campo ``bar`` dev'essere documentato
    303      usando ``@foo.bar:``
    304   #) Quando la struttura od unione annidata è anonima, il suo campo
    305      ``bar`` dev'essere documentato usando ``@bar:``
    306
    307Commenti in linea per la documentazione dei membri
    308~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    309
    310I membri d'una struttura possono essere documentati in linea all'interno
    311della definizione stessa. Ci sono due stili: una singola riga di commento
    312che inizia con ``/**`` e finisce con ``*/``; commenti multi riga come
    313qualsiasi altro commento kernel-doc::
    314
    315  /**
    316   * struct foo - Brief description.
    317   * @foo: The Foo member.
    318   */
    319  struct foo {
    320        int foo;
    321        /**
    322         * @bar: The Bar member.
    323         */
    324        int bar;
    325        /**
    326         * @baz: The Baz member.
    327         *
    328         * Here, the member description may contain several paragraphs.
    329         */
    330        int baz;
    331        union {
    332                /** @foobar: Single line description. */
    333                int foobar;
    334        };
    335        /** @bar2: Description for struct @bar2 inside @foo */
    336        struct {
    337                /**
    338                 * @bar2.barbar: Description for @barbar inside @foo.bar2
    339                 */
    340                int barbar;
    341        } bar2;
    342  };
    343
    344
    345Documentazione dei tipi di dato
    346-------------------------------
    347Generalmente il formato di un commento kernel-doc per typedef è
    348il seguente::
    349
    350  /**
    351   * typedef type_name - Brief description.
    352   *
    353   * Description of the type.
    354   */
    355
    356Anche i tipi di dato per prototipi di funzione possono essere documentati::
    357
    358  /**
    359   * typedef type_name - Brief description.
    360   * @arg1: description of arg1
    361   * @arg2: description of arg2
    362   *
    363   * Description of the type.
    364   *
    365   * Context: Locking context.
    366   * Return: Meaning of the return value.
    367   */
    368   typedef void (*type_name)(struct v4l2_ctrl *arg1, void *arg2);
    369
    370Marcatori e riferimenti
    371-----------------------
    372
    373All'interno dei commenti di tipo kernel-doc vengono riconosciuti i seguenti
    374*pattern* che vengono convertiti in marcatori reStructuredText ed in riferimenti
    375del `dominio Sphinx per il C`_.
    376
    377.. attention:: Questi sono riconosciuti **solo** all'interno di commenti
    378               kernel-doc, e **non** all'interno di documenti reStructuredText.
    379
    380``funcname()``
    381  Riferimento ad una funzione.
    382
    383``@parameter``
    384  Nome di un parametro di una funzione (nessun riferimento, solo formattazione).
    385
    386``%CONST``
    387  Il nome di una costante (nessun riferimento, solo formattazione)
    388
    389````literal````
    390  Un blocco di testo che deve essere riportato così com'è. La rappresentazione
    391  finale utilizzerà caratteri a ``spaziatura fissa``.
    392
    393  Questo è utile se dovete utilizzare caratteri speciali che altrimenti
    394  potrebbero assumere un significato diverso in kernel-doc o in reStructuredText
    395
    396  Questo è particolarmente utile se dovete scrivere qualcosa come ``%ph``
    397  all'interno della descrizione di una funzione.
    398
    399``$ENVVAR``
    400  Il nome di una variabile d'ambiente (nessun riferimento, solo formattazione).
    401
    402``&struct name``
    403  Riferimento ad una struttura.
    404
    405``&enum name``
    406  Riferimento ad un'enumerazione.
    407
    408``&typedef name``
    409  Riferimento ad un tipo di dato.
    410
    411``&struct_name->member`` or ``&struct_name.member``
    412  Riferimento ad un membro di una struttura o di un'unione. Il riferimento sarà
    413  la struttura o l'unione, non il memembro.
    414
    415``&name``
    416  Un generico riferimento ad un tipo. Usate, preferibilmente, il riferimento
    417  completo come descritto sopra. Questo è dedicato ai commenti obsoleti.
    418
    419Riferimenti usando reStructuredText
    420~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    421
    422Nei documenti reStructuredText non serve alcuna sintassi speciale per
    423fare riferimento a funzioni e tipi definiti nei commenti
    424kernel-doc. Sarà sufficiente terminare i nomi di funzione con ``()``,
    425e scrivere ``struct``, ``union``, ``enum``, o ``typedef`` prima di un
    426tipo. Per esempio::
    427
    428  See foo()
    429  See struct foo.
    430  See union bar.
    431  See enum baz.
    432  See typedef meh.
    433
    434Tuttavia, la personalizzazione dei collegamenti è possibile solo con
    435la seguente sintassi::
    436
    437  See :c:func:`my custom link text for function foo <foo>`.
    438  See :c:type:`my custom link text for struct bar <bar>`.
    439
    440
    441Commenti per una documentazione generale
    442----------------------------------------
    443
    444Al fine d'avere il codice ed i commenti nello stesso file, potete includere
    445dei blocchi di documentazione kernel-doc con un formato libero invece
    446che nel formato specifico per funzioni, strutture, unioni, enumerati o tipi
    447di dato. Per esempio, questo tipo di commento potrebbe essere usato per la
    448spiegazione delle operazioni di un driver o di una libreria
    449
    450Questo s'ottiene utilizzando la parola chiave ``DOC:`` a cui viene associato
    451un titolo.
    452
    453Generalmente il formato di un commento generico o di visione d'insieme è
    454il seguente::
    455
    456  /**
    457   * DOC: Theory of Operation
    458   *
    459   * The whizbang foobar is a dilly of a gizmo. It can do whatever you
    460   * want it to do, at any time. It reads your mind. Here's how it works.
    461   *
    462   * foo bar splat
    463   *
    464   * The only drawback to this gizmo is that is can sometimes damage
    465   * hardware, software, or its subject(s).
    466   */
    467
    468Il titolo che segue ``DOC:`` funziona da intestazione all'interno del file
    469sorgente, ma anche come identificatore per l'estrazione di questi commenti di
    470documentazione. Quindi, il titolo dev'essere unico all'interno del file.
    471
    472Includere i commenti di tipo kernel-doc
    473=======================================
    474
    475I commenti di documentazione possono essere inclusi in un qualsiasi documento
    476di tipo reStructuredText mediante l'apposita direttiva nell'estensione
    477kernel-doc per Sphinx.
    478
    479Le direttive kernel-doc sono nel formato::
    480
    481  .. kernel-doc:: source
    482     :option:
    483
    484Il campo *source* è il percorso ad un file sorgente, relativo alla cartella
    485principale dei sorgenti del kernel. La direttiva supporta le seguenti opzioni:
    486
    487export: *[source-pattern ...]*
    488  Include la documentazione per tutte le funzioni presenti nel file sorgente
    489  (*source*) che sono state esportate utilizzando ``EXPORT_SYMBOL`` o
    490  ``EXPORT_SYMBOL_GPL`` in *source* o in qualsiasi altro *source-pattern*
    491  specificato.
    492
    493  Il campo *source-patter* è utile quando i commenti kernel-doc sono stati
    494  scritti nei file d'intestazione, mentre ``EXPORT_SYMBOL`` e
    495  ``EXPORT_SYMBOL_GPL`` si trovano vicino alla definizione delle funzioni.
    496
    497  Esempi::
    498
    499    .. kernel-doc:: lib/bitmap.c
    500       :export:
    501
    502    .. kernel-doc:: include/net/mac80211.h
    503       :export: net/mac80211/*.c
    504
    505internal: *[source-pattern ...]*
    506  Include la documentazione per tutte le funzioni ed i tipi presenti nel file
    507  sorgente (*source*) che **non** sono stati esportati utilizzando
    508  ``EXPORT_SYMBOL`` o ``EXPORT_SYMBOL_GPL`` né in *source* né in qualsiasi
    509  altro *source-pattern* specificato.
    510
    511  Esempio::
    512
    513    .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c
    514       :internal:
    515
    516identifiers: *[ function/type ...]*
    517  Include la documentazione per ogni *function* e *type*  in *source*.
    518  Se non vengono esplicitamente specificate le funzioni da includere, allora
    519  verranno incluse tutte quelle disponibili in *source*.
    520
    521  Esempi::
    522
    523    .. kernel-doc:: lib/bitmap.c
    524       :identifiers: bitmap_parselist bitmap_parselist_user
    525
    526    .. kernel-doc:: lib/idr.c
    527       :identifiers:
    528
    529functions: *[ function ...]*
    530  Questo è uno pseudonimo, deprecato, per la direttiva 'identifiers'.
    531
    532doc: *title*
    533  Include la documentazione del paragrafo ``DOC:`` identificato dal titolo
    534  (*title*) all'interno del file sorgente (*source*). Gli spazi in *title* sono
    535  permessi; non virgolettate *title*. Il campo *title* è utilizzato per
    536  identificare un paragrafo e per questo non viene incluso nella documentazione
    537  finale. Verificate d'avere l'intestazione appropriata nei documenti
    538  reStructuredText.
    539
    540  Esempio::
    541
    542    .. kernel-doc:: drivers/gpu/drm/i915/intel_audio.c
    543       :doc: High Definition Audio over HDMI and Display Port
    544
    545Senza alcuna opzione, la direttiva kernel-doc include tutti i commenti di
    546documentazione presenti nel file sorgente (*source*).
    547
    548L'estensione kernel-doc fa parte dei sorgenti del kernel, la si può trovare
    549in ``Documentation/sphinx/kerneldoc.py``. Internamente, viene utilizzato
    550lo script ``scripts/kernel-doc`` per estrarre i commenti di documentazione
    551dai file sorgenti.
    552
    553Come utilizzare kernel-doc per generare pagine man
    554--------------------------------------------------
    555
    556Se volete utilizzare kernel-doc solo per generare delle pagine man, potete
    557farlo direttamente dai sorgenti del kernel::
    558
    559  $ scripts/kernel-doc -man $(git grep -l '/\*\*' -- :^Documentation :^tools) | scripts/split-man.pl /tmp/man