單獨編譯某個內核模塊

對開發內核驅動和文件系統的人來講,常常須要編譯某個內核模塊。 固然從編譯角度,有built-in kernel module和external kernel module之分。 怎麼編譯一個外部內核模塊,google一下「hello world kernel module Makefile」吧。 這裏我說下編譯內核自帶模塊的坑... 我用的是SUSE Linuxlinux

  1. 安裝源代碼包和開發包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
    ....

     

  2. 重要參考文件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選上, 再試就能夠了。具體步驟:編譯

  1. cd /usr/src/linux

  2. make menuconfig 選擇ocfs2

  3. cd /usr/src/linux/fs/ocfs2

  4. make -C /lib/modules/`uname -r`/build M=`pwd` modules

相關文章
相關標籤/搜索