add directory Linux-0.01
This commit is contained in:
BIN
Linux-0.01/binaries/sbin/update.Z
Normal file
BIN
Linux-0.01/binaries/sbin/update.Z
Normal file
Binary file not shown.
BIN
Linux-0.01/binaries/usr.bin/grep-1.5.bin.tar.Z
Normal file
BIN
Linux-0.01/binaries/usr.bin/grep-1.5.bin.tar.Z
Normal file
Binary file not shown.
114
Linux-0.01/docs/INSTALLATION
Normal file
114
Linux-0.01/docs/INSTALLATION
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
|
||||||
|
|
||||||
|
Installing Linux on your system
|
||||||
|
|
||||||
|
Ok, this is a short guide for those people who actually want to get a
|
||||||
|
running system, not just look at the pretty source code :-). You'll
|
||||||
|
certainly need minix for most of the steps.
|
||||||
|
|
||||||
|
|
||||||
|
0. Back up any important software. This kernel has been
|
||||||
|
working beautifully on my machine for some time, and has never destroyed
|
||||||
|
anything on my hard-disk, but you never can be too careful when it comes
|
||||||
|
to using the disk directly. I'd hate to get flames like "you destroyed
|
||||||
|
my entire collection of Sam Fox nude gifs (all 103 of them), I'll hate
|
||||||
|
you forever", just because I may have done something wrong.
|
||||||
|
|
||||||
|
Double-check your hardware. If you are using other than EGA/VGA, you'll
|
||||||
|
have to make the appropriate changes to 'linux/kernel/console.c', which
|
||||||
|
may not be easy. If you are able to use the at_wini.c under minix,
|
||||||
|
linux will probably also like your drive. If you feel comfortable with
|
||||||
|
scan-codes, you might want to hack 'linux/kernel/keyboard.s' making it
|
||||||
|
more practical for your [US|German|...] keyboard.
|
||||||
|
|
||||||
|
|
||||||
|
1. Decide on what root device you'll be using. You can use any
|
||||||
|
(standard) partition on any of your harddisks, the numbering is the same
|
||||||
|
as for minix (ie 0x306, which I'm using, means partition 1 on hd2). It
|
||||||
|
is certainly possible to use the same device as for minix, but I
|
||||||
|
wouldn't recommend it. You'd have to change pathnames (or make a chroot
|
||||||
|
in init) to get minix and linux to live together peacefully.
|
||||||
|
|
||||||
|
I'd recommend making a new filesystem, and filling it with the necessary
|
||||||
|
files: You need at least the following:
|
||||||
|
|
||||||
|
- /dev/tty0 (same as under minix, ie mknod ...)
|
||||||
|
- /dev/tty (same as under minix)
|
||||||
|
- /bin/sh (link to bash)
|
||||||
|
- /bin/update (I guess this should be /etc/update ...)
|
||||||
|
|
||||||
|
Note that linux and minix binaries aren't compatible, although they use
|
||||||
|
the same (gcc-)header (for ease of cross-compiling), so running one
|
||||||
|
under the other will result in errors.
|
||||||
|
|
||||||
|
|
||||||
|
2. Compile the source, making necessary changes into the
|
||||||
|
makefiles and linux/include/linux/config.h and linux/boot/boot.s. I'm
|
||||||
|
using a slightly hacked gcc-1.40, to which I have added a -mstring-insns
|
||||||
|
flag, which uses the i386 string instructions for structure copy etc.
|
||||||
|
Removing the flag from all makefiles should do the trick for you.
|
||||||
|
|
||||||
|
NOTE! I'm using -Wall, and I'm not seeing many warnings (2 I think, one
|
||||||
|
about _exit returning although it's volatile - it's ok.) If you get
|
||||||
|
more warnings when compiling, something's wrong.
|
||||||
|
|
||||||
|
|
||||||
|
3. Copy the resultant code to a diskette of the right type.
|
||||||
|
Use 'cp Image /dev/PS0' or equivalent.
|
||||||
|
|
||||||
|
|
||||||
|
4. Boot with the new diskette. If you've done everything right
|
||||||
|
(and if *I've* done everything right), you should now be running bash as
|
||||||
|
root. You can't do much (alias ls='echo *' is a good idea :-), but if
|
||||||
|
you do run, most other things should work. I'd be happy to hear from
|
||||||
|
anybody that has come this far - and I'll send any ported binaries you
|
||||||
|
might want (and I have). I'll also put them out for ftp if there is
|
||||||
|
enough interest. With gcc, make and uemacs, I've been able to stop
|
||||||
|
crosscompiling and actually compile natively under linux. (I also have
|
||||||
|
a term-emu, sz/rz, sed, etc ...)
|
||||||
|
|
||||||
|
The boot-sequence should start with "Loading system...", and then a
|
||||||
|
"Partition table ok" followed by some root-dev info. If you forget to
|
||||||
|
make the /dev/tty0-character device, you'll never see anything but the
|
||||||
|
"loading" message. Hopefully errors will be told to the console, but if
|
||||||
|
there are problems at boot-up there is a distinct possibility that the
|
||||||
|
machine just hangs.
|
||||||
|
|
||||||
|
|
||||||
|
5. Check the new filesystem regularly with (minix) fsck. I
|
||||||
|
haven't got any errors for some time now, but I cannot guarantee that
|
||||||
|
this means it will never happen. Due to slight differences in 'unlink',
|
||||||
|
fsck will report "mode inode XXX not cleared", but that isn't an error,
|
||||||
|
and you can safely ignore it (if you don't like it, do a fsck -a every
|
||||||
|
once in a while). Minix "restore" will not work on a file deleted with
|
||||||
|
linux - so be extra careful if you have a tendency to delete files you
|
||||||
|
don't really want to.
|
||||||
|
|
||||||
|
Logging out from the "login-shell" will automatically do a sync, and
|
||||||
|
will leave you hanging without any processes (except update, which isn't
|
||||||
|
much fun), so do the "three-finger-salute" to restart dos/minix/linux or
|
||||||
|
whatever.
|
||||||
|
|
||||||
|
|
||||||
|
6. Mail me and ask about problems/updates etc. Even more
|
||||||
|
welcome are success-reports (yeah, sure), and bugreports or even patches
|
||||||
|
(or pointers to corrections).
|
||||||
|
|
||||||
|
|
||||||
|
NOTE!!! I haven't included diffs with the binaries I've posted for the
|
||||||
|
simple reason that there aren't any - I've had this silly idea that I'd
|
||||||
|
rather change the OS than do a lot of porting. All source to the
|
||||||
|
binaries can be found on nic.funet.fi under /pub/gnu or /pub/unix.
|
||||||
|
Changes have been to makefiles or configuration files, and anybody
|
||||||
|
interested in them might want to contact me. Mostly it's been a matter
|
||||||
|
of adding a -DUSG to makefiles.
|
||||||
|
|
||||||
|
The one exception if gcc - I've made some hacks on it (string-insns),
|
||||||
|
and have got it (with the gracious help of Bruce Evans) to correctly
|
||||||
|
emit software floating point. I haven't got diffs to that one either, as
|
||||||
|
my hard-disk is overflowing and I cannot accomodate both originals and
|
||||||
|
changes, but as per the GNU copyleft I'll make them available if
|
||||||
|
someone wants them. I hope nobody want's them :-)
|
||||||
|
|
||||||
|
|
||||||
|
Linus torvalds@kruuna.helsinki.fi
|
||||||
BIN
Linux-0.01/docs/Linux.dvi
Normal file
BIN
Linux-0.01/docs/Linux.dvi
Normal file
Binary file not shown.
BIN
Linux-0.01/docs/Linux.pdf
Normal file
BIN
Linux-0.01/docs/Linux.pdf
Normal file
Binary file not shown.
2976
Linux-0.01/docs/Linux.ps
Normal file
2976
Linux-0.01/docs/Linux.ps
Normal file
File diff suppressed because it is too large
Load Diff
254
Linux-0.01/docs/RELNOTES-0.01
Normal file
254
Linux-0.01/docs/RELNOTES-0.01
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Notes for linux release 0.01
|
||||||
|
|
||||||
|
|
||||||
|
0. Contents of this directory
|
||||||
|
|
||||||
|
linux-0.01.tar.Z - sources to the kernel
|
||||||
|
bash.Z - compressed bash binary if you want to test it
|
||||||
|
update.Z - compressed update binary
|
||||||
|
RELNOTES-0.01 - this file
|
||||||
|
|
||||||
|
|
||||||
|
1. Short intro
|
||||||
|
|
||||||
|
|
||||||
|
This is a free minix-like kernel for i386(+) based AT-machines. Full
|
||||||
|
source is included, and this source has been used to produce a running
|
||||||
|
kernel on two different machines. Currently there are no kernel
|
||||||
|
binaries for public viewing, as they have to be recompiled for different
|
||||||
|
machines. You need to compile it with gcc (I use 1.40, don't know if
|
||||||
|
1.37.1 will handle all __asm__-directives), after having changed the
|
||||||
|
relevant configuration file(s).
|
||||||
|
|
||||||
|
As the version number (0.01) suggests this is not a mature product.
|
||||||
|
Currently only a subset of AT-hardware is supported (hard-disk, screen,
|
||||||
|
keyboard and serial lines), and some of the system calls are not yet
|
||||||
|
fully implemented (notably mount/umount aren't even implemented). See
|
||||||
|
comments or readme's in the code.
|
||||||
|
|
||||||
|
This version is also meant mostly for reading - ie if you are interested
|
||||||
|
in how the system looks like currently. It will compile and produce a
|
||||||
|
working kernel, and though I will help in any way I can to get it
|
||||||
|
working on your machine (mail me), it isn't really supported. Changes
|
||||||
|
are frequent, and the first "production" version will probably differ
|
||||||
|
wildly from this pre-alpha-release.
|
||||||
|
|
||||||
|
Hardware needed for running linux:
|
||||||
|
- 386 AT
|
||||||
|
- VGA/EGA screen
|
||||||
|
- AT-type harddisk controller (IDE is fine)
|
||||||
|
- Finnish keyboard (oh, you can use a US keyboard, but not
|
||||||
|
without some practise :-)
|
||||||
|
|
||||||
|
The Finnish keyboard is hard-wired, and as I don't have a US one I
|
||||||
|
cannot change it without major problems. See kernel/keyboard.s for
|
||||||
|
details. If anybody is willing to make an even partial port, I'd be
|
||||||
|
grateful. Shouldn't be too hard, as it's tabledriven (it's assembler
|
||||||
|
though, so ...)
|
||||||
|
|
||||||
|
Although linux is a complete kernel, and uses no code from minix or
|
||||||
|
other sources, almost none of the support routines have yet been coded.
|
||||||
|
Thus you currently need minix to bootstrap the system. It might be
|
||||||
|
possible to use the free minix demo-disk to make a filesystem and run
|
||||||
|
linux without having minix, but I don't know...
|
||||||
|
|
||||||
|
|
||||||
|
2. Copyrights etc
|
||||||
|
|
||||||
|
|
||||||
|
This kernel is (C) 1991 Linus Torvalds, but all or part of it may be
|
||||||
|
redistributed provided you do the following:
|
||||||
|
|
||||||
|
- Full source must be available (and free), if not with the
|
||||||
|
distribution then at least on asking for it.
|
||||||
|
|
||||||
|
- Copyright notices must be intact. (In fact, if you distribute
|
||||||
|
only parts of it you may have to add copyrights, as there aren't
|
||||||
|
(C)'s in all files.) Small partial excerpts may be copied
|
||||||
|
without bothering with copyrights.
|
||||||
|
|
||||||
|
- You may not distibute this for a fee, not even "handling"
|
||||||
|
costs.
|
||||||
|
|
||||||
|
Mail me at "torvalds@kruuna.helsinki.fi" if you have any questions.
|
||||||
|
|
||||||
|
Sadly, a kernel by itself gets you nowhere. To get a working system you
|
||||||
|
need a shell, compilers, a library etc. These are separate parts and may
|
||||||
|
be under a stricter (or even looser) copyright. Most of the tools used
|
||||||
|
with linux are GNU software and are under the GNU copyleft. These tools
|
||||||
|
aren't in the distribution - ask me (or GNU) for more info.
|
||||||
|
|
||||||
|
|
||||||
|
3. Short technical overview of the kernel.
|
||||||
|
|
||||||
|
|
||||||
|
The linux kernel has been made under minix, and it was my original idea
|
||||||
|
to make it binary compatible with minix. That was dropped, as the
|
||||||
|
differences got bigger, but the system still resembles minix a great
|
||||||
|
deal. Some of the key points are:
|
||||||
|
|
||||||
|
- Efficient use of the possibilities offered by the 386 chip.
|
||||||
|
Minix was written on a 8088, and later ported to other
|
||||||
|
machines - linux takes full advantage of the 386 (which is
|
||||||
|
nice if you /have/ a 386, but makes porting very difficult)
|
||||||
|
|
||||||
|
- No message passing, this is a more traditional approach to
|
||||||
|
unix. System calls are just that - calls. This might or might
|
||||||
|
not be faster, but it does mean we can dispense with some of
|
||||||
|
the problems with messages (message queues etc). Of course, we
|
||||||
|
also miss the nice features :-p.
|
||||||
|
|
||||||
|
- Multithreaded FS - a direct consequence of not using messages.
|
||||||
|
This makes the filesystem a bit (a lot) more complicated, but
|
||||||
|
much nicer. Coupled with a better scheduler, this means that
|
||||||
|
you can actually run several processes concurrently without
|
||||||
|
the performance hit induced by minix.
|
||||||
|
|
||||||
|
- Minimal task switching. This too is a consequence of not using
|
||||||
|
messages. We task switch only when we really want to switch
|
||||||
|
tasks - unlike minix which task-switches whatever you do. This
|
||||||
|
means we can more easily implement 387 support (indeed this is
|
||||||
|
already mostly implemented)
|
||||||
|
|
||||||
|
- Interrupts aren't hidden. Some people (among them Tanenbaum)
|
||||||
|
think interrupts are ugly and should be hidden. Not so IMHO.
|
||||||
|
Due to practical reasons interrupts must be mainly handled by
|
||||||
|
machine code, which is a pity, but they are a part of the code
|
||||||
|
like everything else. Especially device drivers are mostly
|
||||||
|
interrupt routines - see kernel/hd.c etc.
|
||||||
|
|
||||||
|
- There is no distinction between kernel/fs/mm, and they are all
|
||||||
|
linked into the same heap of code. This has it's good sides as
|
||||||
|
well as bad. The code isn't as modular as the minix code, but
|
||||||
|
on the other hand some things are simpler. The different parts
|
||||||
|
of the kernel are under different sub-directories in the
|
||||||
|
source tree, but when running everything happens in the same
|
||||||
|
data/code space.
|
||||||
|
|
||||||
|
The guiding line when implementing linux was: get it working fast. I
|
||||||
|
wanted the kernel simple, yet powerful enough to run most unix software.
|
||||||
|
The file system I couldn't do much about - it needed to be minix
|
||||||
|
compatible for practical reasons, and the minix filesystem was simple
|
||||||
|
enough as it was. The kernel and mm could be simplified, though:
|
||||||
|
|
||||||
|
- Just one data structure for tasks. "Real" unices have task
|
||||||
|
information in several places, I wanted everything in one
|
||||||
|
place.
|
||||||
|
|
||||||
|
- A very simple memory management algorithm, using both the
|
||||||
|
paging and segmentation capabilities of the i386. Currently
|
||||||
|
MM is just two files - memory.c and page.s, just a couple of
|
||||||
|
hundreds of lines of code.
|
||||||
|
|
||||||
|
These decisions seem to have worked out well - bugs were easy to spot,
|
||||||
|
and things work.
|
||||||
|
|
||||||
|
|
||||||
|
4. The "kernel proper"
|
||||||
|
|
||||||
|
|
||||||
|
All the routines handling tasks are in the subdirectory "kernel". These
|
||||||
|
include things like 'fork' and 'exit' as well as scheduling and minor
|
||||||
|
system calls like 'getpid' etc. Here are also the handlers for most
|
||||||
|
exceptions and traps (not page faults, they are in mm), and all
|
||||||
|
low-level device drivers (get_hd_block, tty_write etc). Currently all
|
||||||
|
faults lead to a exit with error code 11 (Segmentation fault), and the
|
||||||
|
system seems to be relatively stable ("crashme" hasn't - yet).
|
||||||
|
|
||||||
|
|
||||||
|
5. Memory management
|
||||||
|
|
||||||
|
|
||||||
|
This is the simplest of all parts, and should need only little changes.
|
||||||
|
It contains entry-points for some things that the rest of the kernel
|
||||||
|
needs, but mostly copes on it's own, handling page faults as they
|
||||||
|
happen. Indeed, the rest of the kernel usually doesn't actively allocate
|
||||||
|
pages, and just writes into user space, letting mm handle any possible
|
||||||
|
'page-not-present' errors.
|
||||||
|
|
||||||
|
Memory is dealt with in two completely different ways - by paging and
|
||||||
|
segmentation. First the 386 VM-space (4GB) is divided into a number of
|
||||||
|
segments (currently 64 segments of 64Mb each), the first of which is the
|
||||||
|
kernel memory segment, with the complete physical memory identity-mapped
|
||||||
|
into it. All kernel functions live within this area.
|
||||||
|
|
||||||
|
Tasks are then given one segment each, to use as they wish. The paging
|
||||||
|
mechanism sees to filling the segment with the appropriate pages,
|
||||||
|
keeping track of any duplicate copies (created at a 'fork'), and making
|
||||||
|
copies on any write. The rest of the system doesn't need to know about
|
||||||
|
all this.
|
||||||
|
|
||||||
|
|
||||||
|
6. The file system
|
||||||
|
|
||||||
|
|
||||||
|
As already mentioned, the linux FS is the same as in minix. This makes
|
||||||
|
crosscompiling from minix easy, and means you can mount a linux
|
||||||
|
partition from minix (or the other way around as soon as I implement
|
||||||
|
mount :-). This is only on the logical level though - the actual
|
||||||
|
routines are very different.
|
||||||
|
|
||||||
|
NOTE! Minix-1.6.16 seems to have a new FS, with minor
|
||||||
|
modifications to the 1.5.10 I've been using. Linux
|
||||||
|
won't understand the new system.
|
||||||
|
|
||||||
|
The main difference is in the fact that minix has a single-threaded
|
||||||
|
file-system and linux hasn't. Implementing a single-threaded FS is much
|
||||||
|
easier as you don't need to worry about other processes allocating
|
||||||
|
buffer blocks etc while you do something else. It also means that you
|
||||||
|
lose some of the multiprocessing so important to unix.
|
||||||
|
|
||||||
|
There are a number of problems (deadlocks/raceconditions) that the linux
|
||||||
|
kernel needed to address due to multi-threading. One way to inhibit
|
||||||
|
race-conditions is to lock everything you need, but as this can lead to
|
||||||
|
unnecessary blocking I decided never to lock any data structures (unless
|
||||||
|
actually reading or writing to a physical device). This has the nice
|
||||||
|
property that dead-locks cannot happen.
|
||||||
|
|
||||||
|
Sadly it has the not so nice property that race-conditions can happen
|
||||||
|
almost everywhere. These are handled by double-checking allocations etc
|
||||||
|
(see fs/buffer.c and fs/inode.c). Not letting the kernel schedule a
|
||||||
|
task while it is in supervisor mode (standard unix practise), means that
|
||||||
|
all kernel/fs/mm actions are atomic (not counting interrupts, and we are
|
||||||
|
careful when writing those) if you don't call 'sleep', so that is one of
|
||||||
|
the things we can count on.
|
||||||
|
|
||||||
|
|
||||||
|
7. Apologies :-)
|
||||||
|
|
||||||
|
|
||||||
|
This isn't yet the "mother of all operating systems", and anyone who
|
||||||
|
hoped for that will have to wait for the first real release (1.0), and
|
||||||
|
even then you might not want to change from minix. This is a source
|
||||||
|
release for those that are interested in seeing what linux looks like,
|
||||||
|
and it's not really supported yet. Anyone with questions or suggestions
|
||||||
|
(even bug-reports if you decide to get it working on your system) is
|
||||||
|
encouraged to mail me.
|
||||||
|
|
||||||
|
|
||||||
|
8. Getting it working
|
||||||
|
|
||||||
|
|
||||||
|
Most hardware dependancies will have to be compiled into the system, and
|
||||||
|
there a number of defines in the file "include/linux/config.h" that you
|
||||||
|
have to change to get a personalized kernel. Also you must uncomment
|
||||||
|
the right "equ" in the file boot/boot.s, telling the bootup-routine what
|
||||||
|
kind of device your A-floppy is. After that a simple "make" should make
|
||||||
|
the file "Image", which you can copy to a floppy (cp Image /dev/PS0 is
|
||||||
|
what I use with a 1.44Mb floppy). That's it.
|
||||||
|
|
||||||
|
Without any programs to run, though, the kernel cannot do anything. You
|
||||||
|
should find binaries for 'update' and 'bash' at the same place you found
|
||||||
|
this, which will have to be put into the '/bin' directory on the
|
||||||
|
specified root-device (specified in config.h). Bash must be found under
|
||||||
|
the name '/bin/sh', as that's what the kernel currently executes. Happy
|
||||||
|
hacking.
|
||||||
|
|
||||||
|
|
||||||
|
Linus Torvalds "torvalds@kruuna.helsinki.fi"
|
||||||
|
Petersgatan 2 A 2
|
||||||
|
00140 Helsingfors 14
|
||||||
|
FINLAND
|
||||||
BIN
Linux-0.01/sources/system/kernel/linux-0.01.tar.gz
Normal file
BIN
Linux-0.01/sources/system/kernel/linux-0.01.tar.gz
Normal file
Binary file not shown.
BIN
Linux-0.01/sources/system/linux-0.01.tar.Z
Normal file
BIN
Linux-0.01/sources/system/linux-0.01.tar.Z
Normal file
Binary file not shown.
BIN
Linux-0.01/sources/system/linux-0.08.diffs.Z
Normal file
BIN
Linux-0.01/sources/system/linux-0.08.diffs.Z
Normal file
Binary file not shown.
BIN
Linux-0.01/sources/system/unistd.tar.Z
Normal file
BIN
Linux-0.01/sources/system/unistd.tar.Z
Normal file
Binary file not shown.
Reference in New Issue
Block a user