Well, this is getting a bit technical, but I thought I'd just throw in my knowledge about memory, too:
1) Each running process can access up to ~3GB Virtual Addresses - these addresses are mapped by the OS to Physical Memory.
2) The upper 1GB of the 32-bit address space is reserved for kernel level drivers and also inter-process shared memory for DLL's.
So, you can use ~3GB of memory in a 32-bit application, while the remaining 1GB is used by the system for Shared Memory and drivers.
To access GPU memory, you need to request the OS to remap some part of the GPU Memory to that upper 1GB. When you're done writing data to GPU Memory, you will tell the OS that it can unmap that region when needed.
In pseudocode:
Code:
gpuhandle->Map(...);
memcpy(gpuhandle->data, someData, size); // copy someData to GPU memory
gpuhandle->Unmap();
So to sum up, you can't physically allocate more than ~3GB of memory in a 32-bit application. Although one can use clever tricks to temporarily offload data to disk or avoid keeping a copy of data in both system RAM and graphics RAM.