logo
Published on KernelTrap (http://kerneltrap.org)

The 0.11 Release

By Jeremy
Created Sep 13 2007 - 05:24

"This version has a lot of corrections, and is stable at least on my machine," noted Linus Torvalds in the 0.11 Linux kernel release announcment [1], "I /hope/ every known bug is fixed, but no promises (and all unknown bugs are still there, probably with reinforcements ;-)". The 0.11 kernel was released on December 8th, 1991, gaining demand loading, the mkfs, fsck and fdisk utilities, improved floppy drivers, a console that could generate beeps, support for US, German, French and Finnish keyboards, and settable line-speeds for the com ports (instead of having them hard-coded to 2400bps). Noticeably lacking was support for SCSI, an init/login system (Linux 0.11 booted into a root bash prompt), and paging to disk:

"Although I have a somewhat working VM (paging to disk), it's not ready yet. Thus linux needs at least 4M to be able to run the GNU binaries (especially gcc). It boots up in 2M, but you cannot compile."

Leading up to the 0.11 release, Linus posted what was then roughly a weekly email to the linux-activists mailing list [2] summarizing the current status of the quickly evolving kernel. In late November he noted [3]:

"0.11 will also finally be totally self-sustaining: I have gotten the source to bruce evans' assembler and linker, and at least I haven't heard of many problems with mkfs and fsck. I didn't have time to implement symlinks, so there are no real new features: just bug-fixes and enhancements. Thanks to everybody who sent diffs etc. You know who you are, and I've tried to accnowledge everyone in the source. Wolfgang XXXX, who made the German keyboard patch, please mail me your last name."

mkfs:
One of the new utilities first released with the 0.11 kernel was mkfs. Linus noted, "it works on my system (limited testing), and hopefully we can get possible bugs ironed out in time for 0.11". He posted the full source code [4] for the utility to the mailing list and explained:

"This mkfs has two modes: checking and reckless. On a disk that you know has no problems, you just write 'mkfs /dev/hdx size', and you should have a new system (DON'T do this on a mounted drive: unlike fsck there is NO way that will work, and you'll probably mess it up completely.)

"On a disk with possible read-errors, use 'mkfs -c /dev/hdx size', which will read all the blocks and mark those unreadable into a special file '/.badblocks'. I'm not making any guarantees. This is a fast hack (mainly yesterday and today), and I have tested only on small filesystems, faking errors by telling mkfs that the filesystem is bigger than it actually is. If you think the algorithm for marking bad blocks is weird: you're right."

Demand Loading
Peter MacDonald offered to implement [5] demand paging from the filesystem if Linus agreed to add it into the Linux kernel when finished. Linus retorted [6], "If I /agree/ to add it to linux? If anybody implements paging, he's going to get 2 extra copies of linux for free. How's that for an offer?" He went on to explain:

"Seriously, adding demand-loading should be relatively easy. I wouldn't suggest going past the filesystem, even for saving the block-numbers somewhere (and a bit-map won't do it, block nr must be ordered). Having the inode-pointer in the process table entry (and not releasing it before an exit), and using that to find the blocks wouldn't be too hard. A bit slower, but conceptually much easier. Then you can use the routines already on hand (map() etc).

"Note that the 'relatively easy' must be taken with a bit of salt: you have to add the routines to the paging unit etc etc. No major problems at least. Also I'd like to keep linux simple even at the cost of some speed hit, as otherwise it grows until nobody really understands it. I'm kinda proud of my mm: it's not many lines of code (although it's not very clear code.)"

In an earlier email [7], Linus highlighted some of the problems with demand-loaded executables, noting that the main problem was that the locking mechanism of the Minix filesystem wasn't meant for it. He added, "and it would be MUCH easier to implement if BLOCK_SIZE was 4096 (= one page) instead of the current 1024. This of course means waste of disk-space. The problem with the minix filesystem isn't that serious: I'll have to move on to something else anyway - 64M partitions can be limiting for those who have disks big enough to hold them (and the afore-mentioned 64Mb limit even for direct read/writes.. This I can try to do something about)."

Linux Information Sheet
One day after the release of the 0.11 kernel, Robert Blum posted the first Linux Information Sheet, a predecessor of the eventual Linux kernel FAQ. The info sheet began with a description of Linux:

"LINUX 0.11 is a freely distributable UNIX clone. It is almost fully System V compatible. LINUX has been written from scratch, and therefore does not contain any AT&T or MINIX code--not in the kernel, the compiler, the utilities, or the libraries. For this reason it can be made available with the complete source code via anonymous FTP. Sorrily, it runs only on 386/486 AT-bus-machines. EISA will probably do too, but you need an AT-Bus controller for your harddisk.

"Version 0.11 is still a beta release, but it provides almost full functionality. Various users have been able to compile bigger projects like bison/flex by only changing the makefile to their needs, and these tools are fully functional."

The document also mentioned the license that the early Linux kernels were released under, "although LINUX is supplied with the complete source code, it is copyrighted software. But it is, opposite to MINIX available for free, provided you obey to the rules specified in the LINUX copyright." Linus Torvalds would later describe [8], the original Linux license as "much more restrictive than the GNU copyleft," due to a condition in it that stated, "you may not distribute [Linux] for money". The original license was not officially changed to the GPL until February 1st, 1992, announced along with the 0.12 release.

Bugs:
A few minutes after announcing the 0.11 kernel, Linus posted a followup [9] to say he'd already discovered a bug:

"It seems God hates me or something: 5 minutes after sending out linux-0.11 I found a bug. This one also explains why corsini has had problems with uemacs: I had the meaning of ISIG reversed in the kernel. Happily the bug is not very important, and correcting it breaks /my/ version of uemacs, but I'm a bit shamefaced.

"The bug is in linux/kernel/char_drv/tty_io.c: search for the line containing 'if (!L_ISIG' and remove the incorrect '!'. I'll make a new kernel binary available, as well as a new uemacs. Hopefully nobody ever even gets to see the bad versions.

"I guess we'll have to rename the system: wirzeniu already suggested the name 'buggyx' :-)"

He followed up a few days later [10] with additional bug reports that would all be addressed in the 0.12 kernel.

0.11 Release Announcement:

From: Linus Benedict Torvalds 
Subject: linux-0.11 available [11]
Date: December 8, 1991 - 8:51am

The subject says it all: I have uploaded linux version 0.11 to
nic.funet.fi and tupac-amaru.  They won't show up for a while on nic,
but are already visible in pub/msdos/replace/incoming at amaru.  rtx-11
is so slow to use from here that I didn't upload them there: I guess
they'll show up within a couple of days (tytso?). 

The files uploaded were:
	bootimage.Z		- US keyboard compressed bootimage
	rootimage.Z		- 1200kB compressed root image
	linux-0.11.tar.Z	- sources
	as86.tar.Z		- linux binaries for bruce evans'
				  16-bit assembler and loader.
	INSTALL-0.11		- updated install-info

This version has a lot of corrections, and is stable at least on my
machine.  I /hope/ every known bug is fixed, but no promises (and all
unknown bugs are still there, probably with reinforcements ;-).  Those
who like to use caps lock as a ctrl-key, you'll have to re-patch the
kernel.  It's not implemented in the standard version.

		Linus

PS. I'll be a bit busy with the #"$/% physics-course I'm taking, so I
might not be as active on the net this coming week as I would like to.

PPS.  corsini: the problem you have with the recompiled uemacs sounds
like it isn't resetting the ISIG bit in c_lflags when moving to raw
mode. Search for c_lflags in the source: it should effectively be set to
zero (I think) - no signals, no canonical mode etc.



0.11 Installation Notes:

		Using Linux v0.11
		Linus Torvalds 08.12.91

NOTE: Users of 0.10, please check the "changed" list before using 0.11.

		Booting linux

Linux-0.11 can easily be booted by getting the 2 files bootimage-0.11.Z
and rootimage-0.11.Z from the linux archive, uncompressing them and
writing them out to disks of the same size (ie 2 1.44M floppies or 2
1.2M floppies). Writing the disks is done with the "rawrite.exe" program
from dos, or with "dd" from unix. Linux is then booted simply by
inserting the bootdiskette in drive A, and rebooting the machine. If
everything goes well, linux will ask you to insert the root-disk after
loading the system. Hopefully linux will then correctly load the shell
executable, and leave you as root on the new system (prompt '# ').

		Using it.

You can get a complete list of available commands by pressing 
twice: the root-disk contains mostly setup-programs needed to install
the system on a harddisk.  You can test them a bit, reading directories
etc. 

In order to install linux on the harddisk, first check out your harddisk
by executing the command "fdisk" - it should show you all the partitions
available.  If you have only 1 AT-harddisk, you should get a
errormessage, just ignore it.  At my system fdisk reports the following:

/dev/hd1:  20476 blocks minix
/dev/hd2:  19975 blocks minix
/dev/hd3:   1020 blocks minix
/dev/hd4:    170 blocks active 16-bit DOS (>=32M)
/dev/hd6:  41641 blocks active minix

The partition type given (12-bit DOS, minix etc) doesn{t really mean
anything, unless it's a "extended partition", in which case you
shouldn't use that partition for anything: linux doesn't yet understand
them. When later using "mkfs" to make a linux file system, it won't
change the output of fdisk, so fdisk may well report "DOS", while in
fact you have made it a linux partition.

If fdisk doesn't print out anything but errors, linux is unable to read
your harddisk, and you are f**ked.  Play around with the floppy version,
but you won't be able to do anything real.

		Making a filesystem

In order to really use linux, you will have to make a filesystem on your
harddisk. This starts by deciding which partition you can use. Look
again at what fdisk reports, and try to figure out which of the
partitions you are using for DOS, OS/2 etc. /dev/hdX where X={1,2,3,4}
always refers to the first harddisk, X={6,7,8,9} always refers to the
second disk. /dev/hd0 and /dev/hd5 are special: they are all of the
drive, and mkfs will refuse to use them for a filesystem.

When you are certain you know which device points to which partition,
you make a filesystem on the partition of your choice by writing:

	mkfs -c /dev/hdX blocks

where "-c" means that you want mkfs to check for errors, "dev/hdX" is
the free partition you intend to use for linux, and "blocks" is the
number of blocks fdisk reports for that particular partition. NOTE! mkfs
will overwrite the partition you selected, so be doubly (or triply) sure
that you don't mind that.

Note that when using the "-c" flag, mkfs will read through the entire
partition: this can take some time. If there are read errors, mkfs will
mark the particular block as bad, and continue: linux will also print a
little message "harddisk I/O error". After running mkfs these messages
should never occur again: if they do, your data may be corrupted.

		Mounting the filesystem

After mkfs has exited, it's time to mount the file-system, and do the
necessary things to make it a root file system. Mount the new filesystem
on /user by writing:

	cd /
	mount /dev/hdX /user

If you get errors for this, mkfs failed, and there is probably something
seriously wrong.

After mounting the device, you want to move all the files on the current
floppy-root to the new fs. This can most easily be done by writing:

	cd /user
	for i in bin dev etc usr tmp floppy
	do
	cp +recursive +verbose /$i $i
	done
	sync

which will also tell you what it is doing (/bin/sh -> bin/sh etc).

After that, you should have a new filesystem that contains the bare
necessities to start hacking linux. Play around some more, and exit
linux by writing "logout or exit". This should result in

	child 4 died with error code 0000
	#

Do a couple of syncs (3 is a magic number), and reboot the machine.
ALWAYS remember to sync before rebooting: terrible things happen if you
don't.

		Using the harddisk as root

Once you have happily made a new root, you will want to boot up with it.
This is done by changing a word at offset 508 in the boot-image. The
word (in 386-order, ie low byte first) tells the system which device to
use as root: it is initially 0, which means that we want to use a floppy
of the same type as the boot-disk (and this is the reason that you may
not use a 360kB boot-disk even though the system fits on one: it has to
be the same type as the root-diskette).

In order to use the harddisk as root, this value has to be changed to
point to the correct device. Harddisks have a major number of 3 under
linux, and the minor nr is the same as the number X in /dev/hdX. The
complete device number is then calculated with

	DEV_NO = (major<<8)+minor

or alternatively major*256+minor. Thus /dev/hd1 is (3<<8)+1 = 0x301,
/dev/hd6 = 0x0306 etc. Assuming the partition you made into the new root
was /dev/hd2, you will have to write 0x0302 into the boot-image. That
is, you should change the 508th byte in the image to 0x02, and the 509th
byte to 0x03. There is a sample program for this in some of the older
INSTALL-notes, if you don't understand what it's all about.

		Ok, I got the root on hd, what now?

As you have probably noticed, you cannot get very far with the binaries
found on the original root-diskette. So the first thing you want to do
is to import some new binaries. To do this you need to tell linux what
kind of floppies you have, as that's the easiest way to import things.

As with harddisk, floppies have device numbers, but this time major = 2
instead of 3. The minor number is not as easy: it's a composite that
tells which drive (A, B, C or D) and what type of drive (360kB, 1.2M,
1.44M etc). The formula is 'minor = type*4+nr', where nr is 0-3 for A-D,
and type is 2 for 1.2M disks, and 7 for 1.44M disks. There are other
types, but these should suffice for now.

Thus if you have a 1.2M A-drive, and want to call it "floppy0", you have
to tell linux so. This is done with the "mknod" command. mknod takes 4
paramters: the unix name of the device, a "b" or a "c" depending on
whether it's a Block of Character device, and the major and minor
numbers. Thus to make "floppy0" a 1.2M A-drive, you write:

	mknod /dev/floppy0 b 2 8

b is for Block-device, the 2 is for floppy, and the 8 is 4*2+0, where
the 2 is 1.2M-drive and the 0 is drive A. Likewise to make a "floppy1"
device that is a 1.44M drive in B, you write:

	mknod /dev/floppy1 b 2 29

where 29 = 4*7 + 1.  There are a couple of standard names, for users
that are used to minix (major, minor in parentheses): /dev/PS0 is a
1.44M in A (2,28), /dev/PS1 a 1.44M in B (2,29), /dev/at0 is a 1.2M in A
(2,8), /dev/at1 is a 1.2M in B (2,9). Use mknod to make those that fit
your computer.

After you have made these special block devices, you can now read a
floppy under linux. The easiest way to import things into linux is by
writing a tar-file to a floppy with rawrite.exe, and then using:

	tar xvf /dev/floppy0

to untar it under linux. This way you can get the gcc binaries etc
available from the linux-carrying sites.

		Changes from 0.10:

- /bin/update is no longer automatically executed upon bootup: instead
the file /etc/rc is evaluated by the shell. This file can then start the
update process, mount andy needed filesystems, possibly fsck'ing them
first. A minimal /etc/rc looks like this:

	/bin/update &
	> /etc/mtab
	echo " Ok."

- init() restarts the shell every time it is exited: logout from the
login shell results in a "child xxx died with error code yyy", a sync
and then a new shell as root.

- floppies work a lot better than in 0.10. Even using two floppies at
the same time seems to work out ok. Reading big chunks at a time is also
faster then in 0.10 (I think).

- harddisk errors are handled better. Use the "-c" option in mkfs to map
out all errors.

- linux accepts most video-cards: harcules, MDA, CGA etc seem to work.

- ^G beeps on the console, so command completion under bash etc will
notify of errors.

- sticky directories, corrected handling of uid/gid bits, and better
handling of protections when not root. Most of these won't be noticeable
until we get a init/login.

Source URL:
http://kerneltrap.org/Linux/The_0.11_Release