In my opinion there is another little known fact about the 2GB boundary. Many applications typically work with lots of pointer arithmetic (especially applications written in C, C++, ...). In these applications it is quite common to add offsets to pointers, or even to subtract pointers.
If your available virtual address space is 2GB, you are guaranteed that subtracting two pointers is always between -2147483647 and +2147483648 (these are the limits for 32-bit signed values).
If your address space would be 3GB, the possible difference would be bigger than any value that can be represented in a 32-bit signed value.
If you know that your application is safe, and not subtracting totally unrelated pointers (and your arrays are less than 2GB!), you can tell Windows that your application can work with an address space larger than 2GB, by setting the linker flag LARGEADDRESSAWARE (or set this with the EDITBIN utility).
With XP (not quite sure about Vista and W7) you can boot into a mode where the 'kernel space' is only 1GB, and 3GB in the virtual address space is left for the application. If your application is LARGEADDRESSAWARE, you get the full 3GB. If not, you only get 2GB.
On 64-bit Windows, LARGEADDRESSAWARE 32-bit applications even get 4GB, since Windows does not need substantial address space in the 32-bit area (after all, it's a 64-bit OS).