\contentsline {chapter}{\numberline {0}Before You Begin\pldots }{1}
\contentsline {section}{\numberline {0.1}Typographical Conventions}{1}
\contentsline {section}{\numberline {0.2}Assumptions}{2}
\contentsline {section}{\numberline {0.3}Hacking Wisdom}{2}
\contentsline {chapter}{\numberline {1}Device Drivers}{4}
\contentsline {section}{\numberline {1.1}What is a Device Driver?}{4}
\contentsline {section}{\numberline {1.2}User-space device drivers}{5}
\contentsline {subsection}{\numberline {1.2.1}Example: {\ptt vgalib}}{6}
\contentsline {subsection}{\numberline {1.2.2}Example: mouse conversion}{7}
\contentsline {section}{\numberline {1.3}Device Driver Basics}{8}
\contentsline {subsection}{\numberline {1.3.1}Namespace}{8}
\contentsline {subsection}{\numberline {1.3.2}Allocating memory}{8}
\contentsline {subsection}{\numberline {1.3.3}Character vs.\ block devices}{9}
\contentsline {subsection}{\numberline {1.3.4}Interrupts vs. Polling}{10}
\contentsline {subsection}{\numberline {1.3.5}The sleep-wakeup mechanism}{11}
\contentsline {subsubsection}{\numberline {1.3.5.1}More advanced sleeping}{13}
\contentsline {subsection}{\numberline {1.3.6}The VFS}{13}
\contentsline {subsubsection}{\numberline {1.3.6.1}{\pbf The {\ptt lseek()} function}}{14}
\contentsline {subsubsection}{\numberline {1.3.6.2}{\pbf The {\ptt read()} and {\ptt write()} functions}}{14}
\contentsline {subsubsection}{\numberline {1.3.6.3}{\pbf The {\ptt readdir()} function}}{15}
\contentsline {subsubsection}{\numberline {1.3.6.4}{\pbf The {\ptt select()} function}}{15}
\contentsline {subsubsection}{\numberline {1.3.6.5}{\pbf The {\ptt ioctl()} function}}{17}
\contentsline {subsubsection}{\numberline {1.3.6.6}{\pbf The {\ptt mmap()} function}}{18}
\contentsline {subsubsection}{\numberline {1.3.6.7}{\pbf The {\ptt open()} and {\ptt release()} functions}}{19}
\contentsline {subsubsection}{\numberline {1.3.6.8}{\pbf The {\ptt init()} function}}{19}
\contentsline {section}{\numberline {1.4}Character Device Drivers}{20}
\contentsline {subsection}{\numberline {1.4.1}Initialization}{20}
\contentsline {subsection}{\numberline {1.4.2}Interrupts vs. Polling}{21}
\contentsline {subsection}{\numberline {1.4.3}TTY drivers}{23}
\contentsline {subsection}{\numberline {1.4.4}Example Drivers}{23}
\contentsline {section}{\numberline {1.5}Block Device Drivers}{24}
\contentsline {subsection}{\numberline {1.5.1}Initialization}{24}
\contentsline {subsubsection}{\numberline {1.5.1.1}The file blk.h}{24}
\contentsline {subsubsection}{\numberline {1.5.1.2}Recognizing PC standard partitions}{25}
\contentsline {subsection}{\numberline {1.5.2}The Buffer Cache}{26}
\contentsline {subsection}{\numberline {1.5.3}The Strategy Routine}{26}
\contentsline {subsection}{\numberline {1.5.4}Example Drivers}{27}
\contentsline {section}{\numberline {1.6}Supporting Functions}{27}
\contentsline {section}{\numberline {1.7}Writing a SCSI Device Driver}{39}
\contentsline {subsection}{\numberline {1.7.1}Why You Want to Write a SCSI Driver}{39}
\contentsline {subsection}{\numberline {1.7.2}What is SCSI?}{39}
\contentsline {subsubsection}{\numberline {1.7.2.1}SCSI phases}{40}
\contentsline {subsection}{\numberline {1.7.3}SCSI Commands}{43}
\contentsline {subsection}{\numberline {1.7.4}Getting Started}{44}
\contentsline {subsection}{\numberline {1.7.5}Before You Begin: Gathering Tools}{44}
\contentsline {subsection}{\numberline {1.7.6}The {\prm \psc Linux}{} SCSI Interface}{45}
\contentsline {subsection}{\numberline {1.7.7}The {\ptt Scsi\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}Host} Structure}{45}
\contentsline {subsubsection}{\numberline {1.7.7.1}Variables in the {\ptt Scsi\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}Host} structure}{47}
\contentsline {paragraph}{\numberline {1.7.7.1.1}{\ptt name}}{47}
\contentsline {paragraph}{\numberline {1.7.7.1.2}{\ptt can\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}queue}}{47}
\contentsline {paragraph}{\numberline {1.7.7.1.3}{\ptt this\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}id}}{47}
\contentsline {paragraph}{\numberline {1.7.7.1.4}{\ptt sg\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}tablesize}}{47}
\contentsline {paragraph}{\numberline {1.7.7.1.5}{\ptt cmd\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}per\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}lun}}{48}
\contentsline {paragraph}{\numberline {1.7.7.1.6}{\ptt present}}{48}
\contentsline {paragraph}{\numberline {1.7.7.1.7}{\ptt unchecked\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}isa\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}dma}}{48}
\contentsline {subsubsection}{\numberline {1.7.7.2}Functions in the {\ptt Scsi\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}Host} Structure}{49}
\contentsline {paragraph}{\numberline {1.7.7.2.1}{\ptt detect()}}{49}
\contentsline {subparagraph}{\numberline {1.7.7.2.1.1}Requesting the IRQ}{50}
\contentsline {paragraph}{\numberline {1.7.7.2.2}Requesting the DMA channel}{53}
\contentsline {paragraph}{\numberline {1.7.7.2.3}{\ptt info()}}{53}
\contentsline {paragraph}{\numberline {1.7.7.2.4}{\ptt queuecommand()}}{53}
\contentsline {paragraph}{\numberline {1.7.7.2.5}{\ptt done()}}{54}
\contentsline {paragraph}{\numberline {1.7.7.2.6}{\ptt command()}}{55}
\contentsline {paragraph}{\numberline {1.7.7.2.7}{\ptt abort()}}{57}
\contentsline {paragraph}{\numberline {1.7.7.2.8}{\ptt reset()}}{57}
\contentsline {paragraph}{\numberline {1.7.7.2.9}{\ptt slave\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}attach()}}{57}
\contentsline {paragraph}{\numberline {1.7.7.2.10}{\ptt bios\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}param()}}{58}
\contentsline {subsection}{\numberline {1.7.8}The {\ptt Scsi\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}Cmnd} Structure}{59}
\contentsline {subsubsection}{\numberline {1.7.8.1}Reserved Areas}{59}
\contentsline {paragraph}{\numberline {1.7.8.1.1}Informative Variables}{59}
\contentsline {paragraph}{\numberline {1.7.8.1.2}The Scatter-Gather List}{59}
\contentsline {subsubsection}{\numberline {1.7.8.2}Scratch Areas}{61}
\contentsline {paragraph}{\numberline {1.7.8.2.1}The {\ptt scsi\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}done()} Pointer}{61}
\contentsline {paragraph}{\numberline {1.7.8.2.2}The {\ptt host\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}scribble} Pointer}{61}
\contentsline {paragraph}{\numberline {1.7.8.2.3}The {\ptt Scsi\unhbox \voidb@x \kern .06em \vbox {\hrule width.3em}Pointer} Structure}{61}
\contentsline {section}{\numberline {1.8}Acknowledgements}{62}
\contentsline {section}{\numberline {1.9}Network Device Drivers}{63}
\contentsline {chapter}{\numberline {2}The {\ptt /proc} filesystem}{64}
\contentsline {section}{\numberline {2.1}{\ptt /proc} Directories and Files}{64}
\contentsline {section}{\numberline {2.2}Structure of the /proc filesystem}{70}
\contentsline {section}{\numberline {2.3}Programming the /proc filesystem}{71}
\contentsline {chapter}{\numberline {3}How System Calls Work}{80}
\contentsline {section}{\numberline {3.1}What Does the 386 Provide?}{80}
\contentsline {section}{\numberline {3.2}How {\prm \psc Linux}\ Uses Interrupts and Exceptions}{82}
\contentsline {section}{\numberline {3.3}How {\prm \psc Linux}\ Initializes the system call vectors}{83}
\contentsline {section}{\numberline {3.4}How to Add Your Own System Calls}{84}
\contentsline {chapter}{\numberline {4}Linux Memory Management}{86}
\contentsline {section}{\numberline {4.1}Overview}{86}
\contentsline {section}{\numberline {4.2}Physical memory}{88}
\contentsline {section}{\numberline {4.3}A user process' view of memory}{88}
\contentsline {section}{\numberline {4.4}Memory Management data in the process table}{89}
\contentsline {section}{\numberline {4.5}Memory initialization}{90}
\contentsline {subsection}{\numberline {4.5.1}Processes and the Memory Manager}{91}
\contentsline {section}{\numberline {4.6}Acquiring and Freeing Memory: Paging Policy}{93}
\contentsline {section}{\numberline {4.7}The page fault handlers}{95}
\contentsline {section}{\numberline {4.8}Paging}{96}
\contentsline {section}{\numberline {4.9}80386 Memory Mangament}{97}
\contentsline {subsection}{\numberline {4.9.1}Paging on the 386}{97}
\contentsline {subsection}{\numberline {4.9.2}Segments in the 80386}{99}
\contentsline {subsection}{\numberline {4.9.3}Selectors in the 80386}{101}
\contentsline {subsection}{\numberline {4.9.4}Segment descriptors}{102}
\contentsline {subsection}{\numberline {4.9.5}Macros used in setting up descriptors}{104}
\contentsline {chapter}{\numberline {A}Annotated Bibliography}{106}
\contentsline {chapter}{\numberline {B}The GNU General Public License}{113}
\contentsline {section}{\numberline {B.1}Preamble}{113}
\contentsline {section}{\numberline {B.2}Terms and Conditions}{114}
\contentsline {section}{\numberline {B.3}How to Apply These Terms}{119}
