Sophie

Sophie

distrib > Mandriva > 9.1 > i586 > by-pkgid > f1098342ec4a2b28475e34123ce17201 > files > 525

howto-html-it-9.1-0.5mdk.noarch.rpm

<!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">Avanti</A>
<A HREF="KernelAnalysis-HOWTO-13.html">Indietro</A>
<A HREF="KernelAnalysis-HOWTO.html#toc14">Indice</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>
<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>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>
<UL>
<LI>aggiunti</LI>
<LI>cancellati</LI>
<LI>anche modificati</LI>
</UL>
<P>
<PRE>
                           _______      _______      _______
Variabile Globale ------&gt; |Item(1)| -&gt; |Item(2)| -&gt; |Item(3)|  ..
                          |_______|    |_______|    |_______|
</PRE>
<H2><A NAME="ss14.2">14.2 Variabili principali</A>
</H2>

<H3>Current</H3>

<P>
<PRE>
                           __________________
Current ----------------&gt; | Processo attuale |
                          |__________________|
</PRE>
<P>Current punta alla struttura ''task_struct'', che contiene tutte le informazioni
relative ad un Processo:
<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>
<PRE>
static inline struct task_struct * get_current(void) { 
   struct task_struct *current; 
   __asm__(&quot;andl %%esp,%0; &quot;:&quot;=r&quot; (current) : &quot;0&quot; (~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>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.
<H3>FileSystem Registrati</H3>

<P>
<PRE>
                       ______      _______      ______
file_systems  ------&gt; | ext2 | -&gt; | msdos | -&gt; | 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.
<H3>FileSystem ''montati''</H3>

<P>
<PRE>
                        ______      _______      ______
mount_hash_table  ----&gt;|   /  | -&gt; | /usr  | -&gt; | /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.
<H3>Network Packet Type ''Registrati''</H3>

<P>
<PRE>
                        ______      _______      ______ 
     ptype_all  ------&gt;|  ip  | -&gt; |  x25  | -&gt; | 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.
<H3>Network Internet Protocol Registrati</H3>

<P>
<PRE>
                          ______      _______      _______ 
inet_protocol_base -----&gt;| icmp | -&gt; |  tcp  | -&gt; |  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>
<PRE>
                          ______      _______      _______ 
inet6_protos -----------&gt;|icmpv6| -&gt; | tcpv6 | -&gt; | udpv6 |
[net/ipv6/protocol.c]    |______|    |_______|    |_______|
</PRE>
<H3>Network Device registrati </H3>

<P>
<PRE>
                          ______      _______      _______ 
dev_base ---------------&gt;|  lo  | -&gt; |  eth0 | -&gt; |  ppp0 |
[drivers/core/Space.c]   |______|    |_______|    |_______|
</PRE>
<H3>Char Device Registrati </H3>

<P>
<PRE>
                          ______      _______      ________ 
chrdevs ----------------&gt;|  lp  | -&gt; | keyb  | -&gt; | serial |
[fs/devices.c]           |______|    |_______|    |________|
</PRE>
<P>''chrdevs'' non e' in realta' un vero puntatore ad una lista, piuttosto
un vettore standard.
<H3>Block Device Registrati</H3>

<P>
<PRE>
                          ______      ______      ________ 
bdev_hashtable ---------&gt;|  fd  | -&gt; |  hd  | -&gt; |  scsi  |
[fs/block_dev.c]         |______|    |______|    |________|
</PRE>
<P>''bdev_hashtable'' e' un vettore di hash
<HR>
<A HREF="KernelAnalysis-HOWTO-15.html">Avanti</A>
<A HREF="KernelAnalysis-HOWTO-13.html">Indietro</A>
<A HREF="KernelAnalysis-HOWTO.html#toc14">Indice</A>
</BODY>
</HTML>