Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux中创建简单的设备驱动程序_C_Linux_Linux Device Driver - Fatal编程技术网

C 在Linux中创建简单的设备驱动程序

C 在Linux中创建简单的设备驱动程序,c,linux,linux-device-driver,C,Linux,Linux Device Driver,我是Linux驱动程序开发新手。我正在创建非常简单的设备驱动程序。首先,我在2500注册我的设备,称之为rday。通过调用(假设我有chardrv.c文件): 我的chardrv.c文件: #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <linux/types.h> // for dev_t typedef #incl

我是Linux驱动程序开发新手。我正在创建非常简单的设备驱动程序。首先,我在2500注册我的设备,称之为rday。通过调用(假设我有
chardrv.c
文件):

我的
chardrv.c
文件:

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

#include <linux/types.h>    // for dev_t typedef
#include <linux/kdev_t.h>   // for format_dev_t
#include <linux/fs.h>       // for alloc_chrdev_region()
#include <linux/cdev.h>     // for "struct cdev"
#include <asm/uaccess.h>    // for user/kernel space copy routines

static dev_t mydev;
static char buffer[64];

static char output[] = "Victory is mine!\n";

ssize_t
my_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
    printk(KERN_INFO "In chardrv read routine.\n");
    printk(KERN_INFO "Count field is %lu.\n", count);
    printk(KERN_INFO "Offset is %lu.\n", *f_pos);

    if (output[*f_pos] == '\0') {
        printk(KERN_INFO "End of string, returning zero.\n");
        return 0;
    }

    copy_to_user(buf, &output[*f_pos], 1);
    *f_pos += 1;
    return 1;  // returned a single character
}

struct cdev my_cdev;

struct file_operations my_fops = {
    .owner = THIS_MODULE,
    .read = my_read,
};

static int __init chardrv_in(void)
{
    printk(KERN_INFO "module chardrv being loaded.\n");

    alloc_chrdev_region(&mydev, 0, 1, "rday");
    printk(KERN_INFO "%s\n", format_dev_t(buffer, mydev));

    cdev_init(&my_cdev, &my_fops);
    my_cdev.owner = THIS_MODULE;
    cdev_add(&my_cdev, mydev, 1);

    return 0;
}

static void __exit chardrv_out(void)
{
    printk(KERN_INFO "module chardrv being unloaded.\n");

    cdev_del(&my_cdev);
    unregister_chrdev_region(mydev, 1);
}

module_init(chardrv_in);
module_exit(chardrv_out);

MODULE_AUTHOR("Robert P. J. Day, http://crashcourse.ca");
MODULE_LICENSE("GPL");
我使用以下方法为该驱动程序创建文件:

sudo mknod /dev/victoryismine c 250 0
然后,如果我使用以下方法进行检查:

ls -l /dev/victoryismine
我能找到那个文件。但是跑步:

cat /dev/victoryismine
我得到一个错误:

没有这样的设备或地址


我不知道我做错了什么。

我猜
mknod
udev
systemd
不太友好(或兼容),ls-l`.@amesshel的输出是什么?@amesshel它显示了/dev/victoryismine目录,@user3565829,
ls-l
的输出是什么????我们希望看到输出,而不是你看到它并告诉我们你看到了它。请发布输出内容,不要评论有输出。看到我们问的问题与你回答的问题的区别了吗?
cat /dev/victoryismine