[CentOS] Re: 32/48-bit virtual addressing in 20/32/36/52-bit physical addressing -- WAS: Memory Models and Multi/Virtual-Cores

Maciej Żenczykowski maze at cela.pl
Wed Jun 29 08:56:25 UTC 2005


> The i386 onward normalizes the 32-bit "physical address" from a 48-bit
> "virtual address" by creating a two's complement from the 16-bit segment
> (bits 20-35) plus the 32-bit offset (bits 0-31).  This 48-bit virtual ->

This was on the i386?  Hell, in real mode the seg reg is still left 
shifted 4 bits (not 20). So it still takes up bits 4-19 with the offset in 
bits 0-31 (which requires fiddling to use anything outside the 0-15). 
This only gives a 32 bit physical address - not a 36 bit physical address. 
And protected mode doesn't help any (page table entries are 22bits (or 32 
with bottom 10 being zero) + 32 bit offset - with wrap - gives 32bits 
only again)

> 32-bit "normalizing" is radically speed up in the i486 TLB over the i386
> (which does not have a TLB).  If the two's complement is greater than
> bit 31 (32-bit), then an overflow, exception, etc... occurs.  There is
> no A36 "hack" like there was for 8086/8088 though.

there were no A32-A35 lines...  and overflows were I believe silently 
ignored (wrapped)

> PAE is mode in the Pentium Pro onward, supported in GTL+, that uses
> the "4-bit overhang" (bits 32-35) of the 16-bit segment register to
> address beyond 4GiB.  This would be, in 8086/8088 terminology, an A32-
> A35 hack.  But can only do so in a way that pages into under 32-bit.
> This is known as PAE36 -- because it is a 36-bit processor address
> extensions (PAE) model, not a linear address access above 32-bit.

ok, this I don't know about, but using the seg register to store addresses 
seems very highly protected mode incompatible...  I would really really 
expect the topmost 4 bits in PAE36 to be taken from a special dedicated 
external lookup table (with 8 7bit entries) which is only available in 
PAE36 procs.  Changing entries in this lookup table (which given a 32bit 
address, would use the top 3 bits to find a 7bit entry to replace the top 
3bits giving a 36bit physical address) would require flushing large parts 
of the cache and would thus cause a performance hit - plus seeing these 
512MB 'pages' would make memory management a pain.

> PAE in x86-64 still uses the 48-bit virtual addressing approach.  The
> name "Long Mode" comes from the fact that instead of creating a two's
> complement of overlapping bits, the 16-bit segment and 32-bit offset are
> connected "Long" MSB of offset against the LSB of the register.  So now
> 48-bit virtual addresses are actually 48-bit wide, not "normalized" to
> 32-bit or, using PAE (36-bit), 36-bit.

Are we sure about this?  x86-64 has 64bit registers - can't it just use 
the lower 48bits of a 64bit reg to store pointers?  Why make life a pain 
with splitting pointers into two pieces?  And how would they in the future 
intend to support full 64bit?

will have to read up on this...

Cheers,
MaZe.



More information about the CentOS mailing list