无法使用rmmod删除可加载内核模块(LKM)

时间:2014-02-19 10:25:26

标签: linux-kernel

我正在尝试为ubuntu 12.04 LTS OS编写内核模块。 内核版本是3.4.0-030400-generic-pae 我能够编译它&将其加载到内核。 对于加载我使用

  

sudo insmod nmod_main.ko

现在,如果我尝试使用

删除它
  

sudo rmmod nmod_main.ko

它给了我吼声错误。 错误:删除'nmod_main':设备或资源繁忙

lsmod给出了以下信息:

  

使用的模块大小      

nmod_main 12394 0 [永久]

为什么此模块显示永久性?

Bellow是此模块的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 ************/

我收到一些编译警告,如下:

  

使用KERNELRELEASE构建= 3.4.0-030400-generic-pae

     

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

     

../ src / nmod_main.c:1:0:警告:“ KERNEL ”已重新定义[默认启用]

     

:0:0:注意:这是前一个定义的位置

     

../ src / nmod_main.c:2:0:警告:“MODULE”重新定义[默认启用]

     

:0:0:注意:这是前一个定义的位置

     

构建模块,第2阶段。

     

使用KERNELRELEASE构建= 3.4.0-030400-generic-pae

请允许任何人帮助我。

我正在使用bellow 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

2 个答案:

答案 0 :(得分:0)

此问题已解决。是的,这是与工具链有关的问题。我下载了.deb文件以从url安装Linux内核。

但我不确定用于生成这些.deb文件的工具链。所以我终于从url下载了Linux内核源代码,并编译了&amp;安装在我的笔记本上。然后编译我的模块。问题消失了。  谢谢@avd为我提供了宝贵的线索。

答案 1 :(得分:0)

你需要添加模块入口点,这将允许内核加载或卸载module.Without module_init和module_exit内核不知道如何卸载模块和模块成为永久性的。 BUt不知道修复我需要的解决方案如何删除这个永久模块。