私は一週間私を混乱させてきた問題を抱えています. 誰かが私を助けてくれることを願っています。単純な char デバイス モジュールを作成し、insmod
それをカーネルに書き込み、 mknod
char ファイルを/dev
. の後に見ることができinsmod
ますcat /proc/devices
。しかし、この char デバイス ファイルを開くとエラーが発生します。
私のcharデバイスコードは次のとおりです。
#include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/uaccess.h>
#define CALL_DEV_NAME "mn2"
#define CALL_DEV_MAJOR 230
struct cdev cdev;
MODULE_LICENSE("GPL");
int call_open(struct inode *inode,struct file *filp){
int num=MINOR(inode->i_rdev);
printk("call open minor is:%d \n",num);
return 0;
}
static struct file_operations call_fops={
.owner=THIS_MODULE,
.open=call_open,
};
int call_init(void){
int result;
printk("call call_init \n");
result=register_chrdev_region(MKDEV(CALL_DEV_MAJOR,0),
1,CALL_DEV_NAME);
if(result<0){
printk("registerfail \n");
return result;
}
cdev_init(&cdev,&call_fops);
cdev.ops=&call_fops;
cdev.owner=THIS_MODULE;
cdev_add(&cdev,MKDEV(CALL_DEV_MAJOR,0),1);
return 0;
}
void call_exit(void){
printk("call call_exit \n");
unregister_chrdev(CALL_DEV_MAJOR,CALL_DEV_NAME);
}
module_init(call_init);
module_exit(call_exit);
テストコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){
FILE *fd;
fd=fopen("/dev/mn2","r+");
if(fd==NULL)
printf("fail\n");
}
私の Makefile は次のとおりです。
ifneq ($(KERNELRELEASE),)
obj-m := mn2.o
else
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order
endif
私が使用するコマンドは次のとおりです。
make
insmod mn2.ko
それから私は見ることができmn2
ます/proc/devices
mknod mn2 c 230 0
mn2
また、以下のようなファイルもあります/dev
しかし、test.c をコンパイルしgcc test.c -o test
てテストを実行すると、常にfail
世界が得られます。
エラーを見つけるのを手伝ってもらえますか?