Linux e' scritto in linguaggio ''C'', e come ogni applicazione usa:
Quando una variabile Statica viene modificata da un modulo, tutti gli altri moduli potranno avere a disposizione il nuovo valore.
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:
_______ _______ _______ Variabile Globale ------> |Item(1)| -> |Item(2)| -> |Item(3)| .. |_______| |_______| |_______|
__________________ Current ----------------> | Processo attuale | |__________________|
Current punta alla struttura ''task_struct'', che contiene tutte le informazioni relative ad un Processo:
Current non e' una vera variabile, piuttosto una macro:
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()
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.
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.
______ _______ ______ file_systems ------> | ext2 | -> | msdos | -> | ntfs | [fs/super.c] |______| |_______| |______|
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.
______ _______ ______ mount_hash_table ---->| / | -> | /usr | -> | /var | [fs/namespace.c] |______| |_______| |______|
Il comando ''mount'' permette di aggiungere un file system alla lista dei fs gia' montati nel sistema, mentre la umount cancella la relativa voce.
______ _______ ______ ptype_all ------>| ip | -> | x25 | -> | ipv6 | [net/core/dev.c] |______| |_______| |______|
Ad esempio, se si vuole aggiungere l'IPv6 (caricando il modulo relativo) sara' necessario inserire la voce del Network Packet Type nella lista.
______ _______ _______ inet_protocol_base ----->| icmp | -> | tcp | -> | udp | [net/ipv4/protocol.c] |______| |_______| |_______|
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).
______ _______ _______ inet6_protos ----------->|icmpv6| -> | tcpv6 | -> | udpv6 | [net/ipv6/protocol.c] |______| |_______| |_______|
______ _______ _______ dev_base --------------->| lo | -> | eth0 | -> | ppp0 | [drivers/core/Space.c] |______| |_______| |_______|
______ _______ ________ chrdevs ---------------->| lp | -> | keyb | -> | serial | [fs/devices.c] |______| |_______| |________|
''chrdevs'' non e' in realta' un vero puntatore ad una lista, piuttosto un vettore standard.
______ ______ ________ bdev_hashtable --------->| fd | -> | hd | -> | scsi | [fs/block_dev.c] |______| |______| |________|
''bdev_hashtable'' e' un vettore di hash