2014-02-19 99 views
0

我正在嘗試爲ubuntu 12.04 LTS OS編寫內核模塊。 內核版本是3.4.0-030400-generic-pae 我可以編譯它&加載它到內核。 對於裝載我用無法使用rmmod刪除可加載內核模塊(LKM)

sudo insmod nmod_main.ko

現在,如果我嘗試使用

sudo rmmod nmod_main.ko

它給了我波紋管的錯誤將其刪除。 錯誤:刪除 'nmod_main':設備或資源忙

的lsmod給波紋管信息:

Module Size Used by

nmod_main 12394 0 [permanent]

爲什麼這個模塊顯示永久的嗎?

貝婁是這個模塊的C代碼。

/********** Start of code ************/ 
#define __KERNEL__ 
#define MODULE 
#include <linux/module.h> 
#include <linux/kernel.h> 

int init_module(void) 
{ 
     printk(KERN_INFO "init_module() called\n"); 
     return 0; 
} 

void cleanup_module(void) 
{ 
     printk(KERN_INFO "cleanup_module() called\n"); 
} 
/********** End of code ************/ 

我得到一些編譯警告波紋管:

Building with KERNELRELEASE = 3.4.0-030400-generic-pae

CC [M] ../src/nmod_main.o

../src/nmod_main.c:1:0: warning: "KERNEL" redefined [enabled by default]

:0:0: note: this is the location of the previous definition

../src/nmod_main.c:2:0: warning: "MODULE" redefined [enabled by default]

:0:0: note: this is the location of the previous definition

Building modules, stage 2.

Building with KERNELRELEASE = 3.4.0-030400-generic-pae

請任何人可以幫助我在這方面。

我使用波紋管的makefile構建此模塊:

ifeq ($(KERNELRELEASE),) 

KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd) 

.PHONY: build clean 

build: 
     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 

clean: 
     rm -rf ../src/*.o ../src/*~ core ../src/.depend ../src/.*.cmd ../src/*.ko ../src/*.mod.c 
else 

$(info Building with KERNELRELEASE = ${KERNELRELEASE}) 
obj-m := ../src/nmod_main.o 

endi 
+1

請閱讀編譯器消息 - 不要定義'__KERNEL__'和'MODULE'。 –

+0

同意,但然後編譯器將如何確定這是內核代碼,也不是內核的永久部分(即可加載內核模塊)? –

+0

我的第一個問題(rmmod失敗)的任何亮點? –

回答

0

這個問題就解決了。是的,這與工具鏈有關。我下載了.deb文件以從url安裝Linux內核。

但我不確定用於生成這些.deb文件的工具鏈。於是我終於從url下載了Linux內核源碼,編譯了我的筆記本電腦上安裝的&。然後編譯我的模塊。問題消失了。 感謝@avd爲我提供了寶貴的線索。

0

您需要添加模塊入口點,這將允許內核加載或卸載module.Without module_init和module_exit內核不知道如何卸載模塊和模塊成爲永久。 BUT不知道解決我需要解決方案如何刪除這個永久模塊。