Em um kernel de 64 bits, você já tem 4G completo acessível por um programa de espaço do usuário de 32 bits. Veja a si mesmo digitando o seguinte no terminal (ATENÇÃO: seu sistema pode parar de responder se não tiver 4GiB de RAM livre ao executar isto):
cd /tmp
cat > test.c <<"EOF"
#include <stdlib.h>
#include <stdio.h>
int main()
{
size_t allocated=0;
while(1)
{
const size_t chunkSize=4096;
char* p=malloc(chunkSize);
if(!p) return 0;
*p=1;
allocated+=chunkSize;
printf("%zu\n",allocated);
}
return 0;
}
EOF
gcc test.c -o test -m32 && ./test | tail -n1
No meu kernel x86_64 3.12.18 eu recebo 4282097664
como resultado, que é cerca de 4GiB-12.3MiB, então é justo considerar a divisão 4G / xG alcançada.