linux驱动---字符设备的注册register_chrdev说起

字符设备是 Linux 操作系统中的一种主要设备类型。字符设备是一种以字符流的形式进行输入、输出的设备。它通过内核的文件操作接口(如 read() 和 write())与应用程序进行交互,将数据按照字节流的方式进行传输,并且没有类似读写指针那样的位置概念。在 Linux 中,字符设备通过注册机制进行管理,注册时需要分配设备号,并指定设备文件的操作函数。

register_chrdev() 函数是 Linux 内核中用于注册字符设备的函数。该函数有三个参数:设备号、设备名称和设备文件的操作函数:

```c

int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops);

```

其中:

- major:主设备号,用于区分不同的字符设备。同一类型的字符设备应具有相同的主设备号。

- name:设备名称,字符串类型,用来标识该设备。

- fops:操作函数集合,用于描述设备文件的操作行为。

register_chrdev() 函数内部会根据传入的参数创建一个 cdev 结构体,并将其添加到内核的字符设备链表中。在 cdev 结构体中,包含了字符设备的主设备号、设备名称、设备文件的操作函数等信息。同时,register_chrdev() 函数还会返回一个整数值,表示创建成功的设备号,用于创建设备文件时使用。

下面给出一个简单的注册字符设备的示例:

```c

#include

#include

#include

static int mydev_major = 0;

static int mydev_open(struct inode *inode, struct file *filp)

{

printk(KERN_ALERT "mydev open!\n");

return 0;

}

static int mydev_release(struct inode *inode, struct file *filp)

{

printk(KERN_ALERT "mydev release!\n");

return 0;

}

static ssize_t mydev_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)

{

printk(KERN_ALERT "mydev read!\n");

return 0;

}

static ssize_t mydev_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)

{

printk(KERN_ALERT "mydev write!\n");

return size;

}

static struct file_operations mydev_fops={

.open = mydev_open,

.release = mydev_release,

.read = mydev_read,

.write = mydev_write

};

static int __init mydev_init(void)

{

mydev_major = register_chrdev(0, "mydev", &mydev_fops);

if (mydev_major < 0) {

printk(KERN_ALERT "Failed to register device!\n");

return mydev_major;

}

printk(KERN_ALERT "Mydev registered, major is %d!\n", mydev_major);

return 0;

}

static void __exit mydev_exit(void)

{

unregister_chrdev(mydev_major, "mydev");

printk(KERN_ALERT "Mydev unregistered!\n");

}

module_init(mydev_init);

module_exit(mydev_exit);

MODULE_LICENSE("Dual MIT/GPL");

```

上述代码中,我们定义了一个名为 mydev 的字符设备,包含了四个操作函数:mydev_open、mydev_release、mydev_read、mydev_write。我们在 mydev_init() 函数中通过调用 register_chrdev() 函数来注册该设备。如果注册成功,函数将返回一个设备号,该设备号将被保存在 mydev_major 变量中,并在注册成功后打印出设备号。在 mydev_exit() 函数中,我们通过调用 unregister_chrdev() 函数来注销设备。

如果要实际使用此设备,我们还需要创建字符设备文件。字符设备文件的创建可以通过 mknod 命令来完成。假设我们在 /dev 目录下创建了名为 mydev 的设备文件:

```

# mknod /dev/mydev c 0

```

其中, 为 register_chrdev() 函数返回的设备号。创建成功后,我们可以使用标准的读写系统调用(如 read()、write())来读写 mydev 设备文件,内核会调用我们定义的相应操作函数进行操作。

register_chrdev() 函数是字符设备注册的核心函数,正确使用该函数可以方便地创建和管理字符设备。同时需要注意,在使用该函数时,需要避免重复注册相同的设备号和设备名称,以确保系统正常运行。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(21) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部