Porting Unix to the 386: the Final StepRunning light with 386BSD
William Frederick Jolitz and Lynne Greer Jolitz
Dr. Dobb's Journal
July 01, 1992
Over the past couple of months, we've discussed the minimal code and methodology required to fill in the missing pieces of the incomplete Net/2 tape, leading to an operational 386BSD kernel. Still, the step from a few changes to a real system is great, as evident by the items that had to be provided with this kernel: bootstraps, file systems, an installation mechanism, binaries of utilities, and documentation.
However, we decided it was time to step away from the kernel and make all of 386BSD available and accessible, so that it could become the generic research and educational platform we envisioned when we wrote "386BSD: A Modest Proposal," the software specification for 386BSD, in mid-1989. So, on March 17, 1992 we launched 386BSD Release 0.0.
386BSD Release 0.0--Liftoff
386BSD Release 0.0 consisted of:
Another pleasant surprise was the number of software contributions, bug fixes, and suggestions from early users. People were eager not only to supply their code and knowledge, but to help others get their systems running too.
Finally, it was gratifying to learn that our little system, bugs and all, was still capable of being complete enough to be used for the rest of its own development. There's little question that, in less than a month, 386BSD Release 0.0 was an unqualified success.
386BSD Release 0.1--The Second Stage
386BSD Release 0.1 is the most recent release as of this writing. It consists of:
For limited program development, a 386/486 system should contain at least two Mbytes of RAM and a 40-Mbyte hard disk. To make full use of the source tree and generate new software distributions, a 200-Mbyte disk is recommended. (You can also use 386BSD's version of NFS to obtain space via the Ethernet off a central shared server.) Performance obviously improves with faster processors and more memory.
Just in case anyone is wondering, the entire 386BSD system was created on a 386SX laptop with three Mbytes of RAM and one 100-Mbyte disk.
What's in 386BSD Release 0.1
Thanks to many knowledgeable users, 386BSD 0.1 is a more robust version of 386BSD, supporting broader combinations of PC hardware and simpler installation procedures. 386BSD also provides for more features and functionality.
386BSD 0.1 also contains many utilities which can be used in development work (see Table 1), including a C compiler, C++ compiler, loader, network protocol family (TCP/IP), and so forth. 386BSD also contains a complete set of Internet networking facilities (including NFS), a program development environment for gigabyte-sized programs, document-preparation and text-editing tools, and database mechanisms. And finally, it can rebuild itself from its own source tree.
Table 1: 386BSD Release 0.1 utilities.
apropos env lpr pwd timed ar eqn lprm query timedc arp expand lptest ranlib tip as expr ls rcp tn3270 bad144 false m4 rdist touch badsect find machine rdump tput basename finger mail reboot tr biff fmt mailstats renice trace cal fold make restore traceroute calendar from man rlogin troff cat fsck mesg rm true cc fstat mkdep rmail tsort checknr ftp mkdir rmdir tty chgrp g++ mkfifo rmt tunefs chmod gcc mknod route ul chown gdb mkstr routed umount chpass genclass more rrestore uncompress chroot grep mount rsh unexpand cksum groff mountd savecore unifdef clear grops mset script uniq clri grotty mtree sed unvis cmp groups mv sh update col halt named shar uptime colcrt head newfs showmount users colrm hexdump nfsd shutdown uudecode column hostname nfsiod size uuencode comm id nfsstat slattach vacation compress ifconfig nice sleep vipw config inetd nld sliplogin vis cp init nm soelim w cpio install nohup split wall cpp kdump nroff strings wc csh kill nslookup strip what ctags ktrace nsquery stty whatis cu last nstest su whereis cut ld old swapon which date leave pac symorder who dd lex pagesize sync whoami df ln passwd syslogd whois dirname locate paste talk write disklabel lock pic tar xargs diskpart logger ping tbl xstr du login portmap tee yacc dump logname printenv telnet yes dumpfs lpc printf test yyfix echo lpd ps tftp zcat elvis lpq psroff time
Qualifying a PC to Run 386BSDRelease 0.1 can be run in as little as a single floppy disk, using the Tiny 386BSD diskette available through the DDJ Careware Project. Send us a formatted, error-free, high-density 3.5 or 5.25 floppy diskette and an addressed, stamped diskette mailer, in care of: Tiny 386BSD, Dr. Dobb's Journal, 411 Borel Ave., San Mateo, CA 94402, and we'll send you the latest copy. There's no charge, but if you want to slip in a dollar or so to help out the kids at the Children's Support League of the East Bay, we know they'd appreciate it. (You can also obtain this software directly from the sites mentioned above.) In addition to experimenting with a very minimal 386BSD system prior to loading any software on the hard disk, Tiny 386BSD allows you to validate 386BSD operation on a PC. Simply insert the floppy into the drive and boot up the PC. If it boots and prompts you for a shell command (#), you're ready for installation of the rest of the system. If it fails, it's time to skull out the PC configuration, jumpers, BIOS setup menu, and all the other little "bright spots" that make for interesting compatibility problems. The general rule here is to isolate the problem by comparing cases that work with those that don't until an explanation can be formed. In general, nifty hardware features are the source of most compatibility problems, along with bizarre hardware combinations that are "on the edge." Both should be avoided or defeated when they are behaving suspiciously. Mainstream hardware from patient and understanding firms helps a great deal. Another problem arises with non-standard "old" equipment that you just happen to have lying around. Do yourself a favor and leave these particular PCs to MS-DOS, since other hidden surprises possibly await. In short, avoid the "pathological" cases wherever possible.
Installing 386BSD Release 0.1To install the rest of 386BSD, we must allocate a large portion (greater than or equal to 40 Mbytes) of formatted disk space on a hard disk--either the entire contents of a disk drive or the remaining contents of a disk drive after other systems have been partitioned. The process discussed here is an exact duplicate of the mechanism we devised five years ago for system-installation procedures on Symmetric Computer Systems' 375 computers. (This was contributed to Berkeley, and parts appeared in the 4.3BSD Tahoe release.) Since 386BSD 0.1 is experimental software, we recommend that it be run with a dedicated disk on a dedicated system, until it matures. Disk space must be formatted by a utility. IDE and SCSI drives are already preformatted. ESDI controllers have formatting programs in ROM that can be run from a MS-DOS Debug utility, and the geometry of the drive can be obtained from these programs (in terms of cylinders, tracks or heads, and sectors). ESDI drives use the last cylinder to hold bad block tables; currently these are not used, and the last cylinder must be ignored. In addition, since 386BSD uses its own bad block revectoring (a la DEC standard 144), sector sparing should not be used. If possible, the formatted drive should have the same low-level geometry of the hard drive itself. However, drives greater than 1024 cylinders are run in a logical translation mode by the disk controller to make up for a limitation in MS-DOS. While this logical formatting will work, the 386BSD file system will not be as efficient, since its clever rotational placement algorithms won't mesh with what the physical drive is actually doing. With the drive geometry information in hand, a disktab entry describing how 386BSD is to use the disk space must be written; Example 1 is a sample disktab entry. In general, we prefer a 5- to 10-Mbyte root partition, a swap partition about twice as big as the amount of RAM memory, and a /usr partition that contains the remainder. Each partition has a size, offset, and type associated with it. Both size and type are in units of sectors, and each partition is arranged to start at the beginning of a cylinder, so that the rotational placement algorithm won't be thrown off by a logical partition offset. We then use the disklabel command from the floppy-based system (analogous to fdisk) to install a machine-readable version of the disktab entry onto the hard disk, along with a bootstrap program.
cp3100|Connor Peripherals 100MB IDE:\ :dt=ST506:ty=winchester:se#512:nt#8:ns#33:nc:#766:sf:\ :pa#12144:oa#0:ta=4.2BSD:ba#4096:fa#512:\ :pb#12144:ob#12144:tb=swap:\ :pc#202224:oc#0: \ :ph#177936:oh#24288:th=4.2BSD:bh#4096:fh#512:
Once the hard-disk configuration is completed, we must do a "high-level" formatting of the 386BSD partitions that will hold files. Analogous to the MS-DOS format program that creates a blank file structure on a hard disk, the newfs program is executed off the floppy and initializes the root and user partitions of the hard disk.
Next, the root partition is made accessible as a file system by means of the mount command, and the contents are transferred from the floppy-based system to the hard-disk root file system and dismounted, making the hard disk bootable. The floppy-based system is shut down gracefully, and the hard-disk version booted in its stead. At this point, the floppy disk can now be used to load on the remainder of the system. We mount the empty user file system and proceed to reload the file system with the tar utility to extract the system from a multivolume floppy dump.
For those with access, the boot floppy allows the restore to occur over the network, thus eliminating the need for extracting from floppy dumps.
All the configuration files are located in the /etc directory of the root file system, including brief notes on setting up the system. The elvis text editor can be used to modify them as needed. Further configuration and expansion can be accomplished by loading the sources from another multivolume floppy dump, and recompiling the system and its utilities.
386BSD documentation, including the installation procedures for the rest of 386BSD (binary and/or source), should be available as part of the online 386-BSD release. If it is not online, contact the sysop or moderator to have it installed, and send e-mail via CompuServe at 76703,4266.
Perspective: The Importance of Thinking Small
In the spirit of "running light without overbyte," 386BSD is a minimalist system. This approach has allowed us to easily discuss the important paradigms effectively leveraged in UNIX and other modern operating systems. Over the course of this series, our minimalist approach has forced us to cleave to a basic understanding of the functional core of the system, and not get bogged down in the minutiae of building obscure utilities. It has also provided us with a bit of "editorial" oversight on the contents of our system. Occasionally, it is as necessary to discard an item as it is to create one--otherwise, we would be "hip deep" in relics held past their prime. In addition, a minimalist system is an excellent educational and training platform in the teaching of operating systems, net-working, file systems, C++, and software management.
Another virtue of our minimalist approach is that the sizes of the source and the operating binaries was greatly reduced in bulk. Paring down redundant utilities and source code increases ease of use without loss of functionality.
Where is 386BSD Heading
In subsequent releases, we expect 386BSD to grow in both size of distribution and stature of function quality, without losing its minimalist design. Some topics now ripe for exploration are as follows:
Farewell to the Porting Series--Onward to New Topics
With the completion of 386BSD and its widespread availability, it's time to bid farewell to our "Porting UNIX to the 386" series. After 17 installments (and, believe it or not, quite a few shortcuts), we actually finished our port, and we are happy that people can finally use the system about which we have spent so long writing.
With each new version of 386BSD, we hope to see it become more affordable, available, accessible, modifiable, and understandable. 386BSD still has quite a way to go towards becoming a mature operating system, but already it has traveled the "useful" portion of the distance.
As such, we intend to explore topics such as networking, which impact not only 386BSD, but modern operating systems in general. While we may revisit 386BSD in our discussions, it is important to view it in the context of other modern operating systems approaches on the UNIX side (Plan 9, Mach, Minix, and the like) and in the broader commercial domain (MS-DOS, Windows-NT, OS/2 2.0, and so forth). 386BSD is really a microcosm of what these "big" operating systems are all about.
Given support and encouragement, we also intend to continue the educational and research direction upon which 386BSD was based, and we will continue to assist other groups who wish to head in this direction with us. However, the growth of 386BSD and discussion of new approaches depends on the continued goodwill and enthusiasm of its user base. Everyone is welcome to participate in this process.
Bill was the principal developer of 2.8 and 2.9BSD and was the chief architect of National Semiconductor's GENIX project, the first virtual-memory, microprocessor-based UNIX system. Prior to establishing TeleMuse, a market research firm, Lynne was vice president of marketing at Symmetric Computer Systems. They conduct seminars on BSD, ISDN, and TCP/IP. Send e-mail questions or comments to email@example.com. (c) 1992 TeleMuse.
June 1992 - Porting Unix to the 386: MISSING PIECES, PART II - A "bare-bones" execve( ) system call is implemented this month.
May 1992 - Porting Unix to the 386: MISSING PIECES, PART 1 - Over the next couple of months, we present the glue that lets you build an operational kernel.Copyright © 1992, Dr. Dobb's Journal