首页 > 其他分享 >字符设备的申请和注册

字符设备的申请和注册

时间:2023-03-17 23:01:26浏览次数:32  
标签:字符 major curr name int 申请 cd 注册 设备

god@god-virtual-machine:/proc/bus/input$ cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  5 ttyprintk
  6 lp
  7 vcs
 10 misc
 13 input
......
252 ndctl
253 tpm
254 gpiochip

Block devices:
  7 loop
  8 sd
......
135 sd
253 device-mapper
254 mdp
259 blkext

由上可知,设备分为字符设备和块设备,数字表示主设备号

以下介绍的,无论是设备号,还是设备注册,都是指字符设备。

 

以下函数功能,包含了设备号的申请、字符设备的申请、字符设备添加到内核

static inline int register_chrdev(unsigned int major, const char *name,
                  const struct file_operations *fops)
{
    return __register_chrdev(major, 0, 256, name, fops);
}

 

以下函数,只包含设备号的申请,from是起始设备号,由12位主设备号 + 20子设备号组成32bit值,count是申请设备号的数量

int register_chrdev_region(dev_t from, unsigned count, const char *name)

 

以下函数,只包含设备号的申请,register_chrdev() 和 register_chrdev_region() 最终都是调用此函数进行设备号的申请

static struct char_device_struct *__register_chrdev_region(unsigned int major, unsigned int baseminor, int minorct, const char *name)

 

 

register_chrdev
设备号的申请,字符设备的申请、字符设备添加到内核
register_chrdev_region
设备号的申请(函数名具有迷惑性,没有字符设备添加到内核功能)
__register_chrdev_region
设备号的申请(函数名具有迷惑性,没有字符设备添加到内核功能)

 

 

static struct char_device_struct *
__register_chrdev_region(unsigned int major, unsigned int baseminor,
               int minorct, const char *name)
{
    struct char_device_struct *cd, *curr, *prev = NULL;
    int ret;
    int i;

    if (major >= CHRDEV_MAJOR_MAX) {
        pr_err("CHRDEV \"%s\" major requested (%u) is greater than the maximum (%u)\n",
               name, major, CHRDEV_MAJOR_MAX-1);
        return ERR_PTR(-EINVAL);
    }

    if (minorct > MINORMASK + 1 - baseminor) {
        pr_err("CHRDEV \"%s\" minor range requested (%u-%u) is out of range of maximum range (%u-%u) for a single major\n",
            name, baseminor, baseminor + minorct - 1, 0, MINORMASK);
        return ERR_PTR(-EINVAL);
    }

    cd = kzalloc(sizeof(struct char_device_struct), GFP_KERNEL);
    if (cd == NULL)
        return ERR_PTR(-ENOMEM);

    mutex_lock(&chrdevs_lock);

    if (major == 0) {
        ret = find_dynamic_major();
        if (ret < 0) {
            pr_err("CHRDEV \"%s\" dynamic allocation region is full\n",
                   name);
            goto out;
        }
        major = ret;
    }

    ret = -EBUSY;
    i = major_to_index(major);
    for (curr = chrdevs[i]; curr; prev = curr, curr = curr->next) {
        if (curr->major < major)
            continue;

        if (curr->major > major)
            break;

        if (curr->baseminor + curr->minorct <= baseminor)
            continue;

        if (curr->baseminor >= baseminor + minorct)
            break;

        goto out;
    }

    cd->major = major;
    cd->baseminor = baseminor;
    cd->minorct = minorct;
    strlcpy(cd->name, name, sizeof(cd->name));

    if (!prev) {
        cd->next = curr;
        chrdevs[i] = cd;
    } else {
        cd->next = prev->next;
        prev->next = cd;
    }

    mutex_unlock(&chrdevs_lock);
    return cd;
out:
    mutex_unlock(&chrdevs_lock);
    kfree(cd);
    return ERR_PTR(ret);
}

 

由此函数可知,主设备号虽然由12位,但是主设备号的范围只支持 0~511,子设备号则占满20bit

 

标签:字符,major,curr,name,int,申请,cd,注册,设备
From: https://www.cnblogs.com/god-of-death/p/17228557.html

相关文章

  • Java基础字符串练习
    ​请定义一个方法用于判断一个字符串是否是对称的字符串,并在主方法中测试方法。例如:"abcba"、"上海自来水来自海上"均为对称字符串。训练提示:1、判断是否对称,方法的返回值......
  • Java基础字符串练习
    ​我国的居民身份证号码,由由十七位数字本体码和一位数字校验码组成。请定义方法判断用户输入的身份证号码是否合法,并在主方法中调用方法测试结果。规则为:号码为18位,不能以数......
  • MDK 代码优化导致的获取字符串长度问题
    如下代码//平台_硬件版本_MCU型号_编译时间(预留64字节空间,通过工具寻找并改写)staticconstcharMCU_VERSION[64]="LATD_HW00_APP"; //不要修改,工具会自动修改......
  • 字符串
    字符串的内存问题点击查看代码publicstaticvoidmain(String[]args){Stringstr1="卡卡罗特";Stringstr2="卡卡罗特";Stringstr3......
  • 初试 chatapt 免费免注册 在线版 在线地址
    搜索关键词: chatapt 免注册 ||   chataptwindows免注册等 https://blog.51cto.com/yunbk/6047000  给的连接只有一个能用的   2023.03.17   ......
  • 输入一个字符串(例如:3+6-3*4/2,运算符只有 + - * / 四个),计算结果。不考虑加减乘除优先级
    这是自己面试遇到的面试题,考Java基础,String。考的很基础,但是String确实java中很重要的基础部分。题目:输入一个字符串(例如:3+6-3*4/2,输出12。运算符只有+-*/四个),计算......
  • redis的简单动态字符串
    概念redis在c的基础上编写,但是redis的许多数据结构是不同于c的数据结构。redis的字符串表示是利用自己构建的SDS(简单动态字符串)作为默认字符串表示的。而c默认的字符......
  • Java中使用字节流和字符流操作文件的几种方法和性能对比
    注:本文转自:https://mp.weixin.qq.com/s/QuFkw-f1l0kyOqsBNNrRmw在Java中操作文件的方法本质上只有两种:字符流和字节流,而字节流和字符流的实现类又有很多,因此在文件写入......
  • Java中通过substring和charAt截取字符串并获取指定字符
    场景字符串类似如下现在要获取S:后面的数字9实现indedOf方法,获取某字符所在下标。flightResult.getCabinString().indexOf(flightResult.getDefaultCabin().getCabinCode())......
  • Java中将CST格式的时间字符串进行格式化
    场景Java中实现将CST格式的时间字符串按指定格式进行格式化。实现代码SimpleDateFormatdateFormat=newSimpleDateFormat("EEEMMMddHH:mm:sszzzyyyy",Locale.US);......