The Following is from John Reisner and the USENET group comp.os.linux.development.system dated March 3, 2008.
> I believed that, using a 32 bits OS, I could use as far as 4 Gbytes.
There must be communication between the user space and the kernel space,
and most applications favor fast communication over any other choice.
The fastest communication requires that the kernel and the user share
a single 4GB address space. The style of sharing is chosen by compile-
time parameters of the Linux kernel itself. The most common choice is
3GB user and 1GB kernel, although some servers having much RAM, and running
many hundreds of simultaneous small- and medium-sized processes, choose 2GB
user and 2GB kernel. The kernel must use its space to keep track of physical
RAM; 12GB of RAM requires lots of space for bookkeeping (3M entries
to track the pages of 4KB, etc.)
In the last few years there has been a "4G/4G" option which allows
something like (4GB - 16MB) of user space and (4GB - 16MB) of kernel space,
but it slows down system calls. Depending on load, the slowdown is often
10% to 25%. Most users who say that they want a full 4GB of user space
have been unwilling to pay that much in speed, and the 4G/4G split
is not used often.
Anyone who is really serious about processes running with more than
about 2.8GB of address space should use a 64-bit machine such as x86_64.
If you absolutely must use every last byte of address space on a 32-bit
machine, then you must pay close attention to fragmentation of the address
space. Consult /proc/<pid>/maps to see what happening, and
http://BitWagon.com/tub/tub.html for how to control it.
So! Ultimately the about of memory depends on how your kernel was compiled.