1. 程式人生 > >linux模組的編譯步驟詳解

linux模組的編譯步驟詳解

 Linux 模組的編譯步驟

1. 原始碼準備

#include <linux/init.h>

#include<linux/module.h>

MODULE_LICENSE("GPL");

static int hello_init(void)

{

 printk(KERN_ALERT"Hello,world!\n");

 return 0;

}

static int hello_exit(void)

{

 printk(KERN_ALERT"good bye,cruelworld!\n");

}

module_init(hello_init);

module_exit(hello_exit);

2. 編寫Makefile檔案

obj-m := modules.o

modules-objs := mymod.o

KDIR := /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

default:

make -C $(KDIR) M=$(PWD) modules

#clean:

#rm -rf *.o *.cmd *.ko *.mod.c*.tmp_versions

注意:default下面一行要以tab鍵開頭。

3. 編譯模組

在mymod.c所在資料夾中,執行make,出現錯誤:

make-C /lib/modules/2.6.32-220.el6.x86_64/build M=/zk modules

make: *** /lib/modules/2.6.32-220.el6.x86_64/build: 沒有那個檔案或目錄。 停止。make: *** [default] 錯誤 2

   原因分析:其實該目錄下的build檔案是存在的,不過build檔案是一個連結檔案,它指向的內容不存在。也就是/usr/src/kernels目錄為空,所以出現了這個錯誤。KDIR目錄是模組編譯環境的目錄。這種情況的出現時由於缺少核心開發包kernel-devel導致的。

解決方法:直接利用本地映象檔案來安裝。

首先掛載映象檔案:mount /dev/cdrom /mnt/cds,然後進入Packages目錄下;

然後搜尋是否安裝kernel-devel:rpm –q kernel-devel*,出現提示:

package kernel-debug-2.6.32-220.el6.x86_64.rpm is not installed

package kernel-debug-devel-2.6.32-220.el6.x86_64.rpm is notinstalled

package kernel-devel-2.6.32-220.el6.x86_64.rpm is notinstalled

package kernel-doc-2.6.32-220.el6.noarch.rpm is not installed

這時候,利用命令rpm -ivh kernel-devel-2.6.32-220.el6.x86_64.rpm安裝即可。

當這個錯誤解決後,再次執行make:

make -C /lib/modules/2.6.32-220.el6.x86_64/build M=/zk modules

make[1]: Entering directory`/usr/src/kernels/2.6.32-220.el6.x86_64'

  CC [M]  /zk/mymod.o

/zk/mymod.c: 在函式‘__exittest’中:

/zk/mymod.c:16: 警告:返回了不相容的指標型別

  LD [M]  /zk/modules.o

  Building modules, stage2.

  MODPOST 1 modules

  CC      /zk/modules.mod.o

  LD [M]  /zk/modules.ko.unsigned

  NO SIGN [M]/zk/modules.ko

make[1]: Leaving directory`/usr/src/kernels/2.6.32-220.el6.x86_64'

這時候,在mymod.c所在的目錄生成了如下幾個檔案:

modules.mod.o   mymod.c  modules.ko   modules.o       mymod.o

modules.ko.unsigned      modules.order      modules.mod.c        Module.symvers

4. 載入和解除安裝我們的模組

終端輸入:

[root@localhost zk]# insmod modules.ko

然後檢視是否成功掛載:[root@localhost zk]# dmesg | tail -1

輸出結果如下:

Hello,world!

然後再解除安裝一下模組: [root@localhost zk]# rmmodmodules.ko

然後檢視是否成功解除安裝: [root@localhost zk]# dmesg |tail -2

輸出如下: Hello,world!

good bye,cruel world!