First you need to fetch the proper kernel source rpm. Obtainyour kernel version using the command:
# uname -r
My computer gives:
2.6.9-1.667
Fetch the kernel source rpm from a rpmfind web site. I obtainedkernel-2.6.9-1.667.FC3.src.rpm
. Next, install thekernel source rpm using rpm
as root. I used thefollowing command. Your kernel version may vary.
# rpm -ivh kernel-2.6.9-1.667.FC3.src.rpm
Now change your working directory to the SPECS
directory and extract the kernel source using rpmbuild
:
# cd /usr/src/redhat/SPECS
# rpmbuild -bp kernel-2.6.spec
rpmbuild
only prepared the kernel for compilation.We do not need to actually compile kernel. Next, change yourcurrent working directory to the kernel source. The path willvary depending on your kernel version. Copy the appropriatearchitecture either i586, i686, i586-smp, or i686-smp config filefrom the configs
directory to the root of the kerneltree and call the copy .config
. Use uname
to obtain your architecture. My computer has an architecture ofi686.
# cd /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9
# uname -m
i686
# cp configs/kernel-2.6.9-i686.config .config
The final step to prepare the kernel is to build the make targetmodules_prepare
.
# make modules_prepare
After creating a Makefile
and writing module codein a different directory, using make
to build yourmodule. Refer to The Linux Kernel Module Programming Guidefor information about writing module Makefiles and code. make
requires the path to the kernel source, the variable M
set to the current working directory and the target modules
.It will vary depending on your kernel version. For my computer:
# cd ~/mydriver
# vi Makefile
# vi mydevice.c
# make -C /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9 M=$PWD modules
You can use the target clean
as well.
To build all configured moduleswithin a particular subdirectory in the Linux kernel tree, issuethe same make command as for external modules. Only modules thathave been configured in the .config
file will bebuilt. This means the make variable related to a particularmodules must exist and have a value of a lower case m
.For example, for the kernel module blkmtd
to bebuilt, the associated make variable called CONFIG_MTD_BLKMTD
must appears in the .config
file as follows:
CONFIG_MTD_BLKMTD=m
The associated make variable name can be found in the localMakefile, for this case in drivers/mtd/devices/Makefile
.To compile the module, including several others in the directory,give the following command
# cd /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/drivers/mtd/devices
# make -C /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9 M=$PWD modules
Alternatively, you can copy the desired files out of the kernelsource tree, edit the Makefile, and treat the result like anexternal module. Again, see The Linux Kernel ModuleProgramming Guide to helpyou edit the Makefile.
# cp blkmtd.c Makefile /tmp
# vi Makefile
# make -C /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9 M=$PWD modules