【发布时间】:2015-11-24 18:11:38
【问题描述】:
我正在尝试为 ubuntu 12.04 LTS 操作系统编写内核模块。 内核版本是 3.4.0-030400-generic-pae 我能够编译它并将其加载到内核。 对于加载,我使用
sudo insmod nmod_main.ko
现在,如果我尝试使用
删除它sudo rmmod nmod_main.ko
它给了我以下错误。 错误:删除“nmod_main”:设备或资源繁忙
lsmod 提供以下信息:
使用的模块大小
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 ************/
我收到如下一些编译警告:
使用 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: 警告:“模块”重新定义[默认启用]
:0:0: 注意:这是之前定义的位置
构建模块,第 2 阶段。
使用 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 失败)?
-
这是kbuild处理编译器的工作。
-
唯一可能导致
rmmod使此类琐碎代码失败的是标志。
标签: linux-kernel