3. Making Loadable Kernel Modules
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 insmod program to insert an LKM into
the kernel, you give the name of that object file.
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
make zImage,
you will make all the LKMs with the command
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 modules 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 Section 5.6. The command
make modules_install
will copy them all over to the conventional locations.
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 (make config), 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.
As explained in Section 2.3, 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.
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
Section 6.
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.
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 Section 6.