Cet article regroupe pas mal d’infos que j’ai pu récupérer de ci de là, autour de la mémoire en général (morte, vive, cache ...)
Disque dur
Un disque dur est la superposition de plusieurs surfaces magnétiques circulaires :

Chaque "disque" est découpé en plusieurs "pistes" (découpage circulaire) et en plusieurs secteurs géométriques (découpage longitudinal).
L’intersection d’un secteur géométrique et d’une piste d’un disque est appelé "secteur". C’est la plus petite quantité de donnée gérable au niveau physique (contrainte du disque dur).
La superposition des pistes des disques qui sont au même rayon est appelé un "cylindre". Un cylindre n’a donc vraiment pas d’existence physique.
Inspecter son disque dur
# fdisk -l
Disk /dev/sda: 40.0 GB, 40007761920 bytes
255 heads, 63 sectors/track, 4864 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xeede9d79
Device Boot Start End Blocks Id System
/dev/sda1 1 62 497983+ 83 Linux
/dev/sda2 63 184 979965 82 Linux swap / Solaris
/dev/sda3 185 4864 37592100 8e Linux LVM
Cette commande nous informe que l’on a 255 "heads", donc 255 têtes de lectures, une pour chaque surface magnétique circulaire. Chacune de ces surface est découpée en 4864 pistes ("track", découpage circulaire) et 63 secteurs géométriques ("sectors", découpage longitudinal).
A partir de là, calculons le nombre de secteur total. Pour chaque surface, on a : 4864 x 63 = 306432 secteurs. Pour l’ensemble du disque dur on a : 306432 x 255 = 78140160 secteurs sur le disque dur.
On retrouve la taille des secteurs en faisant : 40007761920 / 78140160 = 512 octets.
Système de fichier
Les Blocs
D’après l’article de Wikipedia sur les Blocs mémoire, la taille des blocs en ext3 est toujours de 1Ko.
Le bloc est la plus petite unité de stockage d’un système de fichiers (utilisé sur une partition d’un disque dur) d’un système informatique. Le choix de la taille de bloc est effectué lors du formatage du disque, et influe sur les performances et sur la capacité utile du disque.
On va utiliser le petit outil "dumpe2fs" pour retrouver la taille des blocks :
# dumpe2fs /dev/sda1 | grep "Block size"
dumpe2fs 1.40.6 (09-Feb-2008)
Block size: 1024
Un bloc fait donc 2 secteurs (2 x 512 octets).
Inode ("Index NODE")
Chaque fichier possède son propre inode, identifié par son numéro d’inode unique pour un périphérique donné. Les inodes sont regroupés dans la table d’inodes. Chaque inode possède les méta informations sur le fichier qu’il représente (droits, propriétaire, dates, adresse mémoire ...). C’est l’équivalent des "clusters" dans les systèmes de fichier type DOS.
Note : comment connaître le numéro d’inode d’un fichier ? :
% touch test_inode
% ls -i test_inode
120302 test_inode
RAM - Random Memory Access
Pour connaître la quantité de RAM disponible :
% cat /proc/meminfo
MemTotal: 1028008 kB
MemFree: 16836 kB
Buffers: 202360 kB
Cached: 259172 kB
SwapCached: 0 kB
La valeur de MemTotal est la quantité de mémoire utilisable par le système, sans le noyau. Cette valeur n’est pas fixe, et ne correspond donc pas exactement à la taille de vos barrettes de RAM. Pour s’en convaincre, redémarrez en mode "single user" et constatez :
% cat /proc/meminfo
MemTotal: 1028156 kB
Pour avoir les détails hardware de votre RAM, utilisez le paquet ’lshw’ :
% lshw
(...)
*-memory
description: System Memory
physical id: 1000
slot: System board or motherboard
size: 1GiB
*-bank:0
description: DIMM DDR Synchronous 533 MHz (1.9 ns)
vendor: CE00000000000000
physical id: 0
serial: 50079321
slot: DIMM_A
size: 512MiB
width: 64 bits
clock: 533MHz (1.9ns)
*-bank:1
description: DIMM DDR Synchronous 533 MHz (1.9 ns)
vendor: CE00000000000000
physical id: 1
serial: 50069310
slot: DIMM_B
size: 512MiB
width: 64 bits
clock: 533MHz (1.9ns)
Ici il y a 2 barrettes de RAM d’une capacité de 512Mo (DDR 533).
Notez que vous pouvez accéder directement au contenu de la RAM via le fichier /proc/kcore :
# hexdump -C -n 256 kcore
00000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 04 00 03 00 01 00 00 00 00 00 00 00 34 00 00 00 |............4...|
00000020 00 00 00 00 00 00 00 00 34 00 20 00 03 00 00 00 |........4. .....|
00000030 00 00 00 00 04 00 00 00 94 00 00 00 00 00 00 00 |................|
00000040 00 00 00 00 28 07 00 00 00 00 00 00 00 00 00 00 |....(...........|
00000050 00 00 00 00 01 00 00 00 00 10 80 38 00 00 80 f8 |...........8....|
00000060 00 00 00 00 00 e0 ff 06 00 e0 ff 06 07 00 00 00 |................|
00000070 00 10 00 00 01 00 00 00 00 10 00 00 00 00 00 c0 |................|
00000080 00 00 00 00 00 00 00 38 00 00 00 38 07 00 00 00 |.......8...8....|
00000090 00 10 00 00 05 00 00 00 90 00 00 00 01 00 00 00 |................|
000000a0 43 4f 52 45 00 00 00 00 00 00 00 00 00 00 00 00 |CORE............|
000000b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000100
le SWAP
Linux offre la possibilité d’étendre sa mémoire vive en utilisant une partie du disque dur appelé "swap".
C’est une sorte d’"extension" de la mémoire RAM sur disque dur. Le système va utiliser le swap lorsque la RAM est pleine, et écrire dessus à intervalles réguliers relativement espacés car le temps d’accès au disque dur est énormément plus long que celui de la RAM.
# free
total used free shared buffers cached
Mem: 1028008 891804 136204 0 28552 171988
-/+ buffers/cache: 691264 336744
Swap: 979956 217804 762152
un "fdisk -l" donne :
Device Boot Start End Blocks Id System
/dev/sda1 1 62 497983+ 83 Linux
/dev/sda2 63 184 979965 82 Linux swap / Solaris
/dev/sda3 185 4864 37592100 8e Linux LVM
et un swapon -s :
# swapon -s
Filename Type Size Used Priority
/dev/sda2 partition 979956 331208 -1
fdisk nous donne une partition swap de 979965 x 1024 = 1003484160. free et swapon nous donnent une mémoire swap de 979956 x 1024 = 1003474944.
Il y a donc 9216 octets de différence, soit exactement 9Mo (sur une machine de 1Go de swap). Sur une autre machine, la différence est exactement de 10Mo (avec 2Go de swap). Je suppose que cette espace est dédié à la gestion du système de fichier, mais je n’ai pas trouvé de documentation à ce sujet sur le net :x...
Les swap se font à certains intervalles de temps pour ne pas trop ralentir le système. Cet intervalle est indiqué :
# cat /proc/sys/vm/swappiness
60
Mémoire Virtuelle
La mémoire virtuelle est le nom donné à la RAM et au SWAP :
VIRT = SWAP + RAM
iomem
Le fichier "/proc/iomem" renseigne le mapping entre les espaces adressables du système (CPU, carte mère, ...) et les ressources physiques correspondantes :
% cat /proc/iomem
00000000-0009efff : System RAM
0009f000-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
000cf800-000cffff : Adapter ROM
000f0000-000fffff : System ROM
00100000-3f7d17ff : System RAM
00100000-002be914 : Kernel code
002be915-00371383 : Kernel data
003b5000-003f947f : Kernel bss
3f7d1800-3fffffff : reserved
50000000-53ffffff : PCI CardBus #04
(...)
On peut retrouver ces adresses si vous désassemblez un binaire. Ici j’utilise un programme C compilé :
% gdb ./test
GNU gdb 6.7.1-debian
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/i686/cmov/libthread_db.so.1".
(gdb) disas main
Dump of assembler code for function main:
0x080483ea <main+0>: lea 0x4(%esp),%ecx
0x080483ee <main+4>: and $0xfffffff0,%esp
0x080483f1 <main+7>: pushl -0x4(%ecx)
(...)
On constate que les adresses des instructions 0x080483ea 0x080483f1 0x080483ee ... sont bien dans la mémoire RAM "00100000-3f7d17ff : System RAM".
Utilisation mémoire des processus
La commande ’top’
Elle affiche : la mémoire RAM utilisé en pourcentage %MEM et en octets RES ; la mémoire virtuelle VIRT ; la mémoire utilisé pour le code du processus CODE et ses données DATA ; sa mémoire partagée SHR...
Pour trier ces information, on utilisera la touche ’f’ pour sélectionner les champs affichés, puis les touches ’<’ et ’>’ pour changer les colonnes triées.
Exemple de tri par par mémoire VIRTuelle :
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4521 benji 20 0 397m 198m 21m R 15.6 19.7 26:07.26 firefox-bin
3194 root 20 0 379m 46m 5396 S 4.0 4.7 11:47.93 Xorg
7618 benji 20 0 129m 33m 12m S 0.0 3.3 0:13.82 evolution
Pour fini, on peut visualiser l’arborescence des processus avec la command ’pstree’ :
# pstree -h -p -u -A -U
init(1)─┬─acpid(2305)
├─apache2(3340)─┬─apache2(3379,www-data)
│ ├─apache2(3381,www-data)
│ ├─apache2(3382,www-data)
│ ├─apache2(3383,www-data)
│ └─apache2(3384,www-data)
├─arpwatch(3252,arpwatch)
├─atop(2321)
├─avahi-daemon(3115,avahi)───avahi-daemon(3116)
├─avahi-dnsconfd(3127)
├─bonobo-activati(4354,benji)───{bonobo-activati}(4355)
├─cron(3294)
├─cupsd(2341)
├─dbus-daemon(2085,messagebus)
├─dbus-daemon(4333,benji)
├─dbus-launch(4332,benji)
├─dhcdbd(3134)
├─dhclient3(1806)
├─drivemount_appl(4412,benji)
├─evolution(7618,benji)─┬─camel-lock-help(20094)
│ ├─spamd(11114)───spamd(11146)
│ ├─{evolution}(7627)
│ ├─{evolution}(7628)
│ ├─{evolution}(7631)
│ ├─{evolution}(7632)
│ ├─{evolution}(7633)
│ ├─{evolution}(7638)
│ ├─{evolution}(7663)
│ └─{evolution}(7668)
├─evolution-alarm(5076,benji)─┬─{evolution-alarm}(5077)
│ └─{evolution-alarm}(5090)
├─evolution-data-(5033,benji)─┬─{evolution-data-}(5034)
│ └─{evolution-data-}(5084)
├─exim4(2624,Debian-exim)
├─famd(3066)
├─festival(2639,festival)
├─firefox-bin(4521,benji)─┬─{firefox-bin}(4522)
│ ├─{firefox-bin}(4523)
│ ├─{firefox-bin}(4541)