<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <HTML ><HEAD ><TITLE >Some Basic Rules</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK REL="HOME" TITLE="Unreliable Guide To Hacking The Linux Kernel" HREF="book1.html"><LINK REL="PREVIOUS" TITLE="Software Interrupt Context: Bottom Halves, Tasklets, softirqs" HREF="x64.html"><LINK REL="NEXT" TITLE="ioctls: Not writing a new system call" HREF="c108.html"></HEAD ><BODY CLASS="CHAPTER" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >Unreliable Guide To Hacking The Linux Kernel</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="x64.html" ACCESSKEY="P" ><<< Previous</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="c108.html" ACCESSKEY="N" >Next >>></A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="CHAPTER" ><H1 ><A NAME="BASIC-RULES" ></A >Some Basic Rules</H1 ><P ></P ><DIV CLASS="VARIABLELIST" ><DL ><DT >No memory protection</DT ><DD ><P > If you corrupt memory, whether in user context or interrupt context, the whole machine will crash. Are you sure you can't do what you want in userspace? </P ></DD ><DT >No floating point or <SPAN CLASS="ACRONYM" >MMX</SPAN ></DT ><DD ><P > The <SPAN CLASS="ACRONYM" >FPU</SPAN > context is not saved; even in user context the <SPAN CLASS="ACRONYM" >FPU</SPAN > state probably won't correspond with the current process: you would mess with some user process' <SPAN CLASS="ACRONYM" >FPU</SPAN > state. If you really want to do this, you would have to explicitly save/restore the full <SPAN CLASS="ACRONYM" >FPU</SPAN > state (and avoid context switches). It is generally a bad idea; use fixed point arithmetic first. </P ></DD ><DT >A rigid stack limit</DT ><DD ><P > The kernel stack is about 6K in 2.2 (for most architectures: it's about 14K on the Alpha), and shared with interrupts so you can't use it all. Avoid deep recursion and huge local arrays on the stack (allocate them dynamically instead). </P ></DD ><DT >The Linux kernel is portable</DT ><DD ><P > Let's keep it that way. Your code should be 64-bit clean, and endian-independent. You should also minimize CPU specific stuff, e.g. inline assembly should be cleanly encapsulated and minimized to ease porting. Generally it should be restricted to the architecture-dependent part of the kernel tree. </P ></DD ></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" ><A HREF="x64.html" ACCESSKEY="P" ><<< Previous</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="book1.html" ACCESSKEY="H" >Home</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="c108.html" ACCESSKEY="N" >Next >>></A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Software Interrupt Context: Bottom Halves, Tasklets, softirqs</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" > </TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >ioctls: Not writing a new system call</TD ></TR ></TABLE ></DIV ></BODY ></HTML >