<< Do you have a link that explains how it's used then, >>
All right, now you've made me get off my ass and actually go look. I'm thumbing through ye old Intel Architecture Software Developer's Manual Volume 1 - Basic Architecture and this is what it says in essense.
The P6 and above have 36bit addressing but it is not flat. Only 32bit at a time can be flat as one would expect. But the deal is, memory can be broken up into 16383 different pages. The location of these pages is set by software (usually OS). The thing is, the processor can't handle addresses bigger than 32bit dirrectly so it divides memory up into pages. You can set which page you are on by setting the page registers and then you can read data from that page. If you want to read data from a different page, then you have to first change to that other page.
If you only want to use flat addressing, then you just set the page registers to all point at the start of main memory and then never change pages again.
If you had 8GB of memory on your machine, the program can set one page register to point to the first 4GB and when it needed some data from the upper 4GB, it would have to change the value in the page resigster to point to the upper 4GB.
There are actually 6 page registers and they are 16bit registers. The memory pages can overlap and they page can be of various sizes up to 4GB.
The 6 registers are:
CS = code segment
SS = stack segment
DS = data segment
ES = data segment
FS = data segment
GS = data segment
So the technique is essentially the same as in the old XT/AT days except with bigger pages.
Back in the DOS days, programs had Far pointers and Near pointers. But now with Linux and Windows programming, I've never seen any such Far pointers. I wonder if programs can even directly use more than 4GB in these systems?