[TUHS] history of virtual address space

Paul Winalski via TUHS tuhs at tuhs.org
Wed Jan 21 01:45:15 AEST 2026


On Mon, Jan 19, 2026 at 9:22 PM John Levine via TUHS <tuhs at tuhs.org> wrote:

>
> >Later we got the "kernel is high virtual with bit 31 set" -- when did that
> >first happen?
>
> That's how VAX addressing worked.  User programs were in the low half
> of the address space, the kernel in the high half.
>

It has nothing to do with how the VAX implements virtual addressing per
se.  It's more to do with the way that the various a.out formats for
program images (OMAGIC, NMAGIC, ZMAGIC) all assume that program addressing
starts at 0.  It offers the greatest convenience and flexibility if the
parts of kernel address space that must be mapped into user process address
space are at the high end of the address space, well out of the way of user
code and data.

VAX/VMS had the convention that all addresses with bit 31 on were reserved
to the operating system.  And the first page of process address space
(0-512K) was both read- and write-protected so that any attempt to use a
null pointer or small integer as an address generated an exception.  IMO
one of the best design decisions ever done in an ABI.  It caught countless
program errors.

Unix seems to have followed VAX/VMS's lead on address space layout on the
VAX.

Where did Unix put the process stack on VAX?  In VAX/VMS it was at the top
of the user VA space and grew downward.  Contrariwise the top of heap
memory (the break in Unix-speak) started just after the statically
allocated part of the program image (including any mapped shared images)
and grew upwards.

-Paul W.


More information about the TUHS mailing list