%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%									%
%	Copyright (C) 1992, 1993 Michael K. Johnson,			%
%	johnsonm@sunsite.unc.edu, and any others named			%
%	in copyright below.						%
%									%
%	This file is freely copyable, but you must preserve this	%
%	copyright notice on all copies, it must only be distributed	%
%	as part of the Linux Kernel Hackers' Guide, and its use is	%
%	is subject to the conditions expressed in the copyright for	%
%	the whole guide, in the file prelim/copyright.tex		%
%									%
%	If other copyright conditions are given below, they supercede	%
%	these conditions.						%
%									%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\chapter{Annotated Bibliography}\label{bibliography}

This bibliography covers books on operating system theory as well as
different kinds of programming in a \unix\ environment.  The price
marked may or may not be an exact price, but should be close enough
for government work.  {\bf [If you have a book that you think should
go in the bibliography, please write a short review of it and send all
the necessary information (title, author, publisher, ISBN, and
approximate price) and the review to {\tt johnsonm@sunsite.unc.edu}]}


\begin{abib}
{The Design of the UNIX Operating System}
{Maurice J. Bach}
{Prentice Hall, 1986}
{0-13-201799-7}
{\$65.00}
\noindent This is one of the books that Linus used to design \linux.  It is a
description of the data structures used in the System~V kernel.  Many
of the names of the important functions in the \linux\ source come
from this book, and are named after the algorithms presented here.
For instance, if you can't quite figure out what exactly getblk(),
brelse(), bread(), breada(), and bwrite() are, chapter~3 explains very well.

While most of the algorithms are similar or the same, a few
differences are worth noting:
\begin{itemize}
\item The \linux\ buffer cache is dynamically resized, so the algorithm for
dealing with getting new buffers is a bit different.  Therefore the
above referenced explanation of getblk() is a little different than the
getblk() in \linux.
\item \linux\ does not currently use streams, and if/when streams are
implemented for \linux, they are likely to have somewhat different
semantics.
\item The semantics and calling structure for device drivers is
different.  The concept is similar, and the chapter on device drivers
is still worth reading, but for details on the device driver
structures, the \kguide\ is the proper reference.
\item The memory management algorithms are somewhat different.
\end{itemize}
There are other small differences as well, but a good understanding of
this text will help you understand the \linux\ source.
\end{abib}




\begin{abib}
{Advanced Programming in the UNIX Environment}
{W. Richard Stevens}
{Addison Wesley, 1992}
{0-201-56317-7}
{\$50.00}
\noindent This excellent tome covers the stuff you {\em really} have to know to
write {\em real} \unix\ programs.  It includes a discussion of the
various standards for \unix\ implementations, including POSIX, X/Open
XPG3, and FIPS, and concentrates on two implementations, SVR4 and
pre-release 4.4 BSD, which it refers to as 4.3+BSD.  The book
concentrates heavily on application and fairly complete specification,
and notes which features relate to which standards and releases.

The chapters include: Unix Standardization and Implementations, File
I/O, Files and Directories, Standard I/O Library, System Data Files
and Information, The Environment of a Unix Process, Process Control,
Process Relationships, Signals, Terminal I/O, Advanced I/O
(non-blocking, streams, async, memory-mapped, etc.), Daemon Processes,
Interprocess Communication, Advanced Interprocess Communication, and
some example applications, including chapters on A Database Library,
Commmunicating with a PostScript Printer, A Modem Dialer, and then a
seemingly misplaced final chapter on Pseudo Terminals.

I have found that this book makes it possible for me to write useable
programs for \unix.  It will help you achieve POSIX compliance in
ways that won't break SVR4 or BSD, as a general rule.  This book will
save you ten times its cost in frustration.
\end{abib}

\begin{abib}
{Advanced 80386 Programming Techniques}
{James L. Turley}
{Osborne McGraw-Hill, 1988}
{0-07-881342-5}
{\$22.95}
\noindent This book covers the 80386 quite well, without touching on any other
hardware.  Some code samples are included.  All major features are
covered, as are many of the concepts needed.  The chapters of this
book are:  Basics, Memory Segmentation, Privilege Levels, Paging,
Multitasking, Communicating Among Tasks, Handling Faults and
Interrupts, 80286 Emulation, 8086 Emulation, Debugging, The 80387
Numeric Processor Extension, Programming for Performance, Reset and
Real Mode, Hardware, and a few appendices, including tables of the
memory management structures as a handy reference.

The author has a good writing style:  If you are technically minded,
you will find yourself caught up just reading this book.  One strong
feature of this book for \linux\ is that the author is very careful
not to explain how to do things under DOS, nor how to deal with
particular hardware.  In fact, the only times he mentions DOS and
PC-compatible hardware are in the introduction, where he promises
never to mention them again.
\end{abib}


\begin{abib}
{The C Programming Language, second edition}
{Brian W. Kernighan and Dennis M. Ritchie}
{Prentice Hall, 1988}
{0-13-110362-8 (paper) 0-13-110370-9 (hard)}
{\$35.00}
\noindent The C programming bible.  Includes a C tutorial, \unix\ interface
reference, C reference, and standard library
reference.

You program in C, you buy this book.  It's that simple.
\end{abib}


