Difference between pages "UNIX Sixth Edition" and "PDP-11 Memory Management"

From Computer History Wiki
(Difference between pages)
Jump to: navigation, search
(Running UNIX V6: Add link to -11/23 page)
 
m (+cat)
 
Line 1: Line 1:
{{Infobox OS
+
[[PDP-11]]s which provide [[memory management]] use a standard '''PDP-11 Memory Management''' architecture. When memory management is enabled, the basic 64 Kbyte [[address space]] of the [[PDP-11 architecture]] is divided into 8 '''segments'''; each segment of the virtual address space can be assigned to any location in physical [[main memory]].
| image = v6unix.png
 
| caption = Logging into a v6 unix system
 
| name = Unix v6
 
| creator = AT&T/Western Electric
 
| current version = v6
 
| year introduced = 1975
 
| type = Multitasking, multiuser
 
| architecture = [[PDP-11]]
 
}}
 
  
'''UNIX Sixth Edition''' (often referred to as '''UNIX V6''' or '''V6 UNIX''' - 'Unix' was still normally given in all capital letters at this point in time) was one of the most influential early versions of Unix.
+
Each segment can be set to any length between 0 bytes and 8 Kbytes, in 0100 (64.) byte increments. Segments can grow either up from their base address, or down; the latter to accomodate PDP-11 [[stack]]s, which typically grow down (from higher addresses to lower).
  
It was the base for many important branches of UNIX, including PWB/Unix and the BSD Unix family (it was in fact the first version of Unix to have more than one descendant). It was also one of the more popular Research versions from Bell Labs, appearing as it did shortly after the influential CACM article on Unix.
+
The [[Central Processing Unit|CPU]] can be in one of three modes; 'Kernel', 'Supervisor', and 'User'; each has its own separate set of mapping [[register]]s, to provide separate virtual address spaces for each mode.
  
As distributed from Bell Labs, it ran only on [[PDP-11]]s, although outside Bell Labs it was later ported to several other architectures.
+
An additional enhancement is that [[instruction]] and data fetches can be set to go to separate 64 Kbyte address spaces, the so-called '''Split I+D space''' capability; this increases the memory available to the operating system, and each user, to 128 Kbytes.
  
It was very similar to the earlier [[UNIX Fifth Edition]]; the main change was the support of so-called [[PDP-11 Memory Management|split I+D space]], both in the kernel, and for user programs. It also supported the [[PDP-11/70]] with more than 256 Kbytes of memory, and the resultant [[UNIBUS map]].
+
(Since immediate operands and absolute addresses are stored contiguous with their instructions, fetches of them are considered to be instruction fetches, for the purposes of deciding which space to use for them.)
  
UNIX V6 included even more documentation than V5, and also included gems like [[Programming in C - A Tutorial]].
+
When split I+D is not enabled in any particular mode, only a single 64 Kbyte address space is provided, using only the I-space registers for that mode.
  
==Other Platforms==
+
If any instruction causes a [[fault]] (i.e. an attempt to perform a memory operation which cannot be completed, because of the settings of the memory management - e.g. an attempt to write into a segment set as 'read only'), execution of the instruction is aborted, and a memory management [[trap]] occurs.
  
In addition to the [[PDP-11]], which was the only machine the original Bell Laboratories distribution of V6 ran on, it was later ported to several other architectures.
+
===Simplified subset===
  
=== Interdata 8/32 ===
+
A number of the smaller PDP-11's (notably the [[PDP-11/40]], [[PDP-11/34]], [[PDP-11/23]] and [[PDP-11/24]]) provide only a limited subset of the standard memory management facilities. In these machines, there is no support for Split I+D, and no Supervisor mode (just Kernel and User).
  
The first port of Unix to another architecture was performed outside of Bell Laboratories; V6 was ported to an [[Interdata 7/32]] at the University of Wollongong. This was also the first port to a 32 bit platform, although Bell completed their own port to the very similar [[Interdata 8/32]] shortly thereafter (that port became [[Unix Seventh Edition]]).
+
Also, there is no SSR1 register (below), which can make re-starting instructions which cause a fault laborious (the fault-handling code has to decipher the instruction and effectively simulate its operation, to work out which registers need to be 'backed out' to their state before the instruction started execution), and in some cases impossible (e.g. instructions which auto-increment the same register several times).
  
