Linux 장치 드라이버를 이해하려고 합니다. 다음을 사용하여 모듈을 설치하려고합니다.모듈 삽입명령줄에서. 삽입 후 로드된 모듈을 제거하려고 했으나 오류로 인해 실패했고,
could not remove module hello: Device or resource busy
내가 찾은이 링크하지만 유효한 답변을 제공하는 것 같지 않습니다.
hello.c
다음은 이 모듈의 C 코드입니다( ).
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */
static int data __initdata = 3;
#ifdef USE_OLDER_NAMING
int init_module(void)
{
printk(KERN_INFO "Hello world 1.\n");
return -1;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.\n");
}
#else
static int __init my_init(void)
{
printk(KERN_ALERT "Hello Module Inserted : %d \n",data);
return 0;
}
static void __exit my_exit(void)
{
printk(KERN_ALERT "Hello Module removed : %d \n",data);
return;
}
module_init(my_init);
module_exit(my_exit);
#endif
이 모듈을 컴파일하기 위해 다음 Makefile을 사용하고 있습니다.
obj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
컴파일 후 명령을 사용하여 모듈을 설치합니다 sudo insmod ./hello.ko
. 에서 로드된 모듈을 볼 수 있습니다 /proc/modules
. 출력 cat /proc/modules | grep hello
은 입니다 hello 12490 0 - Live 0x0000000000000000 (POF)
.
체크인하면 dmesg
로그를 볼 수 있습니다 Hello Module Inserted : 3
. 모듈을 제거하려고 하면 다음 오류가 발생합니다.
rmmod: ERROR: ../libkmod/libkmod-module.c:769 kmod_module_remove_module() could not remove 'hello': Device or resource busy
rmmod: ERROR: could not remove module hello: Device or resource busy
의 출력은 cat /proc/modules | grep hello
다음과 같습니다hello 12422 0 - Unloading 0x0000000000000000 (POF-)
제 질문은 이 모듈을 제거하는 방법입니다. 시퀀스/코드에 어떤 문제가 있나요?
답변1
먼저, 귀하의 반품 명세서에내 출구이 문제를 일으키는 기능입니다.
제거 부분의 경우, 모듈을 강제로 제거하려면 활성화해야 합니다.CONFIG_MODULE_FORCE_UNLOAD커널에서. 그렇지 않으면 시스템을 다시 시작해야 합니다.