\begin{abib}
{Operating Systems: Design and Implementation}
{Andrew S. Tanenbaum}
{Prentice Hall, 1987}
{0-13-637406-9}
{\$50.00}
\noindent This book, while a little simplistic in spots, and missing some
important ideas, is a fairly clear exposition of what it takes to
write an operating system.  Half the book is taken up with the source
code to a \unix\ clone called Minix, which is based on a microkernel,
unlike \linux, which sports a monolithic design.  It has been said
that Minix shows that it is possible to to write a microkernel-based
\unix, but does not adequately explain {\em why} one would do so.

\linux\ was originally intended to be a free Minix
replacement:\footnote{Linus' Minix, Linus tells us.} In
fact, it was originally to be binary-compatible with Minix-386.
Minix-386 was the development environment under which \linux\ was
bootstrapped.  No Minix code is in \linux, but vesitiges of this
heritage live on in such things as the minix filesystem in \linux.
Early in \linux's existence, Andrew Tanenbaum started a flame war with
Linus about OS design, which was interesting, if not enlightening\dots

However, this book might still prove worthwhile for those who want a
basic explanation of OS concepts, as Tanenbaum's explanations of the
basic concepts remain some of the clearer (and more entertaining, if
you like to be entertained) available.  Unfortunately, basic is the
key work here, as many things such as virtual memory are not covered
at all.
\end{abib}


\begin{abib}
{Modern Operating Systems}
{Andrew S. Tanenbaum}
{Prentice Hall, 1992}
{0-13-588187-0}
{\$51.75}
\noindent The first half of this book is a rewrite of Tanenbaum's earlier {\em
Operating Systems}, but this book covers several things that the
earlier book missed, including such things as virtual memory.  Minix
is not included, but overviews of MS-DOS and several distributed
systems are.  This book is probably more useful to someone who wants
to do something with his or her knowlege than Tanenbaum's earlier {\em
Operating Systems: Design and Implementation.} Some clue as to the
reason may be found in the title\dots \ However, what DOS is doing in
a book on {\em modern} operating systems, many have failed to discover.
\end{abib}


\begin{abib}
{Operating Systems}
{William Stallings}
{Macmillan, 1992 (800-548-9939)}
{0-02-415481-4}
{\$??.??}
\noindent A very thorough text on operating systems, this book gives more
in-depth coverage of the topics covered in Tannebaum's books, and
covers more topics, in a much brisker style.  This book covers all the
major topics that you would need to know to build an operating system,
and does so in a clear way.  The author uses examples from three major
systems, comparing and contrasting them: \unix, OS/2, and MVS.  With
each topic covered, these example systems are used to clarify the
points and provide an example of an implementation.

Topics covered in {\em Operating Systems\/} include threads, real-time
systems, multiprocessor scheduling, distributed systems, process
migration, and security, as well as the standard topics like memory
management and scheduling.  The section on distributed processing
appears to be up-to-date, and I found it very helpful.
\end{abib}



\begin{abib}
{UNIX Network Programming}
{W. Richard Stevens}
{Prentice Hall, 1990}
{0-13-949876-1}
{\$48.75}
\noindent This book covers several kinds of networking under \unix, and
provides very thorough references to the forms of networking that it
does not cover directly.  It covers TCP/IP and XNS most heavily, and
fairly exhaustively describes how all the calls work.  It also has a
description and sample code using System V's TLI, and pretty complete
coverage of System V IPC.  This book contains a lot of source code
examples to get you started, and many useful proceedures.  One example
is code to provide useable semaphores, based on the partially broken
implementation that System V provides.
\end{abib}


\begin{abib}
{Programming in the UNIX environment}
{Brian W. Kernighan and Robert Pike}
{Prentice Hall, 1984}
{0-13-937699 (hardcover) 0-13-937681-X (paperback)}
{\$??.??}
{\em no abstract} 
\end{abib}


% Thanks to Robert Baruch for this one...

\begin{abib}
{Writing UNIX Device Drivers}
{George Pajari}
{Addison Wesley, 1992}
{0-201-52374-4}
{\$32.95}
{This book is written by the President and founder of Driver Design
Labs, a company which specializes in the development of \unix\ device
drivers.  This book is an excellent introduction to the sometimes
wacky world of device driver design.  The four basic types of drivers
(character, block, tty, STREAMS) are first discussed briefly.  Many
full examples of device drivers of all types are given, starting with
the simplest and progressing in complexity.  All examples are of
drivers which deal with \unix\ on PC-compatible hardware.
{\bf Chapters include:}
Character Drivers I: A Test Data Generator
Character Drivers II: An A/D Converter
Character Drivers III: A Line Printer
Block Drivers I: A Test Data Generator
Block Drivers II: A RAM Disk Driver
Block Drivers III: A SCSI Disk Driver
Character Drivers IV: The Raw Disk Driver
Terminal Drivers I: The COM1 Port
Character Drivers V: A Tape Drive
STREAMS Drivers I: A Loop-Back Driver
STREAMS Drivers II: The COM1 Port (Revisited)
Driver Installation
Zen and the Art of Device Driver Writing

\medskip
Although many of the calls used in the book are not \linux-compatible,
the general idea is there, and many of the ideas map directly into
\linux.}
\end{abib}




\begin{abib}
{title}
{author}
{pub,yr}
{isbn}
{\$??.??}
{\em no abstract} 
\end{abib}
