been one of those “clever” programmers and was somewhat surprised to discover that a large program (the S/360 ASSIST assembler) originally written in 1970 was still in use in 2006—in 24-bit compatibility mode, because it wouldn’t run any other way. Compiler code that had been “clever” had long since stopped doing this, but assembly code is tougher. (“The evil that men do lives after them, the good is oft interred with their bones.” —Shakespeare, again, Julius Caesar)

Then, even 31-bit addressing became insufficient for certain applications, especially databases. ESA/370 (1988) offered user-level segmentation to access multiple 2GB regions of memory.

The 64-bit IBM zSeries (2001) still supports 24-bit mode, 40-plus years later. Why did 24-bit happen? I’m told that it was all for the sake of one low-cost early model, the 360/30, where 32 bits would have run slower because it had 8-bit data paths. These were last shipped more than 30 years ago. Were they worth the decades of headaches?

Minicomputers. In the 16-bit DEC PDP- 11 minicomputer family (1970), a single task addressed only 64KB, or in later models (1973), 64KB of instructions plus 64KB of data. “The biggest and most common mistake that can be made in computer design is that of not providing enough address bits for memory addressing and management,” C. Gordon Bell and J. Craig Mudge wrote in 1978. “The PDP- 11 followed this hallowed tradition of skimping on address bits, but was saved on the principle that a good design can evolve through at least one major change. For the PDP- 11, the limited address space

was solved for the short run, but not with enough finesse to support a large family of minicomputers. This was indeed a costly oversight.”

2

To be fair, it would have been difficult to meet the PDP- 11’s cost goals with 32-bit hardware, but I think DEC did underestimate how fast the price of DRAM memory would fall. In any case, this lasted a long time—the PDP- 11 was finally discontinued in 1997!

The PDP-11/70 (1976) raised the number of supportable concurrent tasks, but any single program could still only use 64KI + 64KD of a maximum of 4MB, so that individual large programs required unnatural acts to split code and data into 64KB pieces. Some believed this encouraged modularity and inhibited “creeping featurism” and was therefore philosophically good.

Although the 32-bit VAX-11/780 (1977) was only moderately faster than the PDP-11/70, the increased address space was a major improvement that ended the evolution of high-end PDP- 11s. VAX architect William Strecker explained it this way: “However, there are some applications whose programming is impractical in a 65KB address space, and perhaps more importantly, others whose programming is appreciably simplified by having a large address space.” 7

Microprocessors. The Intel 8086’s 16- bit ISA seemed likely to fall prey to the PDP- 11’s issues (1978). It did provide user-mode mechanisms for explicit segment manipulation, however. This allowed a single program to access more than 64KB of data. PC programmers were familiar with the multiplicity of memory models, libraries, compiler

flags, extenders, and other artifacts once needed. The 80386 provided 32- bit flat addresses (1986), but of course retained the earlier mechanisms, and 16-bit PC software lasted “forever.” The intermediate 80286 (1982) illustrated the difficulty of patching an architecture to get more addressing bits.

The 32-bit Motorola MC68000 (1979) started with a flat-addressing programming model. By ignoring the high 8 bits of a 32-bit register, it exactly repeated the S/360 mistake. Once again, “clever” programmers found uses for those bits, and when the MC68020 (1984) interpreted all 32, some programs broke (for example, when moving from the original Apple Macintosh to the Mac II).

Fortunately, 64-bit CPUs managed to avoid repeating the S/360 and MC68000 problem. Although early versions usually implemented 40 to 44 virtual address bits, they trapped use of not-yet-implemented high-order v bits, rather than ignoring them. People do learn, eventually.

lessons

˲ Even in successful computer families created by top architects, address bits are scarce and are totally consumed sooner or later.

˲Upward compatibility is a real constraint, and thinking ahead helps. In the mainframe case, a 24-bit “ first-implementation artifact” needed hardware/software support for 40-plus years. Then a successful minicomputer family’s evolution ended prematurely. Finally, microprocessors repeated the earlier mistakes, although the X86’s segmentation allowed survival long enough to get flat-address versions.

 

DEc PDP-11/70 (64KI + 64KD), but larger physical memory (a huge 4MB)

c short, long added (partly from doing C for XDS Sigma, although long was 64 bits there)

1976

unix ported to 32-bit Interdata 8/32

c

unsigned, typedef, union; 32-bit long used to replace int, 2 in lseek, tell on 16-bit PDP- 11; IP16L32

DEc Vax-11/780 32-bit, 32-bit addressing (4GB total, 2GB per user process)

c

PDP-11: I16LP32; vAX (other 32-bitters): ILP32

1977

unix 32v for vAX-11/780; C is ILP32

c The C Programming Language, Brian Kernighan and Dennis Ritchie (Prentice-Hall)

intel 8086 16-bit, but with user-visible segmentation

1978

motorola mc68000  32-bit ISA, but 24-bit addressing (e.g., S/360)

1979
1980

References:

Archives