232 lines
4.8 KiB
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"
|
|
> </TD
|
|
><TD
|
|
WIDTH="33%"
|
|
ALIGN="right"
|
|
VALIGN="top"
|
|
>LKM Utilities</TD
|
|
></TR
|
|
></TABLE
|
|
></DIV
|
|
></BODY
|
|
></HTML
|
|
> |