(1946) There are many different methods available to load a short initial program into a computer. These methods range from simple, physical input to removable media that can hold more complex programs.
Pre integrated-circuit-ROM examples Early computers Early computers in the 1940s and 1950s were one-of-a-kind engineering efforts that could take weeks to program, and program loading was one of many problems that had to be solved. An early computer,
ENIAC, had no program stored in memory but was set up for each problem by a configuration of interconnecting cables. Bootstrapping did not apply to ENIAC, whose hardware configuration was ready for solving problems as soon as power was applied. The
EDSAC system, the second stored-program computer to be built, used
stepping switches to transfer a fixed program into memory when its start button was pressed. The program stored on this device, which
David Wheeler completed in late 1948, loaded further instructions from
punched tape and then executed them.
First commercial computers The first programmable computers for commercial sale, such as the
UNIVAC I and the
IBM 701 included features to make their operation simpler. They typically included instructions that performed a complete input or output operation. The same hardware logic could be used to load the contents of a
punch card (the most typical ones) or other input media, such as a
magnetic drum or
magnetic tape, that contained a bootstrap program by pressing a single button. This booting concept was called a variety of names for
IBM computers of the 1950s and early 1960s, but IBM used the term "Initial Program Load" with the
IBM 7030 Stretch and later used it for their mainframe lines, starting with the
System/360 in 1964. (1965) The
IBM 701 computer (1952–1956) had a "Load" button that initiated reading of the first
36-bit word into
main memory from a punched card in a
card reader, a magnetic tape in a
tape drive, or a magnetic drum unit, depending on the position of the Load Selector switch. The left 18-bit half-word was then executed as an instruction, which usually read additional words into memory. The loaded boot program was then executed, which, in turn, loaded a larger program from that medium into memory without further help from the human operator. The
IBM 704,
IBM 7090, and
IBM 7094 had similar mechanisms, but with different load buttons for different devices. The term "boot" has been used in this sense since at least 1958. Other IBM computers of that era had similar features. For example, the
IBM 1401 system (1959) used a card reader to load a program from a punched card. The 80 characters stored in the punched card were read into memory locations 001 to 080, then the computer would branch to memory location 001 to read its first stored instruction. This instruction was always the same: move the information in these first 80 memory locations to an assembly area where the information in punched cards 2, 3, 4, and so on, could be combined to form the stored program. Once this information was moved to the assembly area, the machine would branch to an instruction in location 080 (read a card) and the next card would be read and its information processed. Another example was the
IBM 650 (1953), a decimal machine, which had a group of ten 10-position switches on its operator panel that were addressable as a memory word (address 8000) and could be executed as an instruction. Thus, setting the switches to 7004000400 and pressing the appropriate button would read the first card in the card reader into memory (op code 70), starting at address 400 and then jump to 400 to begin executing the program on that card. The
IBM 7040 and 7044 have a similar mechanism, in which the Load button causes the instruction set up in the entry keys on the front panel is executed, and the channel that instruction sets up is given a command to transfer data to memory starting at address 00100; when that transfer finishes, the CPU jumps to address 00101. IBM's competitors also offered single-button program load. • The
CDC 6600 (c. 1964) had a
dead start panel with 144 toggle switches; the dead start switch entered 12 12-bit words from the toggle switches to the memory of
peripheral processor (
PP) 0 and initiated the load sequence by causing PP 0 to execute the code loaded into memory. PP 0 loaded the necessary code into its own memory and then initialized the other PPs. • The
GE 645 (c. 1965) had a "SYSTEM BOOTLOAD" button that, when pressed, caused one of the I/O controllers to load a 64-word program into memory from a diode
read-only memory and deliver an interrupt to cause that program to start running. • The first model of the
PDP-10 had a "READ IN" button that, when pressed, reset the processor and started an I/O operation on a device specified by switches on the control panel, reading in a 36-bit word giving a target address and count for subsequent word reads; when the read completed, the processor started executing the code read in by jumping to the last word read in. A noteworthy variation of this is found on the
Burroughs B1700, where there is neither a
boot ROM nor a hardwired IPL operation. Instead, after the system is reset, it reads and executes microinstructions sequentially from a cassette tape drive mounted on the front panel; this sets up a boot loader in RAM, which is then executed. However, since this makes few assumptions about the system it can equally well be used to load diagnostic (Maintenance Test Routine) tapes which display an intelligible code on the
front panel even in cases of gross CPU failure. In the System/360 processors, an IPL is initiated by the computer operator by selecting the three hexadecimal digit device address (CUU; C=I/O Channel address, UU=Control unit and Device address) followed by pressing the
LOAD button. On the high end
System/360 models, most
System/370 and some later systems, the functions of the switches and the LOAD button are simulated using selectable areas on the screen of a graphics console, often an
IBM 2250-like device or an
IBM 3270-like device. For example, on the System/370 Model 158, the keyboard sequence 0-7-X (zero, seven and X, in that order) results in an IPL from the device address that was keyed into the input area. The
Amdahl 470V/6 and related CPUs supported four hexadecimal digits on those CPUs that had the optional second channel unit installed, for a total of 32 channels. Later, IBM would also support more than 16 channels. The IPL function in the System/360 and its successors prior to
IBM Z, and its compatibles, such as Amdahl's, reads 24 bytes from an operator-specified device into main storage starting at real address zero. The second and third groups of eight bytes are treated as
Channel Command Words (CCWs) to continue loading the startup program (the first CCW is always simulated by the CPU and consists of a Read IPL command, , with command chaining and suppress incorrect length indication being enforced). When the I/O channel commands are complete, the first group of eight bytes is then loaded into the processor's
Program Status Word (PSW) and the startup program begins execution at the location designated by that PSW. Following the older approach, the earlier
PDP-1 has a hardware loader, such that an operator needs only push the
load switch to instruct the
paper tape reader to load a program directly into core memory. The
PDP-7,
PDP-9, and
PDP-15 successors to the PDP-4 have an added Read-In button to read a program in from paper tape and jump to it. The Data General
Supernova used front panel switches to cause the computer to automatically load instructions into memory from a device specified by the front panel's data switches, and then jump to loaded code.
Early minicomputer boot loader examples In a minicomputer with a paper tape reader, the first program to run in the boot process, the boot loader, would read into core memory either the second-stage boot loader (often called a
Binary Loader) that could read paper tape with
checksum or the operating system from an outside storage medium.
Pseudocode for the boot loader might be as simple as the following eight instructions: • Set the P register to 9 • Check paper tape reader ready • If not ready, jump to 2 • Read a byte from paper tape reader to accumulator • Store accumulator to address in P register • If end of tape, jump to 9 • Increment the P register • Jump to 2 A related example is based on a loader for a Nicolet Instrument Corporation minicomputer of the 1970s, using the paper tape reader-punch unit on a
Teletype Model 33 ASR
teleprinter. The bytes of its second-stage loader are read from paper tape in reverse order. • Set the P register to 106 • Check paper tape reader ready • If not ready, jump to 2 • Read a byte from paper tape reader to accumulator • Store accumulator to address in P register • Decrement the P register • Jump to 2 The length of the second stage loader is such that the final byte overwrites location 7. After the instruction in location 6 executes, location 7 starts the second stage loader executing. The second stage loader then waits for the much longer tape containing the operating system to be placed in the tape reader. The difference between the boot loader and second stage loader is the addition of checking code to trap paper tape read errors, a frequent occurrence with relatively low-cost, "part-time-duty" hardware, such as the Teletype Model 33 ASR. (Friden Flexowriters were far more reliable, but also comparatively costly.)
Booting the first microcomputers The earliest microcomputers, such as the
Altair 8800 (released first in 1975) and an even earlier, similar machine (based on the Intel 8008 CPU) had no bootstrapping hardware as such. When powered up, the CPU would see memory that would contain random data. The front panels of these machines carried toggle switches for entering addresses and data, one switch per bit of the computer memory word and address bus. Simple additions to the hardware permitted one memory location at a time to be loaded from those switches to store bootstrap code. Meanwhile, the CPU was kept from attempting to execute memory content. Once correctly loaded, the CPU was enabled to execute the bootstrapping code. This process, similar to that used for several earlier minicomputers, was tedious and had to be error-free.
Integrated circuit read-only memory era "chip" on a
circuit board The introduction of integrated circuit
read-only memory (ROM), with its many variants, including
mask-programmed ROMs,
programmable ROMs (PROM),
erasable programmable ROMs (EPROM), and
flash memory, reduced the physical size and cost of ROM. This allowed
firmware boot programs to be included as part of the computer.
Minicomputers The Data General
Nova 1200 (1970) and
Nova 800 (1971) had a program load switch that, in combination with options that provided two ROM chips, loaded a program into main memory from those ROM chips and jumped to it. M9301 (1977), M9312 (1978), REV11-A and REV11-C, MRV11-C, and MRV11-D ROM memories, all usable as bootstrap ROMs. The PDP-11/34 (1976), PDP-11/60 (1977), PDP-11/24 (1979), and most later models include boot ROM modules. An Italian telephone switching computer, called "Gruppi Speciali", patented in 1975 by
Alberto Ciaramella, a researcher at
CSELT, included an (external) ROM. Gruppi Speciali was, starting from 1975, a fully single-button machine booting into the operating system from a ROM memory composed of semiconductors, not ferrite cores. Although the ROM device was not natively embedded in the computer of Gruppi Speciali, due to the design of the machine, it also allowed the single-button ROM booting in machines not designed for that (therefore, this "bootstrap device" was architecture-independent), e.g., the PDP-11. Storing the state of the machine after the switch-off was also in place, which was another critical feature in the telephone switching contest. Some minicomputers and
superminicomputers include a separate console processor that bootstraps the main processor. The PDP-11/44 had an
Intel 8085 as a console processor; the
VAX-11/780, the first member of Digital's
VAX line of 32-bit superminicomputers, had an
LSI-11-based console processor, and the VAX-11/730 had an 8085-based console processor. These console processors could boot the main processor from various storage devices. Some other superminicomputers, such as the VAX-11/750, implement console functions, including the first stage of booting, in CPU microcode.
Microprocessors and microcomputers Typically, a microprocessor will, after a reset or power-on condition, perform a start-up process that usually takes the form of "begin execution of the code that is found starting at a specific address" or "look for a multibyte code at a specific address and jump to the indicated location to begin execution". A system built using that microprocessor will have the permanent ROM occupying these special locations so that the system always begins operating without operator assistance. For example,
Intel x86 processors always start by running the instructions beginning at F000:FFF0, while for the
MOS 6502 processor, initialization begins by reading a two-byte vector address at $FFFD (MS byte) and $FFFC (LS byte) and jumping to that location to run the bootstrap code.
Apple Computer's first computer, the
Apple 1, introduced in 1976, featured PROM chips that eliminated the need for a front panel for the boot process (as was the case with the Altair 8800) in a commercial computer. According to Apple's ad announcing it, "No More Switches, No More Lights ... the firmware in PROMS enables you to enter, display and debug programs (all in hex) from the keyboard." Due to the expense of read-only memory at the time, the
Apple II booted its disk operating systems using a series of very small incremental steps, each passing control onward to the next phase of the gradually more complex boot process. (See
Apple DOS: Boot loader). Because so little of the disk operating system relied on ROM, the hardware was also extremely flexible and supported a wide range of customized disk
copy protection mechanisms. (See
Software Cracking: History.) Some operating systems, most notably pre-1995
Macintosh systems from
Apple, are so closely interwoven with their hardware that it is impossible to natively boot an operating system other than the standard one. This is the opposite extreme of the scenario using switches mentioned above; it is highly inflexible but relatively error-proof and foolproof as long as all hardware is working normally. A common solution in such situations is to design a boot loader that works as a program belonging to the standard OS that hijacks the system and loads the alternative OS. This technique was used by Apple for its
A/UX Unix implementation and copied by various freeware operating systems and
BeOS Personal Edition 5. Some machines, like the
Atari ST microcomputer, were "instant-on", with the operating system executing from a ROM. Retrieval of the OS from secondary or tertiary store was thus eliminated as one of the characteristic operations for bootstrapping. To allow system customizations, accessories, and other support software to be loaded automatically, the Atari's floppy drive was read for additional components during the boot process. There was a timeout delay that provided time to manually insert a floppy as the system searched for the extra components. This could be avoided by inserting a blank disk. The Atari ST hardware was also designed so the cartridge slot could provide native program execution for gaming purposes as a holdover from Atari's legacy making electronic games; by inserting the
Spectre GCR cartridge with the Macintosh system ROM in the game slot and turning the Atari on, it could "natively boot" the Macintosh operating system rather than Atari's own
TOS. The
IBM Personal Computer included ROM-based firmware called the
BIOS; one of the functions of that firmware was to perform a
power-on self test when the machine was powered up, and then to read software from a boot device and execute it. Firmware compatible with the BIOS on the IBM Personal Computer is used in
IBM PC compatible computers. The
UEFI was developed by Intel, originally for
Itanium-based machines, and later also used as an alternative to the BIOS in
x86-based machines, including
Apple Macs using Intel processors.
Unix workstations originally had vendor-specific ROM-based firmware.
Sun Microsystems later developed
OpenBoot, later known as Open Firmware, which incorporated a
Forth interpreter, with much of the firmware being written in Forth. It was standardized by the
IEEE as IEEE standard ; firmware that implements that standard was used in
PowerPC-based
Macs and some other PowerPC-based machines, as well as Sun's own
SPARC-based computers. The
Advanced RISC Computing specification defined another firmware standard, which was implemented on some
MIPS-based and
Alpha-based machines and the
SGI Visual Workstation x86-based workstations. == Modern boot loaders ==