j3pflynn, the OS doesn't actually 'move' out of the way. It sets up a virtual address that is a 32-bit selector* with a 32-bit offset of 0x0. OS calls are made to a different selector which can be anywhere in memory, outside the application's area. These are resolved by tables set up for the hardware by the OS.
*32-bit selector refers to the amount of memory the selector actually can address. The selector itself is a 16-bit value (with some lower bits carrying type information, they are masked off), which is the offset into the descriptor table pointing to the actual physical memory location.
Off the top of my head, I am not sure of the size of an entry in a 64-bit descriptor table. Let me see if I can look this up quickly ... well, getting the answer will take a little time. Point is this: I recall that the x86-32 descriptor table entry is 16 bytes long. That means that a 16-bit offset can contain up to 2^^16 / 16 = 4096 entries. With each entry addressing a 32-bit address space, that gives this scheme the ability to address an astounding 17,592,186,044,416 bytes!
Now, much of this space is imaginary because desktops and servers don't have 17.6 trillion bytes of memory. It does, however, give the OS lots of places (virtual addresses) to hide which are out of the way of the application's address space!
(If I come across the x86-64 numbers today, I will update this example for AMD's architecture.)