So, I see this question recur again and again on tech sites, and most of the explanations and responses I see make me want to yell at the screen in rage. I wrote this explanation up for another message board but decided not to post it because the comments were so off the mark (e.g. "why doesn't my motherboard have the PAE?") that I'm afraid it wouldn't make any difference. But I thought I'd post it here and maybe we can get a sticky going since it comes up a bunch. Other TR members have also provided detailed info before, but I figured why waste it.
There are really four key points to whether you can "use" 4GB, but the physical addressing one is generally the problem people run into:
* density support
* physical address lines
* physical addressing/e820 map support
* virtual addressing support
The 4GB limitation in virtual addressing has to do with a single application rather than an OS and is a well known issue (you can get around virtual addressing limitations with tricks like Windows's Address Windowing Extensions, but these are ugly and rarely used), so let's not discuss it again. It's not the problem with whether your OS can see xGB of RAM.
Density support is a question of whether the memory controller supports large enough DIMMS/SODIMMS/etc. to actually put 4GB in the system. This is not likely to be an issue these days. The second bullet-point is a physical limitation of some motherboards. Since the Pentium Pro days, most x86 CPUs have had 36-bits of address lines, but sometimes manufacturers leave the top 4 (or more) bits unconnected to save power or money.
The real problem is typically related to addressing of physical memory: if this limitation isn't handled, you still won't be able to use more than 3-3.5GB even on a 64-bit OS. As people are well aware, the 3GB-4GB physical addresses are generally used for memory mapped device addresses (to PCI/AGP/PCI-E devices) and other miscellaneous cruft. So what the system can do is simply remap part of the physical memory from the contiguous range 0-4GB into a split range like 0-3GB, 4GB-5GB, leaving the 3-4GB range to be polluted by device addresses (see the diagram here for a picture). Now for the OS to work with this is must be able to address > 4GB of physical memory. A 64-bit OS can do this, but a 32-bit OS with PAE/PSE-36 can also address >4GB of physical memory. This is where even the long explanation from Dan's Data is wrong (he says, "there is no way to make all of the RAM between 3Gb and 4Gb available without installing a 64-bit OS, which you can't do unless you have a 64-bit CPU" -- and of course, many people have used 32-bit OSs with PAE for years).
Really that's the key: if the system BIOS can only set up the E820 memory map so that physical memory addresses are 0-4GB, you're hosed. If it can set it up in a "split" manner, leaving a hole for the occluded addresses, you're good (as long as you have an OS that can address > 4GB physical addresses -- 64-bit or 32-bit with PAE). Here's an example of the E820 memory map from a system I use:
- Code: Select all
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 0000000000097400 (usable)
BIOS-e820: 0000000000097400 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000c2000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000007ff20000 (usable)
BIOS-e820: 000000007ff20000 - 000000007ff2d000 (ACPI data)
BIOS-e820: 000000007ff2d000 - 000000007ff80000 (ACPI NVS)
BIOS-e820: 000000007ff80000 - 0000000080000000 (reserved)
BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
BIOS-e820: 00000000fec00000 - 00000000fec00400 (reserved)
BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
BIOS-e820: 00000000fff80000 - 0000000100000000 (reserved)
BIOS-e820: 0000000100000000 - 0000000180000000 (usable)
The "usable" ranges are usable physical memory. In this case, we have the first 605K of 1MB, then the range 1MB-2047MB is usable physical memory, then various addresses from 2047MB until 4096MB are reserved for ACPI/PCI/etc. Now, 4096MB-6144MB is the remaining 2GB of memory. So here you've got a big 2GB hole between the physical addresses of your first 2GB and your second 2GB of physical RAM.
So typically you need a chipset supporting this memory "hole"/"hoisting." If your motherboard has that but doesn't actually allow you to enable it, it may be because they didn't bother connecting enough address lines to the memory controller.