對開發內核驅動和文件系統的人來講,常常須要編譯某個內核模塊。 固然從編譯角度,有built-in kernel module和external kernel module之分。 怎麼編譯一個外部內核模塊,google一下「hello world kernel module Makefile」吧。 這裏我說下編譯內核自帶模塊的坑... 我用的是SUSE Linuxlinux
安裝源代碼包和開發包ui
#zypper in kernel-source kernel-devel
開發包裏面放的是頭文件和Makefile文件,用RPM命令來查看下:google
# 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 ....
重要參考文件code
#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.SUSEorm
這個文檔介紹編譯內核以及模塊所需的軟件包,概念,方法和步驟。 基本上也適用於其餘Linux髮型版。開發
貼出相關的一段:文檔
The second method involves the following steps: (1) Install the kernel-devel package. (2) Install the kernel-$FLAVOR-devel package. This is necessary for symbol version information (CONFIG_MODVERSIONS). (3) Compile the module(s) by changing into the module source directory and typing ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd)''. Substitute $ARCH and $FLAVOR with the architecture and flavor for which to build the module(s). If the installed kernel sources match the running kernel, you can build modules for the running kernel by using the path /lib/modules/$(uname -r)/build as the -C option in the above command. (build is a symlink to /usr/src/linux-obj/$ARCH/$FLAVOR). (4) Install the module(s) with ``make -C /usr/src/linux-obj/$ARCH/$FLAVOR M=$(pwd) modules_install''.
3.坑it
可是按照上面的步驟老是編譯不出來.ko內核模塊, 緣由是當前的發行版默認沒有打開ocfs2模塊編譯選項:io
eric1211:/usr/src/linux/fs/ocfs2 # make -C /lib/modules/3.12.49-11-default/build M=`pwd` modules make: Entering directory '/usr/src/linux-3.12.49-11-obj/x86_64/default' make[1]: Entering directory `/usr/src/linux-3.12.49-11-obj/x86_64/default' Building modules, stage 2. MODPOST 0 modules make: Leaving directory '/usr/src/linux-3.12.49-11-obj/x86_64/default'
緣由是配置文件默認沒有選擇OCFS2,因此要手動make menuconfig,把ocfs2選上, 再試就能夠了。具體步驟:編譯
cd /usr/src/linux
make menuconfig 選擇ocfs2
cd /usr/src/linux/fs/ocfs2
make -C /lib/modules/`uname -r`/build M=`pwd` modules