2017-12-09 51 views
0

LinuxでCで文字デバイスドライバを実装しようとしています。 私のコードは次のとおりです。insmod:エラー:モジュールを挿入できませんでした。そのようなデバイスはありません

#include<linux/device.h> 
#include<linux/init.h> 
#include<linux/kernel.h> 
#include<linux/module.h> 
#include<linux/fs.h> 
#include<linux/err.h> 
#include<asm/uaccess.h> 
#define SUCCESS 0 
#define DEVICE_NAME "chardev" 
#define BUF_LEN 80 

MODULE_LICENSE("GPL"); 

static int Major; 
static char msg[BUF_LEN]={0}; 
static short s_o_msg; 
static int Device_Open = 0; 
static struct class* chardevClass = NULL; 
static struct device* chardevDevice = NULL; 
static char *msg_Ptr; 

static int device_open(struct inode *, struct file *); 
static int device_release(struct inode *, struct file *); 
static ssize_t device_read(struct file *, char *, size_t, loff_t *); 
static ssize_t device_write(struct file *, const char *, size_t, loff_t *); 



static struct file_operations fops = { 
     .read = device_read, 
     .write = device_write, 
     .open = device_open, 
     .release = device_release 
}; 

static int __init chardev_init(void){ 
    Major = register_chrdev(0, DEVICE_NAME, &fops); 

    if (Major < 0) { 
     printk(KERN_ALERT "Registering char device failed with %d\n", Major); 
     return Major; 
    } 

    chardevDevice = device_create(chardevClass, NULL, MKDEV(Major,0), NULL, DEVICE_NAME); 
    if (IS_ERR(chardevDevice)) { 
     class_destroy(chardevClass); 
     unregister_chrdev(Major, DEVICE_NAME); 
     printk(KERN_ALERT 
     "Failed to create the device\n"); 
     return PTR_ERR(chardevDevice); 
    } 

    printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major); 
    printk(KERN_INFO "the driver, create a dev file with\n"); 
    printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major); 
    printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n"); 
    printk(KERN_INFO "the device file.\n"); 
    printk(KERN_INFO "Remove the device file and module when done.\n"); 

    return SUCCESS; 
} 

static void __exit chardev_exit(void){ 
    device_destroy(chardevClass, MKDEV(Major, 0)); 
    class_unregister(chardevClass); 
    class_destroy(chardevClass); 
    unregister_chrdev(Major, DEVICE_NAME); 
    printk(KERN_INFO "Goodbye!\n"); 
} 

static int device_open(struct inode *inodep, struct file *filep) 
{ 
    static int counter = 0; 

    if (Device_Open) 
     return -EBUSY; 

    Device_Open++; 
    sprintf(msg, "I already told you %d times Hello world!\n", counter++); 
    msg_Ptr = msg; 
    try_module_get(THIS_MODULE); 

    return SUCCESS; 
} 

static ssize_t device_read(struct file *filep, char *buffer, size_t length, loff_t * offset){ 

    int bytes_read = 0; 

    if (*msg_Ptr == 0) 
     return 0; 

    while (length && *msg_Ptr) { 

     put_user(*(msg_Ptr++), buffer++); 

     length--; 
     bytes_read++; 
    } 

    return bytes_read; 
} 

static int device_release(struct inode *inodep, struct file *filep) 
{ 
    Device_Open--; 

    module_put(THIS_MODULE); 

    return 0; 
} 



static ssize_t device_write(struct file *filep, const char *buffer, size_t length, loff_t *offset){ 
    sprintf(msg, "%s(%zu letters)", buffer, length); 
    s_o_msg = strlen(msg); 
    printk(KERN_INFO "Received %zu characters from the user\n", length); 
    return length; 
} 

module_init(chardev_init); 
module_exit(chardev_exit); 

を、その後、私は次のコマンドでこれをコンパイルし、この瞬間にすべてがうまくなります

obj-m := memory.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 /sbin/insmod memory.ko 

私はエラーを取得する:

insmod: ERROR: Could not insert module : No such device 

私が間違っていることを教えてください。このモジュールを正しく実行するにはどうすればよいですか?

ありがとうございます。

+0

は 'make'出力を表示します。 – achal

+0

実行後directmly insmod memory.ko私はメッセージを受け取りました:デバイスが見つかりません – heszek

+0

私の答えをチェックして、 'insmod'が失敗したため' class_create() 'を使ってクラスを作成しませんでした。 – achal

答えて

0

あなたは

[email protected]:/sys/class# ls 
.. there are so many different class.. 

を見るためならば、あなたのdeviceも、なぜclass_create();

を使用して1つのクラスを作成していますone classにする必要がありますdevice_create()前にクラス(class_create)を作成することを忘れあなたのコードの下に行を追加してください。

chardevClass = class_create(THIS_MODULE, "overflow"); 

    chardevDevice = device_create(chardevClass, NULL, MKDEV(Major,0), NULL, DEVICE_NAME); 

ルートモードinsertingモジュール、compilingための配列、insertingおよびモジュールを実行するために必要とされる次のとおり まずmake

[email protected]:~/s_flow# make 

を行い、その後insmod &はdmesg出力

を分析します
[email protected]:~/s_flow# insmod memory.ko 
    [email protected]:~/s_flow# dmesg 
    .. 
    .. check here whether __init chardev_init() is invoked or not 

たりも

[email protected]:~/s_flow# modifno memory.ko 

私はそれが役に立てば幸いmodinfoを確認することができます。

関連する問題