Lines Matching +full:un +full:-
1 .. include:: ../disclaimer-ita.rst
4 :ref:`Documentation/kernel-hacking/hacking.rst <kernel_hacking_hack>`
6 :Original: :ref:`Documentation/kernel-hacking/hacking.rst <kernel_hacking_hack>`
23 è di fornire ai programmatori C più esperti un manuale di base per sviluppo.
30 crescere e diventare un compendio di buone pratiche, punti di partenza
36 In qualsiasi momento ognuna delle CPU di un sistema può essere:
38 - non associata ad alcun processo, servendo un'interruzione hardware;
40 - non associata ad alcun processo, servendo un softirq o tasklet;
42 - in esecuzione nello spazio kernel, associata ad un processo
45 - in esecuzione di un processo nello spazio utente;
47 Esiste un ordine fra questi casi. Gli ultimi due possono avvicendarsi (preempt)
48 l'un l'altro, ma a parte questo esiste una gerarchia rigida: ognuno di questi
49 può avvicendarsi solo ad uno di quelli sottostanti. Per esempio, mentre un
51 nell'esecuzione, ma un'interruzione hardware può. Ciò nonostante, le altre CPU
58 ---------------
67 Si è sempre in contesto utente quando un modulo viene caricato o rimosso,
78 di seguito), :c:func:`in_interrupt()` ritornerà un falso positivo.
81 ---------------------------------
84 che possono produrre interruzioni in un qualsiasi momento. Il kernel esegue
85 i gestori d'interruzione che prestano un servizio all'hardware. Il kernel
98 Attenzione, questa ritornerà un falso positivo se le interruzioni
102 ---------------------------------------------------
105 oppure un gestore d'interruzioni termina, qualsiasi 'interruzione software'
106 marcata come pendente (solitamente da un'interruzione hardware) viene
109 La maggior parte del lavoro utile alla gestione di un'interruzione avviene qui.
117 Un tipo di softirq molto importante è il timer (``include/linux/timer.h``):
118 potete programmarlo per far si che esegua funzioni dopo un determinato
121 Dato che i softirq possono essere eseguiti simultaneamente su più di un
125 quanti ne volete), e garantiscono che un qualsiasi tasklet verrà eseguito
126 solo su un processore alla volta, sebbene diversi tasklet possono essere
134 Potete determinate se siete in un softirq (o tasklet) utilizzando la
139 State attenti che questa macro ritornerà un falso positivo
158 Un limite rigido dello stack
160 maggior parte delle architetture a 32-bit; è di 14K per la maggior
161 parte di quelle a 64-bit; e spesso è condiviso con le interruzioni,
167 Quindi mantenetelo tale. Il vostro codice dovrebbe essere a 64-bit ed
168 indipendente dall'ordine dei byte (endianess) di un processore. Inoltre,
169 dovreste minimizzare il codice specifico per un processore; per esempio
172 limitato alla parte di kernel specifica per un'architettura.
186 Create un dispositivo a caratteri ed implementate l'appropriata chiamata ioctl.
193 considerate l'implementazione di un'interfaccia :c:func:`sysfs()`.
195 All'interno di una ioctl vi trovate nel contesto utente di un processo. Quando
196 avviene un errore dovete ritornare un valore negativo di errno (consultate
197 ``include/uapi/asm-generic/errno-base.h``,
198 ``include/uapi/asm-generic/errno.h`` e ``include/linux/errno.h``), altrimenti
202 Unix/Linux di gestire un segnale è di uscire temporaneamente dalla chiamata
203 di sistema con l'errore ``-ERESTARTSYS``. La chiamata di sistema ritornerà
212 return -ERESTARTSYS;
217 un sistema multi-processo senza diritto di prelazione).
231 - Siete in un contesto utente.
233 - Non trattenete alcun spinlock.
235 - Avete abilitato le interruzioni (in realtà, Andy Kleen dice che
253 ------------------
261 inutilizzabile. La funzione utilizza un formato stringa quasi compatibile con
268 questi sono interpretati da syslog come livelli. Un caso speciale:
269 per stampare un indirizzo IP usate::
275 :c:func:`printk()` utilizza un buffer interno di 1K e non s'accorge di
280 Saprete di essere un vero hacker del kernel quando inizierete a digitare
285 Un'altra nota a parte: la versione originale di Unix 6 aveva un commento
290 ---------------------------------------------------------------------------------------------------
298 Un puntatore nello spazio utente non dovrebbe mai essere dereferenziato: i dati
300 ``-EFAULT`` oppure 0.
308 funzioni ritornano la quantità di dati copiati (0 è comunque un successo).
311 dopo anno. --RR]
318 -------------------------------------
324 Queste procedure sono utilizzate per la richiesta dinamica di un puntatore ad
325 un pezzo di memoria allineato, esattamente come malloc e free nello spazio
326 utente, ma :c:func:`kmalloc()` ha un argomento aggiuntivo per indicare alcune
335 Non dorme. Meno affidabile di ``GFP_KERNEL``, ma può essere usata in un
344 Se vedete un messaggio d'avviso per una funzione dormiente che viene chiamata
345 da un contesto errato, allora probabilmente avete usato una funzione
346 d'allocazione dormiente da un contesto d'interruzione senza ``GFP_ATOMIC``.
351 Accetta un argomento che definisce l'ordine (0 per per la dimensione di una
355 Se state allocando un numero di byte notevolemnte superiore ad una pagina
357 dello spazio kernel. Questo è un blocco di memoria fisica non contiguo, ma
362 memoria fisica contigua, avete un problema: Linux non ha un buon supporto per
363 questo caso d'uso perché, dopo un po' di tempo, la frammentazione della memoria
364 rende l'operazione difficile. Il modo migliore per allocare un simile blocco
372 -------------------
376 Questa variabile globale (in realtà una macro) contiene un puntatore alla
378 Per esempio, quando un processo esegue una chiamata di sistema, questo
383 -------------------------------------
388 per brevi pause. Non usate grandi valori perché rischiate d'avere un
389 overflow - in questo contesto la funzione :c:func:`mdelay()` è utile,
393 -----------------------------------------------------------------------------------------------
398 sostituito da 64 o 16, e "be" con "le") forniscono un modo generico
404 puntatori, come :c:func:`cpu_to_be32p()`, che prende un puntatore
405 ad un tipo, e ritorna il valore convertito. L'altra variante per
406 la famiglia di conversioni "in-situ", come :c:func:`cpu_to_be32s()`,
407 che convertono il valore puntato da un puntatore, e ritornano void.
410 --------------------------------------------------------
423 --------------------------------------------------------
436 ----------------------------
441 spostati su un altro processore all'improvviso) e ritorna il numero
447 se siete in un contesto d'interruzione, o il diritto di prelazione
452 ------------------------------------
465 :c:func:`EXPORT_SYMBOL_GPL()` - non funzionerà.
469 ----------------------------------------------
485 La funzione può ritornare un numero d'errore negativo per scatenare un
492 -----------------------
504 removibile (a meno che non usiate 'rmmod -f' ).
508 -------------------------------------------------
513 rimozione (in aggiunta, un modulo non può essere rimosso se un altro modulo
520 La maggior parte delle strutture registrabili hanno un campo owner
539 -------------
546 -----------
552 un'espressione che dev'essere valutata; la macro ritorna 0 quando questa
553 espressione è vera, altrimenti ``-ERESTARTSYS`` se è stato ricevuto un segnale.
557 -------------------------------
569 (``include/asm/atomic.h``); questo contiene un intero con segno (minimo 32bit),
584 ``unsigned long``. Queste operazioni prendono come argomento un puntatore
585 alla variabile, e un numero di bit dove 0 è quello meno significativo.
595 big-endian quindi è meglio evitarlo.
601 a meno che un simbolo non venga dichiarato con visibilita limitata ad un
608 -------------------------
612 Questo è il classico metodo per esportare un simbolo: i moduli caricati
616 -----------------------------
630 ----------------------------
636 Documentation/translations/it_IT/core-api/symbol-namespaces.rst.
639 --------------------------------
645 Documentation/translations/it_IT/core-api/symbol-namespaces.rst.
651 ------------------------------------------------------
653 Un tempo negli header del kernel c'erano tre gruppi di funzioni per
660 ---------------------------------
663 C e ritornare 0 in caso di successo, ed un codice di errore negativo
664 (eg. ``-EFAULT``) nei casi fallimentari. Questo potrebbe essere controintuitivo
668 un numero d'errore negativo in un puntatore, e :c:func:`IS_ERR()` e
669 :c:func:`PTR_ERR()` per recuperarlo di nuovo: così si evita d'avere un
673 -----------------------
680 s'accompagna un'adeguata e completa nota sulla lista di discussone
682 sostituzione su tutto un file rendere le cose **peggiori**.
685 ------------------------------------------
702 --------------
707 leggete la sezione "C Extensions" nella pagina info di GCC - Sì, davvero
708 la pagina info, la pagina man è solo un breve riassunto delle cose nella
711 - Funzioni inline
713 - Istruzioni in espressioni (ie. il costrutto ({ and }) ).
715 - Dichiarate attributi di una funzione / variabile / tipo
718 - typeof
720 - Array con lunghezza zero
722 - Macro varargs
724 - Aritmentica sui puntatori void
726 - Inizializzatori non costanti
728 - Istruzioni assembler (non al di fuori di 'arch/' e 'include/asm/')
730 - Nomi delle funzioni come stringhe (__func__).
732 - __builtin_constant_p()
740 ---
748 -----
752 l'istruzione di pre-processore \`#if' all'interno del codice sorgente.
760 - Trovare chi è responsabile del codice che state modificando. Guardare in cima
768 il primo posto dove le persone guarderanno quando troveranno un baco,
771 - Solitamente vorrete un'opzione di configurazione per la vostra modifica
774 nel file ``Documentation/kbuild/kconfig-language.rst``.
783 - Modificate il file ``Makefile``: le variabili CONFIG sono esportate qui,
785 "obj-$(CONFIG_xxx) += xxx.o". La sintassi è documentata nel file
788 - Aggiungete voi stessi in ``CREDITS`` se credete di aver fatto qualcosa di
791 che volete essere consultati quando vengono fatte delle modifiche ad un
792 sottosistema, e quando ci sono dei bachi; questo implica molto di più di un
795 - Infine, non dimenticatevi di leggere
796 ``Documentation/process/submitting-patches.rst``.
818 * This should be a per-architecture thing, to allow different
823 #define IS_ERR(ptr) ((unsigned long)(ptr) > (unsigned long)(-1000))
837 * At least we *know* we can't spell, and use a spell-checker.
846 /* Tested on SS-5, SS-10. Probably someone at Sun applied a spell-checker. */
867 per avermi fornito un ottimo riassunto di :c:func:`disable_irq()`,