Hi Frank, are you sure that's the case? I'm not intimate with Windows memory menagement but my understanding was total memory avaliable to all applications would be physical limit we are talking about (2.xGiB - 3.xGiB depending on range of addresess mapped to devices). Memory manager should be able to divide left free memory to all processes during paging translation?. 3GB switch rather allows application to use part of virtual address range normally reserved for kernel....
Oh well i'm lost again....
With the original win32 extender (Windows 3.x), 4 GB was seen as a HUGE amount of memory, going from less than one megabyte. 4 MB was very much at that time. Remember Bill Gates stating that "640 kilobytes of memory is enough for everyone"? And, as they neededed kernel and I/O address ranges, at a time where 32 bit integers (2 GB max) were seen as the end-all fix-all data type, and the 64 kilobyte segment limit was still fully in charge, it didn't seem to pose any upper limit when they simply split that 4 GB in half and allocated a part to user and kernel space. "NOBODY will EVER have SO much memory!", was the idea at that time. They were only defining it to see what they had to do to support that huge virtual memory range.
Well, things changed. But the memory model didn't. So, now we're back to the extended and expanded memory days, only now they're called PAE or PSE. ANd instead of 640 kB of program-useable memory and 384 kB of system meomory, we have 2 GB of both.
But, that 2 GB of system memory isn't needed in most cases. It can be decreased to 1 GB, with the /3GB boot parameter. But, most programs and drivers are written and compiled while assuming they can never access more than 2 GB in any case. Which means, that they can use 32-bit integers for everything. Which is what most developers did and do.
Unfortunately, going beyond 2 GB requires not only a different way to compile your program, but also the use of unsigned 32 bit integers instead of regular ones (quite a difference) to address memory locations.
And, if you want to use PAE or PSE, you're back to the very start: instead of small, compact, medium, large and huge memory models, you now have integer, long, paging, extended and lineair models again. Which will be very recognizable to all the developers who ever used the first win32 model.
In short: we hit the limits again, and we came up with the same work arounds. But there is no silver bullet, and all the bits and pieces will use their own subset. This will go on until everyone and everything has migrated to a flat, 64 bit adress space.
And in about 10 years from now, the same thing will happen yet again.