=== Intel 80286 ===
+
==Registers==
  
There is a port by Szigeti Szabolcs to the [[i286|Intel 80286]] CPU, available in [http://www.tuhs.org/archive_sites.html the Unix Archive] under Other/V6on286.  Requires a copy of [[MS-DOS]] to run.
+
The memory management is entirely controlled by groups of registers in the CPU (unlike many virtual memory systems, which use page tables held in main memory, and cached in the CPU).
  
=== i386 ===
+
===Control===
  
There is a 32bit port to the [[i386|x86 cpu]], called xv6 used by MIT for an OS class.  http://pdos.csail.mit.edu/6.828/2006/index.html  You can download the source http://pdos.csail.mit.edu/6.828/2006/src/xv6-rev0.tar.gz
+
There are four registers which control the overall operation of the Memory Management Unit:
  
== Folk Lore ==
+
{| class="wikitable"
 +
! Address !! Name !! Function
 +
|-
 +
| 777572 || SSR0 || Control and status
 +
|-
 +
| 777574 || SSR1 || Register increment/descrement record
 +
|-
 +
| 777576 || SSR2 || Virtual address associated with the fault (usually the instruction address)
 +
|-
 +
| 777516 || SSR3 || D-space enable/disable (per mode)
 +
|}
  
[[Image:Lions UNIX book cover.jpg|thumb|150px|right|The Lions Book]]
+
On the 'simplified subset' machines, SSR1 and SSR3 are not implemented.  
  
V6 Unix is also famous because of the "[[Lions book]]". [[John Lions]] at the University of New South Wales wrote up an excellent dissection of the Unix kernel, and taught it in his OS classes.
+
SSR0 contains control bits (e.g. enabling memory management) and status bits (e.g. information about memory operations which caused a memory management fault, and the segment involved). The layout of SSR0 is:
 +
{{16bit-header}}
 +
| Non-resident || Length || Read-only || Trap || colspan=2 | Unused || Enable Trap || Maintenance || Instruction Completed || colspan=2 | CPU Mode || I/D || colspan=3 | Page || Enable
 +
{{16bit-bitout}}
  
Unfortunately, the book ran into intellectual property issues with Bell, so its formal distribution was halted; however, it became ''the'' guide to Unix internals as it was photo-copied over and over, in a Western equivalent to the ''samizdat'' of the old USSR.
+
When any of the first three bits (all error aborts) are set, bits 1-7, as well as SSR1 and SSR2, are frozen. On the 'simplified subset' machines, bits 12, 9, 7 and 4 are not implemented.
  
Recently, with the open release of older versions of Unix, the intellectual property issues were cleared, and the Lions book is now finally publicly available.
+
SSR1 contains information about register modifications (given there in [[two's complement]]) performed during the course of an instruction, to allow those modifications to be 'backed out' if the instruction needs to be restarted after a memory management fault. Its layout is:
 +
{{16bit-header}}
 +
| colspan=5 | Change || colspan=3 | Register || colspan=5 | Change || colspan=3 | Register
 +
{{16bit-bitout}}
  
Unix V6 is also the base for a intructional operating system called 'XV6', used in an operating systems course at MIT.
+
SSR2 contains the address of the instruction which caused the memory management fault.
  
== Games ==
+
SSR3 contains bits to enable Split I+D in the three modes; on machines which have [[UNIBUS map]]s, the enable for it is also here. Its layout is:
 +
{{16bit-header}}
 +
| colspan=10 | Unused || Enable UNIBUS Map || Enable 22-bit || Unused || Kernel || Supervisor || User
 +
{{16bit-bitout}}
  
The game situation didn't improve that much from Vv5 to V6.
+
The 'Enable 22-bit' bit only applies on machines which support larger memories, i.e. the [[PDP-11/70]], [[PDP-11/44]], and machines with the [[KDF11 CPUs]] and [[KDJ11 CPUs]].
<pre>
 
bj
 
chess
 
cubic
 
moo
 
ttt
 
wump
 
</pre>
 
  
==Running UNIX V6==
+
===PARs and PDRs===
  
To install and run Unix V6, one needs a distribution (either an image of a distribution tape, or images of [[disk]]s), and either an emulator, or an actual PDP-11 or Interdata.
+
Each segment (up to 48 in total; 8 each Instruction and Data, for the three different modes) is described by a pair of registers, a Page Descriptor Register (PDR) and a Page Address Register (PAR).
  
V6 ''can'' be run on a [[PDP-11/23]], but it takes a few [[Running Unix V6 on an -11/23|minor mods]] to do so.
+
The PAR contains the base physical address for the segment (in units of 0100/64. bytes). On machines which have only [[UNIBUS]] memory (e.g. PDP-11/40, [[PDP-11/45]], etc) these registers are 12 bits long, since the maximum amount of physical memory on these machines is 248 Kbytes. On machines which support up to 4 MBytes of physical memory (e.g. [[PDP-11/70]], [[PDP-11/44]], PDP-11/23, etc), they are 16 bits long.  
  
===SIMH===
+
The PDR contains the segment's length, along with the direction of growth, the access control field (read/only, read/write, etc), a 'dirty' bit (maintained by the hardware), etc. The layout of the PDR is:
  
One possibility for an emulator is to use [[SIMH]]; you can get V6 by looking for uv6swre.zip and iu6swre.zip, PDP-11 and Interdata versions respectively.
+
{{16bit-header}}
 +
| Unused || colspan=7 | Length || Trapped || Written || colspan=2 | Unused || Direction || colspan=3 | Access Control
 +
{{16bit-bitout}}
  
*http://simh.trailing-edge.com/kits/uv6swre.zip
+
The values of the 'Access Control' field are:
*http://simh.trailing-edge.com/kits/iu6swre.zip
+
{| class="wikitable"
 +
! Value !! Mode
 +
|-
 +
| 0 || Non-resident - abort all accesses
 +
|-
 +
| 1 || Read-only watched - abort on write, trap on read
 +
|-
 +
| 2 || Read-only - abort on write
 +
|-
 +
| 3 || Unused, reserved - abort all accesses
 +
|-
 +
| 4 || Read/write all watched - trap on read or write
 +
|-
 +
| 5 || Read/write watched - trap on write
 +
|-
 +
| 6 || Read/write - none
 +
|-
 +
| 7 || Unused, reserved - abort all accesses
 +
|}
  
There is also a great lecture series involving SIMH and v6 which can be found here:
+
On the 'simplified subset' machines, only modes 0, 2 and 6 are supported, and neither is the 'Trapped' bit (set on PDR's for memory references that trapped, on the other machines).
*[http://wwwlehre.dhbw-stuttgart.de/~helbig/os/index.html http://wwwlehre.dhbw-stuttgart.de/~helbig/os/index.html]
 
*[[xv6 homework 4]]
 
*[[xv6 homework 5]]
 
*[[xv6 homework 6]]
 
*[[xv6 homework 7]]
 
*[[xv6 homework 8]]
 
  
===Ersatz-11===
+
The addresses of the PAR/PDR sets are:
  
Another choice for an emulator is [[Ersatz-11]]; complete instructions for how to bring up V6 under Ersatz-11 are available, as well as instructions for how to make a more usable V6 under Ersatz-11: see the link below.
+
{| class="wikitable"
 +
! Address !! Name !! Function
 +
|-
 +
| 772200 || SISD0 || Supervisor I-Space PDR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 772216 || SISD7 || Supervisor I-Space PDR #7
 +
|-
 +
| 772220 || SDSD0 || Supervisor D-Space PDR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 772236 || SDSD7 || Supervisor D-Space PDR #7
 +
|-
 +
| 772240 || SISA0 || Supervisor I-Space PAR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 772256 || SISA7 || Supervisor I-Space PAR #7
 +
|-
 +
| 772260 || SDSA0 || Supervisor D-Space PAR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 772276 || SDSA7 || Supervisor D-Space PAR #7
 +
|-
 +
| 772300 || KISD0 || Kernel I-Space PDR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 772316 || KISD7 || Kernel I-Space PDR #7
 +
|-
 +
| 772320 || KDSD0 || Kernel D-Space PDR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 772336 || KDSD7 || Kernel D-Space PDR #7
 +
|-
 +
| 772340 || KISA0 || Kernel I-Space PAR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 772356 || KISA7 || Kernel I-Space PAR #7
 +
|-
 +
| 772360 || KDSA0 || Kernel D-Space PAR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 772376 || KDSA7 || Kernel D-Space PAR #7
 +
|-
 +
| 777600 || UISD0 || User I-Space PDR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 777616 || UISD7 || User I-Space PDR #7
 +
|-
 +
| 777620 || UDSD0 || User D-Space PDR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 777636 || UDSD7 || User D-Space PDR #7
 +
|-
 +
| 777640 || UISA0 || User I-Space PAR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 777656 || UISA7 || User I-Space PAR #7
 +
|-
 +
| 777660 || UDSA0 || User D-Space PAR #0
 +
|-
 +
| colspan="2" style="text-align:center;" | ...
 +
|-
 +
| 777676 || UDSA7 || User D-Space PAR #7
 +
|}
  
==See also==
+
{{PDP-11}}
  
* [[Installing UNIX Sixth Edition]]
+
[[Category: PDP-11s]]
** [[Setting up UNIX Sixth Edition]]
 
* [[Installing Unix v6 (PDP-11) on SIMH]]
 
** [[Running Unix v6 in SIMH]]
 
* [[Installing UNIX Sixth Edition on Ersatz-11]]
 
 
 
{{Nav Unix}}
 
 
 
[[Category:Operating Systems]]
 
[[Category:PDP-11 Operating Systems]]
 

Revision as of 15:58, 17 February 2018

PDP-11s which provide memory management use a standard PDP-11 Memory Management architecture. When memory management is enabled, the basic 64 Kbyte address space of the PDP-11 architecture is divided into 8 segments; each segment of the virtual address space can be assigned to any location in physical main memory.

Each segment can be set to any length between 0 bytes and 8 Kbytes, in 0100 (64.) byte increments. Segments can grow either up from their base address, or down; the latter to accomodate PDP-11 stacks, which typically grow down (from higher addresses to lower).

The CPU can be in one of three modes; 'Kernel', 'Supervisor', and 'User'; each has its own separate set of mapping registers, to provide separate virtual address spaces for each mode.

An additional enhancement is that instruction and data fetches can be set to go to separate 64 Kbyte address spaces, the so-called Split I+D space capability; this increases the memory available to the operating system, and each user, to 128 Kbytes.

(Since immediate operands and absolute addresses are stored contiguous with their instructions, fetches of them are considered to be instruction fetches, for the purposes of deciding which space to use for them.)

When split I+D is not enabled in any particular mode, only a single 64 Kbyte address space is provided, using only the I-space registers for that mode.

If any instruction causes a fault (i.e. an attempt to perform a memory operation which cannot be completed, because of the settings of the memory management - e.g. an attempt to write into a segment set as 'read only'), execution of the instruction is aborted, and a memory management trap occurs.

Simplified subset

A number of the smaller PDP-11's (notably the PDP-11/40, PDP-11/34, PDP-11/23 and PDP-11/24) provide only a limited subset of the standard memory management facilities. In these machines, there is no support for Split I+D, and no Supervisor mode (just Kernel and User).

Also, there is no SSR1 register (below), which can make re-starting instructions which cause a fault laborious (the fault-handling code has to decipher the instruction and effectively simulate its operation, to work out which registers need to be 'backed out' to their state before the instruction started execution), and in some cases impossible (e.g. instructions which auto-increment the same register several times).

Registers

The memory management is entirely controlled by groups of registers in the CPU (unlike many virtual memory systems, which use page tables held in main memory, and cached in the CPU).

Control

There are four registers which control the overall operation of the Memory Management Unit:

Address Name Function
777572 SSR0 Control and status
777574 SSR1 Register increment/descrement record
777576 SSR2 Virtual address associated with the fault (usually the instruction address)
777516 SSR3 D-space enable/disable (per mode)

On the 'simplified subset' machines, SSR1 and SSR3 are not implemented.

SSR0 contains control bits (e.g. enabling memory management) and status bits (e.g. information about memory operations which caused a memory management fault, and the segment involved). The layout of SSR0 is:

Non-resident Length Read-only Trap Unused Enable Trap Maintenance Instruction Completed CPU Mode I/D Page Enable
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

When any of the first three bits (all error aborts) are set, bits 1-7, as well as SSR1 and SSR2, are frozen. On the 'simplified subset' machines, bits 12, 9, 7 and 4 are not implemented.

SSR1 contains information about register modifications (given there in two's complement) performed during the course of an instruction, to allow those modifications to be 'backed out' if the instruction needs to be restarted after a memory management fault. Its layout is:

Change Register Change Register
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

SSR2 contains the address of the instruction which caused the memory management fault.

SSR3 contains bits to enable Split I+D in the three modes; on machines which have UNIBUS maps, the enable for it is also here. Its layout is:

Unused Enable UNIBUS Map Enable 22-bit Unused Kernel Supervisor User
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

The 'Enable 22-bit' bit only applies on machines which support larger memories, i.e. the PDP-11/70, PDP-11/44, and machines with the KDF11 CPUs and KDJ11 CPUs.

PARs and PDRs

Each segment (up to 48 in total; 8 each Instruction and Data, for the three different modes) is described by a pair of registers, a Page Descriptor Register (PDR) and a Page Address Register (PAR).

The PAR contains the base physical address for the segment (in units of 0100/64. bytes). On machines which have only UNIBUS memory (e.g. PDP-11/40, PDP-11/45, etc) these registers are 12 bits long, since the maximum amount of physical memory on these machines is 248 Kbytes. On machines which support up to 4 MBytes of physical memory (e.g. PDP-11/70, PDP-11/44, PDP-11/23, etc), they are 16 bits long.

The PDR contains the segment's length, along with the direction of growth, the access control field (read/only, read/write, etc), a 'dirty' bit (maintained by the hardware), etc. The layout of the PDR is:


Unused Length Trapped Written Unused Direction Access Control
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00

The values of the 'Access Control' field are:

Value Mode
0 Non-resident - abort all accesses
1 Read-only watched - abort on write, trap on read
2 Read-only - abort on write
3 Unused, reserved - abort all accesses
4 Read/write all watched - trap on read or write
5 Read/write watched - trap on write
6 Read/write - none
7 Unused, reserved - abort all accesses

On the 'simplified subset' machines, only modes 0, 2 and 6 are supported, and neither is the 'Trapped' bit (set on PDR's for memory references that trapped, on the other machines).

The addresses of the PAR/PDR sets are:

Address Name Function
772200 SISD0 Supervisor I-Space PDR #0
...
772216 SISD7 Supervisor I-Space PDR #7
772220 SDSD0 Supervisor D-Space PDR #0
...
772236 SDSD7 Supervisor D-Space PDR #7
772240 SISA0 Supervisor I-Space PAR #0
...
772256 SISA7 Supervisor I-Space PAR #7
772260 SDSA0 Supervisor D-Space PAR #0
...
772276 SDSA7 Supervisor D-Space PAR #7
772300 KISD0 Kernel I-Space PDR #0
...
772316 KISD7 Kernel I-Space PDR #7
772320 KDSD0 Kernel D-Space PDR #0
...
772336 KDSD7 Kernel D-Space PDR #7
772340 KISA0 Kernel I-Space PAR #0
...
772356 KISA7 Kernel I-Space PAR #7
772360 KDSA0 Kernel D-Space PAR #0
...
772376 KDSA7 Kernel D-Space PAR #7
777600 UISD0 User I-Space PDR #0
...
777616 UISD7 User I-Space PDR #7
777620 UDSD0 User D-Space PDR #0
...
777636 UDSD7 User D-Space PDR #7
777640 UISA0 User I-Space PAR #0
...
777656 UISA7 User I-Space PAR #7
777660 UDSA0 User D-Space PAR #0
...
777676 UDSA7 User D-Space PAR #7