我正在嘗試爲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
請閱讀編譯器消息 - 不要定義'__KERNEL__'和'MODULE'。 –
同意,但然後編譯器將如何確定這是內核代碼,也不是內核的永久部分(即可加載內核模塊)? –
我的第一個問題(rmmod失敗)的任何亮點? –