Link alla versione in pdf (sempre aggiornata)
Abstract
In questo articolo mi propongo di spiegare perché utilizzando un sistema operativo a 32 bit su una macchina x86 con 4 o più GiB di RAM ne vengono rilevati di meno (solitamente un po' più di 3, ma in alcuni casi anche meno).
L'idea di scrivere questo articolo nasce dal fatto che c'è molta confusione sull'argomento, complice anche il fatto che non pochi fattori entrano in gioco nella questione. Molto spesso sui forum a domande su questo problema vengono date risposte errate, incomplete o fuorvianti (io stesso prima di informarmi accuratamente e scrivere questo articolo ho fornito risposte inesatte a proposito).
Nell'articolo fornisco subito la soluzione per chi non avesse la voglia o le competenze necessarie per leggere le motivazioni del problema (paragrafo La soluzione), per poi proseguire con una trattazione esaustiva sulla causa del problema, sul funzionamento dei metodi per aggirarlo e su alcuni miti che circolano a riguardo (paragrafo La causa del problema e il funzionamento del PAE).
La trattazione si riferisce, come già detto, a CPU x86 (IA32) e x86-64 (AMD64); per quanto riguarda il sistema operativo faccio riferimento soprattutto a Windows 2000 e successivi e di tanto in tanto a Linux (kernel 2.6).

La soluzione
Se la macchina è dotata di processore a 64 bit (AMD64) la scelta migliore è installare un sistema operativo a 64 bit, in grado di supportare tutta la memoria installata senza bisogno di trucchi strani; in alternativa è necessario attivare il PAE, come indicato di seguito.

Sotto Windows
È importante notare che il supporto di Windows per il PAE è disponibile su Windows 2000 Advanced Server e Datacenter Server e su tutte le versioni di Windows successive, ma consente di supportare tutti e i 4 GiB di RAM solo su Windows Server 2003 nelle versioni superiori alla standard e su Windows Server 2008 Enterprise e Datacenter edition (le motivazioni di questo sono affrontate in seguito, nella sezione Le limitazioni di Windows).
Per attivare il PAE su sistemi pre-Windows Vista bisogna aprire il file boot.ini (situato solitamente nella cartella radice del drive in cui è installato il sistema operativo) e aggiungere in coda all'opzione relativa al sistema operativo su cui intendiamo agire l'opzione /PAE. Ad esempio se il file parte così:
codice:
[boot loader] 
timeout=30 
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS 
[operating systems] 
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003 per Small Business Server" /noexecute=optout /fastdetect
andrà modificato in questa maniera:
codice:
[boot loader] 
timeout=30 
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS 
[operating systems] 
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows Server 2003 per Small Business Server" /noexecute=optout /fastdetect /pae
Importante: prima di effettuare modifiche al file boot.ini effettuatene una copia di backup, in modo da poterla ripristinare da un CD Live di Linux, da BartPE o dalla modalità provvisoria di Windows qualora qualcosa andasse storto.

Da Windows Vista in poi il file boot.ini non viene più utilizzato; per attivare PAE bisogna impartire da un prompt con privilegi elevati il comando
codice:
BCDEDIT /set ForceEnable PAE
Da Windows XP SP2 in poi PAE è attivato di default sui processori che offrono la funzionalità dell'NX bit per supportare DEP (Data Execution Prevention, una funzionalità di sicurezza in grado di bloccare numerosi exploit) ([MSDN3]); in ogni caso, come già detto, su Windows XP e Vista l'abilitazione di PAE non consentirà comunque la risoluzione del problema dei 4 GiB (si veda a questo proposito in seguito il paragrafo Le limitazioni di Windows).
Su Windows Vista dal Service Pack 1 la quantità di memoria RAM segnalata nella maggior parte delle finestre è quella corretta, ma di fatto la quantità utilizzata dal sistema è inferiore, come specificato in [MSKB1]; il problema insomma persiste, ma viene mascherato.
Se, dopo aver attivato PAE, il sistema operativo non si avvia, è sufficiente avviare Windows in modalità provvisoria, annullare le modifiche fatte e riavviare. Per le versioni di Windows anteriori a Vista basta ripristinare boot.ini allo stato precedente, mentre nel caso di Windows Vista e successivi è necessario eseguire da un prompt con privilegi elevati il comando
codice:
BCDEDIT /set ForceDisable PAE
Sotto Linux
Linux include il supporto per PAE dalla versione 2.6 del kernel; molte distribuzioni recenti forniscono di default il kernel con il supporto per PAE attivato. Se così non fosse è necessario recuperare un kernel con il supporto per il PAE incluso, operazione che varia a seconda della distribuzione; come linea guida si tenga conto che spesso i kernel indicati per i server sono dotati di PAE abilitato (come nel caso di Ubuntu, a proposito del quale si veda [GEEKIT1]).
In ogni caso ribadisco che, se il proprio processore è a 64 bit, il passaggio alla versione a 64 bit della propria distribuzione Linux è caldamente consigliato, ormai praticamente tutti i pacchetti a 32 bit sono stati portati a 64 bit (anche se ogni tanto capita di scontrarsi in qualche incompatibilità), e buona parte del software non “impacchettato” è compilabile senza problemi a 64 bit.

La causa del problema e il funzionamento del PAE
Non è strettamente necessario leggere questa sezione, ma chi si interessa al funzionamento interno del PC e ai motivi di quanto esposto sopra la può trovare interessante.

Nota sulle unità di misura: B sta per byte (ossia 8 bit nell'architettura x86), per i multipli utilizzo i prefissi per i multipli binari (KiB, MiB, GiB, eccetera) come specificato dallo standard IEC 60027-2 2ª edizione (per una spiegazione si veda [IEC1]).

32 bit non bastano
I processori x86 a 32 bit indirizzano la memoria con, appunto puntatori a 32 bit. Questo significa che la massima quantità di memoria indirizzabile è 232 B = 4294967296 B = 4 GiB. Apparentemente quindi 4 GiB di RAM dovrebbero essere visibili; perché allora spariscono?
Il punto è che lo spazio d'indirizzi fisico del processore (quello a cui fa riferimento in ultima istanza quando deve accedere a della memoria) non comprende solo la RAM, ma riserva anche un certo spazio per diverse periferiche che richiedono di essere mappate in memoria, ad esempio la scheda video, le periferiche PCI, il BIOS, eccetera. Di conseguenza lo spazio di indirizzi disponibile per la RAM è di 4 GiB a cui va sottratta la parte impiegata per le periferiche, che hanno la precedenza sulla RAM.
In ultima analisi, quindi, la RAM sparita non viene vista perché lo spazio di indirizzi a 32 bit, in parte occupato da indirizzi riferiti a periferiche, non è sufficiente ad indirizzarla tutta.

PAE
Una soluzione a questo problema è stata approntata da Intel sin dai tempi del Pentium Pro (1995) ([WIKI1]) con l'introduzione del PAE (Physical Address Extension). Abilitando la modalità PAE il processore diventa in grado di indirizzare lo spazio di indirizzi fisico utilizzando 36 bit invece dei normali 32 (anche se così facendo introduce una lieve penalizzazione delle prestazioni); questo consente di gestire uno spazio di indirizzi fisico di 236 B = 68719476736 B = 64 GB.
I sistemi che supportano il PAE a livello hardware organizzano lo spazio d'indirizzi fisico in maniera tale da funzionare senza problemi anche senza che il sistema operativo supporti il PAE, piazzando nei primi 4 GiB di spazio d'indirizzi gli indirizzi dedicati alle periferiche e tutta la RAM che riescono a farci stare, e sistemando la RAM che avanza oltre il limite dei 4 GiB, disponibile per i sistemi operativi in grado di fare uso del PAE. Uno schema (ripreso da [ONT2]) può far capire meglio la questione:

Il sistema in questione è equipaggiato con 4 GiB di RAM ed impiega 0,5 GiB di spazio di indirizzi per le periferiche; questi 0,5 GiB sono collocati subito sotto al limite di 4 GiB, e il resto della zona sotto i 4 GiB viene utilizzato per la RAM. Subito sopra dei 4 GiB la zona 0x100000000 - 0x120000000 viene impiegata per i 512 MiB di RAM rimanenti. Un sistema operativo senza supporto per il PAE vedrà le periferiche e i primi 3,5 GiB di RAM, mentre un sistema operativo con supporto per il PAE sarà in grado di vedere l'intero spazio di indirizzi a 36 bit (0x000000000 - 0xFFFFFFFFF), ottenendo così anche la RAM collocata oltre il limite dei 32 bit.
Per informazioni dettagliate sul funzionamento del PAE si veda [INTEL1].

Il ruolo della scheda madre
È possibile che, per quanto il processore supporti il PAE, la scheda madre su cui è montato non lo supporti: diverse schede madri di qualche anno fa montano chipset che non supportano il PAE, o addirittura non impiegano i piedini del processore utilizzati per i 4 bit aggiuntivi necessari per il PAE ([IG1], [ONT2]). In questo caso non c'è nulla da fare, tranne che cambiare PC. Per ulteriori informazioni su incompatibilità PAE-hardware si veda [WHDC2].

Le limitazioni di Windows
Le diverse versioni di Windows che supportano il PAE impongono comunque dei limiti allo spazio d'indirizzi fisico o alla RAM utilizzabile, come riportato nella seguente tabella (da [MSDN2], [WHDC1], [WHDC2]):
codice:
Versione                                               | Limite di RAM (R) o di spazio d'indirizzi (I)
-------------------------------------------------------+-----------------------------------------------
Windows 2000 Advanced Server                           |    8 GiB (R)
Windows 2000 Datacenter Server                         |   32 GiB (R)
Windows XP                                             |    4 GiB (I)
Windows Server 2003 Enterprise Edition                 |   32 GiB (R)
Windows Server 2003 R2 (o SP1) Enterprise Edition      |   64 GiB (R)
Windows Server 2003 Datacenter Edition                 |   64 GiB (R)
Windows Server 2003 Standard Edition                   |    4 GiB (I)
Windows Vista                                          |    4 GiB (I)
Windows Server 2008 Enterprise or Datacenter Edition   |   64 GiB (R)
Windows Server 2008 (altre edizioni)                   |    4 GiB (I)
Perché queste limitazioni? Le ragioni sono sia commerciali che tecniche; nel caso dei sistemi operativi server ovviamente Microsoft vuole incentivare il passaggio alle versioni più “prestigiose” (e costose) sulle macchine dotate di più RAM. Tuttavia in tutti i sistemi in cui la limitazione è ai 4 GiB di spazio d'indirizzi fisico (e non di RAM) questo limite ha anche un motivo tecnico precauzionale: molti driver di schede PCI attualmente in circolazione sono scritti senza tenere in considerazione la possibilità di avere a che fare con uno spazio d'indirizzi fisico di più di 32 bit, per cui, trovandosi di fronte ad indirizzi a 36 bit, è facile che diano problemi ([WHDC1], [WHDC2]).
Di conseguenza in questi casi il PAE, anche se supportato, risulta di fatto inutile per accedere alla RAM aggiuntiva; l'unica soluzione quindi è passare ad un sistema operativo a 64 bit, a meno che non si sia interessati a fornire la RAM oltre i 4 GiB solo ad applicazioni che utilizzano AWE (un sistema di API che consente alle applicazioni di gestirsi autonomamente la memoria fisica, si veda a questo proposito [MSDN4]).