4

私は一週間私を混乱させてきた問題を抱えています. 誰かが私を助けてくれることを願っています。単純な char デバイス モジュールを作成し、insmodそれをカーネルに書き込み、 mknodchar ファイルを/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世界が得られます。

エラーを見つけるのを手伝ってもらえますか?

4

1 に答える 1

1

これを使って:

fprintf(stderr, "fopen() failed: %s\n", strerror(errno));

ファイルを含めます<errno.h>。エラーの詳細が表示されます。権限の問題だと思います。ユーザー空間のバイナリを sudo で実行してみてください。

于 2013-01-31T11:46:49.133 に答える