J-Mac: as carol has mentioned, various devices (not just your graphics card) are "memory-mapped" - this means that in order to program the device, you write to special memory regions. When accessing those memory regions, instead of going to/from main memory, it's redirected to the hardware device. Iirc, PCI devices can only be memory mapped in the low 4GB physical address space (but don't hold me up on this). Most modern BIOSes support a memory remap option that will relocate parts of your system memory above the 4GB physical address, so you can have your memory mapped devices, all your RAM, and eat it too. This is possible in 32bit mode ever since the Pentium Pro, which introduced
PAE.
Thing is, 32bit client versions of Windows are limited to 4GB of memory for license reasons. Windows XP RTM supported 4GB of physical memory (you could get your full 4GB of memory using remapping). SP1 changed this to only supporting the low 4GB of the physical address space - there were apparently too many buggy 3rd-party drivers that crashed when handed memory addresses above 4GB. Why?
When doing NT kernel mode programming, one of the data structures you deal with is
PHYSICAL_ADDRESS, which is typedeffed as a
LARGE_INTEGER.
typedef struct _LARGE_INTEGER {
typedef union _LARGE_INTEGER {
struct {
ULONG LowPart;
LONG HighPart;
};
struct {
ULONG LowPart;
LONG HighPart;
} u;
LONGLONG QuadPart;
} LARGE_INTEGER;
The problem is that a bunch of MORONIC, RETARDED, SHOULD-BE-SHOT-ON-SIGHT developers have adopted the idea that "hey, we're on a 32bit OS, we only need to deal with the 32-bit LowPart of that structure". *b00m*, BSODs galore.