% khg.bib -- KHG bibliogrpahy, based on SCSI paper bibliography...

@manual{ scsi2.standard, key="ANSI",
       title="Draft Proposed American National Standard for Information
Systems: Small Computer System Interface -- 2 (SCSI-2)",
       publisher="Irvine, California: Global Engineering Documents",
       date=1992,
       note="(X3T9.2/86-109, revision 10h, October 17, 1991)"
}

@manual{ lxt.manual, key="LXT",
       title="LXT SCSI Products: Specification and OEM Technical Manual",
       publisher="San Jose, California: Maxtor Corporation",
       year="1991"
}

@Book{ norton.guide,
       author="Peter Norton",
       title="The Peter Norton Programmer's Guide to the IBM PC",
       publisher="Bellevue, Washington: Microsoft Press",
       year="1985"
}

@Book{ the.arm,
       author="Ellis, Margaret A. and Stroustrup, Bjarne",
       title="The Annotated C++ Reference Manual",
       publisher="Reading, Massachusetts: Addison-Wesley Publishing Co.",
       year="1991"
}

@book{ i486.manual,
       author="Intel",
       title="i486 Processor Programmer's Reference Manual",
       publisher="Intel/McGraw-Hill",
       year="1990",
}

@book{	design.of.unix,
	author="Maurice J. Bach",
	title="The Design of the UNIX Operating System",
	publisher="Prentice Hall",
	year="1986",
	price="\$65.00",
	isbn="0-13-201799-7",
	annote="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."
}


@book{	APitUE,
	author="W.~Richard Stevens",
	title="Advanced Programming in the UNIX Environment",
	publisher="Addison Wesley",
	year="1992",
	price="\$50.00",
	isbn="0-201-56317-7",
	annote="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."
}

@book{	adv.386.prog,
	author="James L.~Turley",
	title="Advanced 80386 Programming Techniques",
	publisher="Osborne McGraw-Hill",
	year="1988",
	price="\$22.95",
	isbn="0-07-881342-5",
	annote="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."
}


@book{  k.and.r,
        author="Brian W. Kernighan and Dennis M. Ritchie",
        title="The C Programming Language",
        edition="second",
        publisher="Prentice Hall",
        year="1988",
        price="\$35.00",
        isbn="0-13-110362-8 (paper) 0-13-110370-9 (hard)",
        annote="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."
}


@book{	op.sys.tan,
	author="Andrew S. Tanenbaum",
	title="Operating Systems: Design and Implementation",
	publisher="Prentice Hall",
	year="1987",
	price="\$50.00",
	isbn="0-13-637406-9",
	annote="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.

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."
}


@book{	mod.op.sys,
	author="Andrew S. Tanenbaum",
	title="Modern Operating Systems",
	publisher="Prentice Hall",
	year="1992",
	price="\$51.75",
	isbn="0-13-588187-0",
	annote="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."
}


@book{	op.sys.stal,
	author="William Stallings",
	title="Operating Systems",
	publisher="Macmillan (800-548-9939)",
	year="1992",
	isbn="0-02-415481-4",
	annote="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."
}



@book{	unix.net.prog,
	author="W. Richard Stevens",
	title="UNIX Network Programming",
	publisher="Prentice Hal",
	year="1990",
	price="\$48.75",
	isbn="0-13-949876-1",
	annote="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."
}


@book{	prog.unix.env,
	author="Brian W. Kernighan and Robert Pike",
	title="Programming in the UNIX environment",
	publisher="Prentice Hall",
	year="1984",
	isbn="0-13-937699 (hardcover) 0-13-937681-X (paperback)",
}

@book{	unix.dev.drv,
	author="George Pajari",
	title="Writing UNIX Device Drivers",
	publisher="Addison Wesley",
	year="1992",
	price="\$32.95",
	isbn="0-201-52374-4",
	annote="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."
}
