RetiredChief :
Most of you have already said, and correctly so, that winds Xp and Vista 32 bit can except up to 4 Gis memory. But as you also pointed out you "see" less than.
This is a throw back to the "Old" DOS days where you had 640 Megs for programs and a reserved 384 Megs called upper memory.
Memory-Mapped I/O (MMIO), for example (Not limited to) video memory must be mapped within the first 4 Gigs of memory. In systems with less than 4 Gigs of physical memory this MMIO is placed in the virtual memory, But when 4 gigs of physical memory is used, it then must resided in that 4 gigs. (4096 - 384 = 3680 or the 3.6 gigs that is the MAX that is available for programs.
Vista (32 Bit) places a limit on grogram memory at 3.12 Gigs, UNLESS the BIOS support Memory remapping.
Reference usoft.com/kg/929605
Chief, while I ordinarily agree with you, (and your link does not work so I'm speaking from memory of reading through that KB and general concepts), I don't think you are entirely right.
1) You are right that the MMIO and other reasons to reserve the memory address ranges is a holdover from the older times (however, architecturally, it is one of the better ways to handle that and it is really tough to conceive a more viable alternative that makes programming as simple as this method). For the poster that asked to have this explained further, this is how it works in a gist. For certain IO (input / output) operations, an "ease of use" feature was designed that allows the code to just reference a certain memory range, and the system knows that the data written should, in fact, go not in the system memory but to a device. Hence the term memory-mapped-input-output (MMIO). The only problem with that is that the address range that is reserved for this IO should then be unavailable to general programs, because it is now dedicated to the interface with that particular devices (video card, sound card, etc.). This was never really a problem until recently, because...
2) It is a limitation of the x86 architecture and a bit of the Windows design that only a total of 4Gb may be addressed (32bit address space). Until recently this was not an issue at all because system memory of 4 Gb in the desktop space was really unheard of. Now that it's becoming a reality and moving towards the norm, the issue has reared its ugly head.
3) Since you can address a total of 4Gb but some of it has to be reserved for MMIO (and other things similar in concept), that limits the amount of physical memory that is addressable for the purposes of memory access. This is what limits the amount of physical memory shown by the system even though you have more installed. This occurs on the system level.
4) Separate Issue Altogether: Typical application gets a total address space of 4Gb (no matter what amount of physical memory is installed. This is because virtual memory has been a component of the system for a long long long time). To account for the MMIO, etc. needs and other system needs, the "User Space" - that space available for the application to address physical memory, it typically limited to 2Gb (unless the /3Gb switch is used). This occurs on the application level. This presents other problems, again, unrelated to what physical address range in visible to the OS. For more see the Anandtech article quoted above.
5) 64 bit OS allow for a workaround of the first issue. This is where I respectfully disagree with the Chief. You have to have a 64bit OS (not sure if limited to Vista, but let's face it, 64bit XP is worse than Vista). You also need to have the chipset that supports more than 32bit of address space (not all do, even those that support 64-bit processors. Which is ironic). You need the processor that supports 64-bit addressing. And your BIOS needs to support a "memory remapping feature." That feature remaps the address space reserved above the 4Gb line. So then you can actually address all of the 4Gb memory installed (and / or more).
Hope this helps. Please correct any mistakes if you find them.