register chrdev和mknod的区别

register_chrdevmknod 是 Linux 内核和用户空间中与字符设备相关的两个不同的功能或命令。它们的用途和操作环境有所不同。

1. register_chrdev (内核空间)

register_chrdev 是 Linux 内核中的一个函数,用于注册字符设备驱动程序。字符设备是一种允许按字节进行数据读写的设备,与块设备不同。register_chrdev 允许驱动程序向内核注册一个字符设备,从而使用户空间的应用程序能够通过设备文件与该设备进行交互。

使用场景:
  • 驱动程序开发:在开发内核模块或设备驱动程序时,使用 register_chrdev 来注册字符设备。
  • 创建设备文件register_chrdev 关联一个主设备号和文件操作结构体,从而使设备驱动能够处理设备文件的打开、关闭、读、写等操作。
#include <linux/fs.h>
#include <linux/module.h>

int my_open(struct inode *inode, struct file *filp) {
    // 打开设备的处理代码
    return 0;
}

struct file_operations fops = {
    .open = my_open,
    // 其他文件操作...
};

int init_module(void) {
    int major = register_chrdev(0, "my_device", &fops);
    if (major < 0) {
        printk(KERN_ALERT "Registering char device failed with %d\n", major);
        return major;
    }
    printk(KERN_INFO "I was assigned major number %d. To talk to\n", major);
    return 0;
}

2. mknod (用户空间)

mknod 是一个用户空间的命令,用于创建文件系统中的特殊文件,比如设备文件、命名管道(FIFO)等。对于设备文件,mknod 需要指定文件类型(字符设备或块设备)、主设备号和次设备号。

使用场景:
  • 创建设备节点:在 /dev 目录下创建一个与字符设备驱动程序关联的设备文件,从而使用户空间的程序能够访问内核中的设备。
  • 设置设备权限:创建的设备文件还可以通过设置权限来控制对设备的访问。
使用示例:

假设字符设备的主设备号为 240,次设备号为 0,并且想要创建 /dev/my_device

mknod /dev/my_device c 240 0

 

  • c 表示字符设备,240 是主设备号,0 是次设备号。

总结

  • register_chrdev:在内核空间注册字符设备,使其可以被用户空间访问。
  • mknod:在用户空间创建与字符设备对应的设备文件,使用户程序可以通过文件系统与字符设备通信。

register_chrdevmknod 都涉及设备的注册,但它们作用在不同的层面和上下文中,因此注册的设备有本质上的区别。

1. register_chrdev 注册的设备 (内核空间)

  • 层次register_chrdev 是在内核空间中注册的字符设备驱动程序。
  • 作用:它主要是告诉内核,有一个字符设备驱动程序可供使用,并指定如何处理与该设备相关的文件操作(如打开、读取、写入等)。它为字符设备分配一个主设备号,并将文件操作函数指针与该设备号关联起来。
  • 结果:注册后,内核知道如何与设备交互,并可以根据主设备号找到相应的驱动程序代码来处理用户对设备的访问请求。
  • 没有创建设备节点register_chrdev 仅注册设备,不会在文件系统中创建设备节点(设备文件)。

2. mknod 创建的设备 (用户空间)

  • 层次mknod 是在用户空间中操作的命令,用于在文件系统中创建设备文件(设备节点)。
  • 作用:它在文件系统(通常是 /dev 目录)中创建一个特殊的文件(设备节点),这个文件本质上是一个与内核中的设备驱动程序相关联的入口。它允许用户空间的程序通过标准的文件操作(如 openreadwrite)访问内核中的设备。
  • 需要设备已经注册mknod 需要内核已经有与指定的主设备号和次设备号相关联的驱动程序(通过 register_chrdev 或其他内核注册方法注册的)。否则,创建的设备节点无法正常使用。
  • 创建设备节点mknod 创建一个设备节点,这是用户空间程序访问设备的方式。

注册的设备区别总结

  • register_chrdev:在内核中注册字符设备,使其具有实际功能。它确保内核可以处理来自用户空间的设备访问请求,但不会直接在文件系统中显示任何内容。

  • mknod:在文件系统中创建一个设备节点,使用户空间能够访问内核中已注册的设备。这个设备节点只是一个入口,实际的设备功能依赖于内核中注册的设备驱动。

简而言之,register_chrdev 是在内核中注册设备的逻辑和功能,而 mknod 是在用户空间创建设备文件,使得用户空间能够通过文件系统与内核中的设备交互。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值