In some cases, it is the processor. For example, the old Motorola 68000 used the high bit of the addressing registers as a flag bit, thereby cutting the maximum memory size to 2G. Sometimes, the addressing bus only allows for 31 bits and the high bit line is used for signalling. I don't think Intel does such a thing with their processors. But, I also heard that using memory above 2GB, programs slow down. Maybe, the processor or the OS is doing something special to access this memory. Also, the operating system, system BIOS, and many of the IO addresses are directly memory mapped. (The operating system should load into memory.) Therfore, some of the memory addressing space is used for ROM access and other memory addressing is to the IO channels.