[TUHS] history of virtual address space

Ron Natalie via TUHS tuhs at tuhs.org
Tue Jan 20 08:46:43 AEST 2026


The original UNIX PDP-11 address space (and this remained constant 
throughout the years) started at location 0 and went up by 64 byte 
chunks.    This was done in seven of the eight segments the PDP-11 
hardware did.   The stack started in the last one and went downward 
(again in 64 byte  chunks) from the top of the 16-bit address space.   
If you were running in 407 mode, it was all the same as far as code and 
data.   All writable.
In 410 mode (pure text), the segments containing the code were write 
protected against the user (this also allowed them to be shared between 
instances of the program and even locked in swap with the sticky bit).   
A 411 (on hardware that supported it) split the code and data segments 
into separate segments.  You couldn’t even access the code as data on 
the user side (thwarting the nargs function).

The kernel ran mostly mapped to physical address.   However, the user 
structure of the current running process was kept in the high segment.

When we went to Vax, pretty much the same idea was kept (programs 
started at location zero and grew up).   Some moron decided not only to 
start at zero, but put a  0 at location 0 which led to lots of latent 
bugs.    Later when we got the Gould SELs in we had page zero unmapped 
to catch null pointer access, but some programs we didn’t have source to 
(notably Oracle) still expected to access *0 with impunity, so we added 
a flag we could poke into the header called “braindead vax compatibility 
  mode” that mapped a zero at zero for these programs.

Things got even stranger when we ported to the HEP which had four kinds 
of memory



More information about the TUHS mailing list