For historical purposes memory in x86 machines are addressed by segments
As in u have a segment register and then the actual register to into the offset
A 32 bit register can only address approx 4G memory.
But to address more then 4G memory the segment register (which is 16 bits wide) can be set to what base to use.
And again it depends on how the OS chooses to use the segment registers to address memory (and i have no idea).
To make shit more confusing all the memory is "virtual".
So from a virtual to "real memory" it achieves this by paging. So under any modern os, ur memory is never continuous it just appears that way.
What they author is claiming is that no windows app can address more then 4G memory - the memory mapped video driver memory etc.
That means that while they can execute 64-bit code and handle 64-bit virtual memory, they still can't address more than 4GB of physical RAM, minus roughly 0.75 GB of MMIO, for a grant total of 3.2GB usable RAM. If you install a full 4GB, the portion in conflict with the MMIO will simply not be used. For PC users installing a high end video card with 1GB of VRAM, the additional MMIO becomes an even greater problem: their usable system RAM shrinks by down to around 2.3GB.
I have not poked arround in internals of windows for long time, and in the past that was true.
(Again it can be fixed by how the segment registers address).
But again he is confusing virtual memory with physical memory.
So no application can use more the 4G memory, but on the big picture when it maps from virtual to physical having more physical memory will be benifitial regardless.
But having all the MMIO mapped to the same address space in each program could be more efficient.
Yah it is an issue but the author is nitpicking.
And the real issue is how does the OS handle the virtual memory -> real memory mapping.
(windows who knows, apple who knows).
Added this shit.
Poke arround in here.
http://msdn.microsoft.com/en-us/library/ms679305%28VS.85%29.aspxhttp://msdn.microsoft.com/en-us/library/ms680553(VS.85).aspx ReadProcessMemory Function
where u can read virtual memory per thread.
http://msdn.microsoft.com/en-us/library/ms680348(VS.85).aspxLDT_ENTRY Structure
Describes an entry in the descriptor table. This structure is valid only on x86-based systems.
Go make ur own debugger with those functions.
Then see what is happening in the selector structure in windows.
It is confusing since it seems that different threads seem to be able to have different selectors.
Who the fuck knows

.