<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9"> <TITLE>KernelAnalysis-HOWTO: Variabili Statiche</TITLE> <LINK HREF="KernelAnalysis-HOWTO-15.html" REL=next> <LINK HREF="KernelAnalysis-HOWTO-13.html" REL=previous> <LINK HREF="KernelAnalysis-HOWTO.html#toc14" REL=contents> </HEAD> <BODY> <A HREF="KernelAnalysis-HOWTO-15.html">Next</A> <A HREF="KernelAnalysis-HOWTO-13.html">Previous</A> <A HREF="KernelAnalysis-HOWTO.html#toc14">Contents</A> <HR> <H2><A NAME="s14">14. Variabili Statiche</A></H2> <H2><A NAME="ss14.1">14.1 Introduzione</A> </H2> <P>Linux e' scritto in linguaggio ''C'', e come ogni applicazione usa: <P> <P> <OL> <LI>Variabili Locali</LI> <LI>Variabili di Modulo (all'interno del file sorgente e relative soltanto al modulo)</LI> <LI>Variabili Globali/Statiche presenti soltanto in una copia nell'intero Kernel (la stessa per tutti i moduli) </LI> </OL> <P>Quando una variabile Statica viene modificata da un modulo, tutti gli altri moduli potranno avere a disposizione il nuovo valore. <P> <P>Le variabili Statiche sotto Linux sono molto importanti, perche' rappresentano l'unico metodo per aggiungere nuove funzionalita' al Kernel: tipicamente puntano alla testa di liste dove sono memorizzati elementi ''registrati'', che possono essere: <P> <P> <UL> <LI>aggiunti</LI> <LI>cancellati</LI> <LI>anche modificati </LI> </UL> <P> <PRE> _______ _______ _______ Variabile Globale ------> |Item(1)| -> |Item(2)| -> |Item(3)| .. |_______| |_______| |_______| </PRE> <H2><A NAME="ss14.2">14.2 Variabili principali</A> </H2> <H3>Current</H3> <P> <PRE> __________________ Current ----------------> | Processo attuale | |__________________| </PRE> <P>Current punta alla struttura ''task_struct'', che contiene tutte le informazioni relative ad un Processo: <P> <P> <UL> <LI>pid, nome, stato, contatori, politica di scheduling</LI> <LI>puntatori ad altre strutture dati come: files, vfs, altri processes, signals... </LI> </UL> <P>Current non e' una vera variabile, piuttosto una macro: <P> <P> <PRE> static inline struct task_struct * get_current(void) { struct task_struct *current; __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL)); return current; } #define current get_current() </PRE> <P>Le linee sopra prendono il valore di ''ESP'' (stack pointer) e lo rendono disponibile come una variabile, che poi verra' usata per puntare ad una struttura task_struct. <P> <P>Dall'elemento ''current'' possiamo accedere quindi direttamente ad ogni struttura dati Kernel del processo (ready, stopped o in qualunque altro stato), ad esempio possiamo cambiargli lo stato (come fa ad esempio un driver di I/O), il PID, la presenza o meno nella Ready List o nella Blocked List, ecc. <P> <H3>FileSystem Registrati</H3> <P> <PRE> ______ _______ ______ file_systems ------> | ext2 | -> | msdos | -> | ntfs | [fs/super.c] |______| |_______| |______| </PRE> <P>Quando digitiamo il comando ''modprobe some_fs'' verra' aggiunta una nuova entry alla lista dei file systems, mentre con il comando ''rmmod'' la andremo a rimuovere. <P> <H3>FileSystem ''montati''</H3> <P> <PRE> ______ _______ ______ mount_hash_table ---->| / | -> | /usr | -> | /var | [fs/namespace.c] |______| |_______| |______| </PRE> <P>Il comando ''mount'' permette di aggiungere un file system alla lista dei fs gia' montati nel sistema, mentre la umount cancella la relativa voce. <P> <H3>Network Packet Type ''Registrati''</H3> <P> <PRE> ______ _______ ______ ptype_all ------>| ip | -> | x25 | -> | ipv6 | [net/core/dev.c] |______| |_______| |______| </PRE> <P>Ad esempio, se si vuole aggiungere l'IPv6 (caricando il modulo relativo) sara' necessario inserire la voce del Network Packet Type nella lista. <P> <H3>Network Internet Protocol Registrati</H3> <P> <PRE> ______ _______ _______ inet_protocol_base ----->| icmp | -> | tcp | -> | udp | [net/ipv4/protocol.c] |______| |_______| |_______| </PRE> <P>Ogni Network Packet Type puo' avere all'interno una serie di protocolli che si possono aggiungere alla lista (come IPv6 che ha i protocolli TCPv6). <P> <P> <PRE> ______ _______ _______ inet6_protos ----------->|icmpv6| -> | tcpv6 | -> | udpv6 | [net/ipv6/protocol.c] |______| |_______| |_______| </PRE> <H3>Network Device registrati </H3> <P> <PRE> ______ _______ _______ dev_base --------------->| lo | -> | eth0 | -> | ppp0 | [drivers/core/Space.c] |______| |_______| |_______| </PRE> <H3>Char Device Registrati </H3> <P> <PRE> ______ _______ ________ chrdevs ---------------->| lp | -> | keyb | -> | serial | [fs/devices.c] |______| |_______| |________| </PRE> <P>''chrdevs'' non e' in realta' un vero puntatore ad una lista, piuttosto un vettore standard. <P> <H3>Block Device Registrati</H3> <P> <PRE> ______ ______ ________ bdev_hashtable --------->| fd | -> | hd | -> | scsi | [fs/block_dev.c] |______| |______| |________| </PRE> <P>''bdev_hashtable'' e' un vettore di hash <P> <HR> <A HREF="KernelAnalysis-HOWTO-15.html">Next</A> <A HREF="KernelAnalysis-HOWTO-13.html">Previous</A> <A HREF="KernelAnalysis-HOWTO.html#toc14">Contents</A> </BODY> </HTML>