The amount of misinformation in the first couple of pages has led me to believe a lot of what remains is going to follow suit.
Here's the skinny on memory address range limitations regardless of operating system (with some Windows specific notes, since that's the topic at hand):
1.) 32-bit memory address ranges are limited to what is referred to as the "3GB Barrier" this is a pseudo-barrier of 32-bit memory address range limitations, and actually varies generally from 2.75GB to 3.5GB in size, depending on the total size of other memory ranges [most commonly, it is reduced from 3.75gb to much lower because of GPU memory). In Windows XP this issue is compounded due to the use of a "paged pool" of memory which isn't seen to other applications ever (it's not available for allocation, so its never listed as such, its reserved for the kernel to work with paging, it is exactly 384mb in size.)
2.) In addition to the above kernel limitations, there is another limitation that is directly imposed upon applications: Each application is allowed to allocate up to 2GB of user space memory, unless the IMAGE_FILE_LARGE_ADDRESS_AWARE ("LAA") flag is set, which is commonly hacked onto games to prevent them from crashing with extensive modifications (Skyrim, for example). Note that this limitation is per-thread and also applies to graphics card memory. Also note that while it is a per-thread limitation, each "image" can only hold 3GB of memory using LAA, or 2GB without. This gets confusing to explain, because I don't really understand where you are able to use additional memory on the GPU and where you run into the wall again.
3.) The above limitations presume that something called Physical Address Extension (PAE for short) is not present. In both Windows XP land and Linux, Unix, BSD land - Physical Address Extension IS technically supported. With a PAE enabled kernel (Windows XP had a PAE kernel originally on the Professional edition, but this was scrapped and saved for Windows Server 2003, which is just Windows XP at its core) the memory address range limitation is lifted 64GB. This does NOT directly affect the image limitations imposed by a 32-bit operating space, however using LAA, and PAE in conjunction with multiple threads attached to a single memory management thread applications were able to allocate many times the original limitations. PAE's extended memory ranges are achieved effectively by the kernel managing multiple separate memory ranges in parallel, each one being 4GB in size. That's an overly simplified way of looking at it, but its good for explination purposes.
So on to the question at hand:
2 ^ 32 = 4,294,967,296 = exactly 4GB.
So in Windows XP:
4,294,967,296 - 402,653,184 (384mb) = 3,892,314,112 (3.625GB of allocatable memory for applications)
3,892,314,112 - 536,870,912 (512mb, typical vram at the time) = 3,355,443,200 (3200mb / 3.2gb of ram) <-- That magical "3gb limit" rears its ugly head.
Things like sound controller memory and such also detract from the value, even chipset memory and other small memory patches bring that number lower.
Syrillian: Man, Legend, Meme.