old-www/HOWTO/Module-HOWTO/x126.html

232 lines
4.8 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML
><HEAD
><TITLE
>Making Loadable Kernel Modules</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
REL="HOME"
TITLE="Linux Loadable Kernel Module HOWTO"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE="Introduction to Linux Loadable Kernel Modules"
HREF="x73.html"><LINK
REL="NEXT"
TITLE="LKM Utilities"
HREF="x146.html"></HEAD
><BODY
CLASS="SECT1"
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"
>Linux Loadable Kernel Module HOWTO</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x73.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x146.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="AEN126"
></A
>3. Making Loadable Kernel Modules</H1
><P
>An LKM lives in a single ELF object file (normally named like
"serial.o"). You typically keep all your LKM object files in a
particular directory (near your base kernel image makes sense). When
you use the <B
CLASS="COMMAND"
>insmod</B
> program to insert an LKM into
the kernel, you give the name of that object file.</P
><P
>For the LKMs that are part of Linux, you build them as part of the
same kernel build process that generates the base kernel image. See
the README file in the Linux source tree. In short, after you make
the base kernel image with a command such as
<B
CLASS="COMMAND"
>make zImage</B
>,
you will make all the LKMs with the command
<TABLE
BORDER="1"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><FONT
COLOR="#000000"
><PRE
CLASS="SCREEN"
>make modules </PRE
></FONT
></TD
></TR
></TABLE
></P
><P
>This results in a bunch of LKM object files (*.o) throughout the Linux
source tree. (In older versions of Linux, there would be symbolic
links in the <TT
CLASS="LITERAL"
>modules</TT
> directory of the Linux source
tree pointing to all those LKM object files). These LKMs are ready to
load, but you probably want to install them in some appropriate
directory. The conventional place is described in <A
HREF="x197.html#MODLOCATION"
>Section 5.6</A
>. The command
<B
CLASS="COMMAND"
>make modules_install</B
>
will copy them all over to the conventional locations.</P
><P
>Part of configuring the Linux kernel (at build time) is choosing which
parts of the kernel to bind into the base kernel and which parts to
generate as separate LKMs. In the basic question-and-answer
configuration (<B
CLASS="COMMAND"
>make config</B
>), you are asked, for
each optional part of the kernel, whether you want it bound into the
kernel (a "Y" response), created as an LKM (an "M" response), or just
skipped completely (an "N" response). Other configuration methods are
similar.</P
><P
>As explained in <A
HREF="x73.html#THECASE"
>Section 2.3</A
>, you should have
only the bare minimum bound into the base kernel. And only skip
completely the parts that you're sure you'll never want. There is
very little to lose by building an LKM that you won't use. Some
compile time, some disk space, some chance of a problem in the code
killing the kernel build. That's it.</P
><P
>As part of the configuration dialog you also must choose whether to
use symbol versioning or not. This choice affects building both the
base kernel and the LKMs and it is crucial you get it right. See
<A
HREF="basekerncompat.html"
>Section 6</A
>.</P
><P
>LKMs that are not part of Linux (i.e. not distributed with the Linux kernel)
have their own build procedures which I will not cover. The goal of any
such procedure, though, is always to end up with an ELF object file.</P
><P
>You don't necessarily have to rebuild all your LKMs and your base
kernel image at the same time (e.g. you could build just the base
kernel and use LKMs you built earlier with it) but it is always a good
idea. See <A
HREF="basekerncompat.html"
>Section 6</A
>.</P
></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="x73.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x146.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Introduction to Linux Loadable Kernel Modules</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>LKM Utilities</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>