<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <HTML ><HEAD ><TITLE >Unreliable Guide To Hacking The Linux Kernel</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="NEXT" TITLE="Introduction" HREF="c22.html"></HEAD ><BODY CLASS="BOOK" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="BOOK" ><A NAME="LK-HACKING-GUIDE" ></A ><DIV CLASS="TITLEPAGE" ><H1 CLASS="TITLE" ><A NAME="AEN2" ></A >Unreliable Guide To Hacking The Linux Kernel</H1 ><H3 CLASS="AUTHOR" ><A NAME="AEN5" ></A >Paul Rusty Russell</H3 ><DIV CLASS="AFFILIATION" ><DIV CLASS="ADDRESS" ><P CLASS="ADDRESS" > <TT CLASS="EMAIL" ><<A HREF="mailto:rusty@rustcorp.com.au" >rusty@rustcorp.com.au</A >></TT ><br> </P ></DIV ></DIV ><P CLASS="COPYRIGHT" ><A HREF="ln15.html" >Copyright</A > © 2001 Rusty Russell</P ><SPAN CLASS="RELEASEINFO" > This is the first release of this document as part of the kernel tarball. <BR></SPAN ><HR></DIV ><DIV CLASS="TOC" ><DL ><DT ><B >Table of Contents</B ></DT ><DT ><A HREF="c22.html" >Introduction</A ></DT ><DT ><A HREF="c26.html" >The Players</A ></DT ><DD ><DL ><DT ><A HREF="c26.html#BASICS-USERCONTEXT" >User Context</A ></DT ><DT ><A HREF="x54.html" >Hardware Interrupts (Hard IRQs)</A ></DT ><DT ><A HREF="x64.html" >Software Interrupt Context: Bottom Halves, Tasklets, softirqs</A ></DT ></DL ></DD ><DT ><A HREF="c84.html" >Some Basic Rules</A ></DT ><DT ><A HREF="c108.html" >ioctls: Not writing a new system call</A ></DT ><DT ><A HREF="c127.html" >Recipes for Deadlock</A ></DT ><DT ><A HREF="c141.html" >Common Routines</A ></DT ><DD ><DL ><DT ><A HREF="c141.html#ROUTINES-PRINTK" ><TT CLASS="FUNCTION" >printk()</TT > <TT CLASS="FILENAME" >include/linux/kernel.h</TT ></A ></DT ><DT ><A HREF="x159.html" ><TT CLASS="FUNCTION" >copy_[to/from]_user()</TT > / <TT CLASS="FUNCTION" >get_user()</TT > / <TT CLASS="FUNCTION" >put_user()</TT > <TT CLASS="FILENAME" >include/asm/uaccess.h</TT ></A ></DT ><DT ><A HREF="x180.html" ><TT CLASS="FUNCTION" >kmalloc()</TT >/<TT CLASS="FUNCTION" >kfree()</TT > <TT CLASS="FILENAME" >include/linux/slab.h</TT ></A ></DT ><DT ><A HREF="x221.html" ><TT CLASS="FUNCTION" >current</TT > <TT CLASS="FILENAME" >include/asm/current.h</TT ></A ></DT ><DT ><A HREF="x227.html" ><TT CLASS="FUNCTION" >udelay()</TT >/<TT CLASS="FUNCTION" >mdelay()</TT > <TT CLASS="FILENAME" >include/asm/delay.h</TT > <TT CLASS="FILENAME" >include/linux/delay.h</TT ></A ></DT ><DT ><A HREF="x238.html" ><TT CLASS="FUNCTION" >cpu_to_be32()</TT >/<TT CLASS="FUNCTION" >be32_to_cpu()</TT >/<TT CLASS="FUNCTION" >cpu_to_le32()</TT >/<TT CLASS="FUNCTION" >le32_to_cpu()</TT > <TT CLASS="FILENAME" >include/asm/byteorder.h</TT ></A ></DT ><DT ><A HREF="x251.html" ><TT CLASS="FUNCTION" >local_irq_save()</TT >/<TT CLASS="FUNCTION" >local_irq_restore()</TT > <TT CLASS="FILENAME" >include/asm/system.h</TT ></A ></DT ><DT ><A HREF="x260.html" ><TT CLASS="FUNCTION" >local_bh_disable()</TT >/<TT CLASS="FUNCTION" >local_bh_enable()</TT > <TT CLASS="FILENAME" >include/asm/softirq.h</TT ></A ></DT ><DT ><A HREF="x266.html" ><TT CLASS="FUNCTION" >smp_processor_id</TT >()/<TT CLASS="FUNCTION" >cpu_[number/logical]_map()</TT > <TT CLASS="FILENAME" >include/asm/smp.h</TT ></A ></DT ><DT ><A HREF="x277.html" ><SPAN CLASS="TYPE" >__init</SPAN >/<SPAN CLASS="TYPE" >__exit</SPAN >/<SPAN CLASS="TYPE" >__initdata</SPAN > <TT CLASS="FILENAME" >include/linux/init.h</TT ></A ></DT ><DT ><A HREF="x292.html" ><TT CLASS="FUNCTION" >__initcall()</TT >/<TT CLASS="FUNCTION" >module_init()</TT > <TT CLASS="FILENAME" >include/linux/init.h</TT ></A ></DT ><DT ><A HREF="x305.html" ><TT CLASS="FUNCTION" >module_exit()</TT > <TT CLASS="FILENAME" >include/linux/init.h</TT ></A ></DT ><DT ><A HREF="x310.html" ><TT CLASS="FUNCTION" >MOD_INC_USE_COUNT</TT >/<TT CLASS="FUNCTION" >MOD_DEC_USE_COUNT</TT > <TT CLASS="FILENAME" >include/linux/module.h</TT ></A ></DT ></DL ></DD ><DT ><A HREF="c325.html" >Wait Queues <TT CLASS="FILENAME" >include/linux/wait.h</TT ></A ></DT ><DD ><DL ><DT ><A HREF="c325.html#QUEUE-DECLARING" >Declaring</A ></DT ><DT ><A HREF="x339.html" >Queuing</A ></DT ><DT ><A HREF="x353.html" >Waking Up Queued Tasks</A ></DT ></DL ></DD ><DT ><A HREF="c359.html" >Atomic Operations</A ></DT ><DT ><A HREF="c387.html" >Symbols</A ></DT ><DD ><DL ><DT ><A HREF="c387.html#SYM-EXPORTSYMBOLS" ><TT CLASS="FUNCTION" >EXPORT_SYMBOL()</TT > <TT CLASS="FILENAME" >include/linux/module.h</TT ></A ></DT ><DT ><A HREF="x396.html" ><SPAN CLASS="SYMBOL" >EXPORT_NO_SYMBOLS</SPAN > <TT CLASS="FILENAME" >include/linux/module.h</TT ></A ></DT ><DT ><A HREF="x404.html" ><TT CLASS="FUNCTION" >EXPORT_SYMBOL_GPL()</TT > <TT CLASS="FILENAME" >include/linux/module.h</TT ></A ></DT ></DL ></DD ><DT ><A HREF="c412.html" >Routines and Conventions</A ></DT ><DD ><DL ><DT ><A HREF="c412.html#CONVENTIONS-DOUBLELINKEDLIST" >Double-linked lists <TT CLASS="FILENAME" >include/linux/list.h</TT ></A ></DT ><DT ><A HREF="x418.html" >Return Conventions</A ></DT ><DT ><A HREF="x428.html" >Breaking Compilation</A ></DT ><DT ><A HREF="x432.html" >Initializing structure members</A ></DT ><DT ><A HREF="x437.html" >GNU Extensions</A ></DT ><DT ><A HREF="x466.html" >C++</A ></DT ><DT ><A HREF="x469.html" >#if</A ></DT ></DL ></DD ><DT ><A HREF="c472.html" >Putting Your Stuff in the Kernel</A ></DT ><DT ><A HREF="c517.html" >Kernel Cantrips</A ></DT ><DT ><A HREF="c535.html" >Thanks</A ></DT ></DL ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" > </TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" > </TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="c22.html" ACCESSKEY="N" >Next >>></A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" > </TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" > </TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Introduction</TD ></TR ></TABLE ></DIV ></BODY ></HTML >