美文网首页
Linux内核设备编号

Linux内核设备编号

作者: 二进制人类 | 来源:发表于2022-10-31 10:43 被阅读0次

设备编号的组成

在任意一个字符设备文件中,都可以查到主设备编号和次设备编号

  1. 字符设备编号的数据类型:dev_t的数据类型,定义在头文件中。其中12位用于主编号,20位用于次编号。

  2. 主编号:用于表示设备的种类,对于同一主编号的多个设备是由同一个驱动管理。

  3. 次编号:表示在同一种类中的多个设备的编号。

设备号组合和拆分的宏

#include <linux/kdev_t.h>
/*已知设备编号得到主编号和次编号*/
MAJOR(dev_t dev); 
MINOR(dev_t dev);
/*已知主次设备号得到设备号*/
MKDEV(int major, int minor);     /* major表示主设备号,minor表示次设备号 */

设备号的申请和释放

#include <linux/fs.h>
/**
 * [register_chrdev_region 手动申请设备号]
 * @param  from  [设备号]
 * @param  count [申请设备号的个数]
 * @param  name  [设备名称]
 * @return       [成功0 失败返回错误码]
 */
int register_chrdev_region(dev_t from, unsigned count, const char *name);

/**
 * [alloc_chrdev_region 动态申请设备号]
 * @param  dev       [接收申请成功的设备号,所有使用指针]
 * @param  baseminor [起始次设备号]
 * @param  count     [申请设备号的总数]
 * @param  name      [设备名称]
 * @return           [成功0 失败返回错误码]
 */
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
 const char *name);

/**
 * [unregister_chrdev_region 设备号的释放]
 * @param from  [释放的设备号]
 * @param count [释放的个数]
 */
void unregister_chrdev_region(dev_t from, unsigned count);

实例

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>

MODULE_LICENSE("GPL");

static dev_t dev = MKDEV(255, 0);/* 定义设备号变量(动态申请不需要初始化) */
static unsigned int count = 1;



/* 定义模块加载函数 */
static int __init my_module_init(void)
{
    int ret;
    /* 申请设备编号 */
#if 0
    /* 手动申请设备号 */
    ret = register_chrdev_region(dev, count, "mychar");
    if (ret != 0)
    {
        printk(KERN_ERR "register_chrdev_region: ret = %d\n", ret);
        return ret;
    }
#else
    /* 动态申请设备号 */
    ret = alloc_chrdev_region(&dev, 0, count, "mychar");
    if (ret != 0)
    {
        printk(KERN_ERR "register_chrdev_region: ret = %d\n", ret);
        return EINVAL;
    }
#endif

    printk(KERN_INFO "register_chrdev_region major:%d,minor:%d\n", MAJOR(dev), MINOR(dev));

    return 0;
}

/* 定义模块卸载函数 */
static void __exit my_module_exit(void)
{
    /* 释放设备号 */
    unregister_chrdev_region(dev, count);
}

/* 声明模块的加载入口 */
module_init(my_module_init);
/* 声明模块的卸载入口 */
module_exit(my_module_exit);

返回的错误码

#define EPERM 1/* 不允许操作 */
#define ENOENT 2/* 没有这样的文件或目录 */
#define ESRCH 3/* 没有这样的过程 */
#define EINTR 4/* 中断的系统调用 */
#define EIO 5/* I/O错误 */
#define ENXIO 6/* 没有此类设备或地址 */
#define E2BIG 7/* 参数列表太长 */
#define ENOEXEC 8/* 执行文件格式错误 */
#define EBADF 9/* 错误的文件号 */
#define ECHILD 10/* 没有子进程 */
#define EAGAIN 11/* 再试一次 */
#define ENOMEM 12/* 内存不足 */
#define EACCES 13/* 权限不足 */
#define EFAULT 14/* 错误的地址 */
#define ENOTBLK 15/* 需要块设备 */
#define EBUSY 16/* 设备或资源忙 */
#define EEXIST 17/* 文件存在 */
#define EXDEV 18/* 跨设备链接 */
#define ENODEV 19/* 无此设备 */
#define ENOTDIR 20/* 不是一个目录 */
#define EISDIR 21/* 是一个目录 */
#define EINVAL 22/* 无效参数 */
#define ENFILE 23/* 文件表溢出 */
#define EMFILE 24/* 打开文件过多 */
#define ENOTTY 25/* 不是打字机 */
#define ETXTBSY 26/* 文本文件忙 */
#define EFBIG 27/* 文件太大 */
#define ENOSPC 28/* 磁盘空间不足 */
#define ESPIPE 29/* 非法搜索 */
#define EROFS 30/* 只读文件系统 */
#define EMLINK 31/* 链接太多 */
#define EPIPE 32/* 管道破裂 */
#define EDOM 33/* 参数不在数学函数能接受的域中 */
#define ERANGE 34/* 数学结果不可表示 */

相关文章

  • Linux内核设备编号

    设备编号的组成 在任意一个字符设备文件中,都可以查到主设备编号和次设备编号 字符设备编号的数据类型:dev_t的数...

  • (a40i)嵌入式Linux 按键驱动

    简介 Linux内核已经集成按键驱动。按键和键盘在Linux上都属于输入设备;Linux内核为此专门抽象了...

  • Android系统架构

    Linux 内核层 Android 系统是基于 Linux 2.6 内核的,这一层为 Android 设备的各种硬...

  • linux(十九)文件如何表示设备?

    直接上码 Linux中用文件来表示设备,通过major(主设备编号,上面的 8)和minor(次设备编号 8后面跟...

  • 1.1了解全貌-Android王国简介

    1.1.1系统架构 1.Linux内核层:Android系统是基于Linux内核的,该层为Android设备提供了...

  • Android输入事件原理总结

    输入事件系统的相关组件 Linux内核 接受输入设备的中断,并将原始事件的输入写入设备节点中; 设备节点 作为内核...

  • 安卓系统架构

    1.Linux内核层 Android系统是基于Linux 2.6内核的,这一层为Android设备的各种硬...

  • (转)Linux On Android——在 Android 手

    前言 Android 是基于 Linux 内核的开源操作系统,主要用在移动设备上。当然同样是基于 Linux 内核...

  • Linux内核Device Tree介绍

    在比较老的Linux内核版本中(如:2.6.28),Linux内核的各种设备信息一般在arch\arm\mach-...

  • Linux设备模型-设备模型介绍

    Linux是一个宏内核,包括了各类设备的驱动。为了减少设备多样性带来的Linux内核驱动开发的复杂度,以及处理热插...

网友评论

      本文标题:Linux内核设备编号

      本文链接:https://www.haomeiwen.com/subject/czvzzrtx.html