对开发内核驱动和文件系统的人来说,经常需要编译某个内核模块。 当然从编译角度,有built-in kernel module和external kernel module之分。 怎么编译一个外部内核模块,google一下“hello world kernel module Makefile”吧。 这里我说下编译内核自带模块的坑... 我用的是SUSE Linux
安装源代码包和开发包 #zypper in kernel-source kernel-devel
开发包里面放的是头文件和Makefile文件linux内核模块编译linux软件工程师培训,用RPM命令来查看下: # rpm -qa|grep kernel-devel
kernel-devel-4.1.27-27.1.noarch
# rpm -ql kernel-devel-4.1.27-24.1.noarch|more
/usr/share/doc/packages/kernel-source-4.1.27-24
/usr/share/doc/packages/kernel-source-4.1.27-24/README.SUSE
/usr/share/doc/packages/kernel-source-4.1.27-24/config-options.changes.txt
/usr/src/linux
/usr/src/linux-4.1.27-24
/usr/src/linux-4.1.27-24/Documentation
/usr/src/linux-4.1.27-24/Documentation/DocBook
/usr/src/linux-4.1.27-24/Documentation/DocBook/Makefile
....
重要参考文件
#ls -l /usr/src/linux/README.SUSE
lrwxrwxrwx 1 root root 61 Dec 31 10:41 /usr/src/linux/README.SUSE -> ../../share/doc/packages/kernel-source-3.12.49-11/README.SUSE
这个文档介绍编译内核以及模块所需的软件包linux内核模块编译,概念,方法和步骤。 基本上也适用于其他Linux发型版。
贴出相关的一段:
Thesecondmethodinvolvesthefollowingsteps:
(1)Installthekernel-develpackage.
(2)Installthekernel-$FLAVOR-develpackage.Thisisnecessaryfor
symbolversioninformation(CONFIG_MODVERSIONS).
(3)Compilethemodule(s)bychangingintothemodulesourcedirectory
andtyping``make-C/usr/src/linux-obj/$ARCH/$FLAVORM=$(pwd)''.
Substitute$ARCHand$FLAVORwiththearchitectureandflavor
forwhichtobuildthemodule(s).
Iftheinstalledkernelsourcesmatchtherunningkernel,you
canbuildmodulesfortherunningkernelbyusingthepath
/lib/modules/$(uname-r)/buildasthe-Coptionintheabove
command.(buildisasymlinkto/usr/src/linux-obj/$ARCH/$FLAVOR).
(4)Installthemodule(s)with
``make-C/usr/src/linux-obj/$ARCH/$FLAVORM=$(pwd)modules_install''.
3.坑
但是按照上面的步骤总是编译不出来.ko内核模块, 原因是当前的发行版默认没有打开ocfs2模块编译选项:
eric1211:/usr/src/linux/fs/ocfs2#make-C/lib/modules/3.12.49-11-default/buildM=`pwd`modules
make:Enteringdirectory'/usr/src/linux-3.12.49-11-obj/x86_64/default'
make[1]:Enteringdirectory`/usr/src/linux-3.12.49-11-obj/x86_64/default'
Buildingmodules,stage2.
MODPOST0modules
make:Leavingdirectory'/usr/src/linux-3.12.49-11-obj/x86_64/default'
原因是配置文件默认没有选择OCFS2,所以要手动make menuconfig,把ocfs2选上linux课程, 再试就可以了。具体步骤:
cd /usr/src/linux
make menuconfig 选择ocfs2
cd /usr/src/linux/fs/ocfs2
make -C /lib/modules/`uname -r`/build M=`pwd` modules