13_3_块设备驱动的注册

1.块设备注册
int register_blkdev(unsigned int_major, const char *name);
该函数完成两件事:
a. 分配一个动态主设备号。
b. 在/proc/devices中创建一个入口。
  1. /**
    
     * register_blkdev - register a new block device
    
     *
    
     * @major: the requested major device number [1..255]. If @major=0, try to
    
     * allocate any unused major number.
    
     * @name: the name of the new block device as a zero terminated string
    
     *
    
     * The @name must be unique within the system.
    
     *
    
     * The return value depends on the @major input parameter.
    
     * - if a major device number was requested in range [1..255] then the
    
     * function returns zero on success, or a negative error code
    
     * - if any unused major number was requested with @major=0 parameter
    
     * then the return value is the allocated major number in range
    
     * [1..255] or a negative error code otherwise
    
     */
    
    
    
    int register_blkdev(unsignedint major, const char *name)//major是块设备的主设备号,name为设备名,他会在/proc/devices中显示。
    如果major为0,内核会自动分配一个新的主设备号,函数返回值就是这个主设备号。
    {
    
        struct blk_major_name **n, *p;
    
        int index, ret = 0;
    
    
    
        mutex_lock(&block_class_lock);
    
    
    
        /* temporary */
    
        if (major == 0) {
    
            for (index = ARRAY_SIZE(major_names)-1; index > 0; index--) {
    
                if (major_names[index] == NULL)
    
                    break;
    
            }
    
    
    
            if (index == 0) {
    
                printk("register_blkdev: failed to get major for %s\n",
    
                 name);
    
                ret = -EBUSY;
    
                goto out;
    
            }
    
            major = index;
    
            ret = major;
    
        }
    
    
    
        p = kmalloc(sizeof(struct blk_major_name), GFP_KERNEL);
    
        if (p == NULL) {
    
            ret = -ENOMEM;
    
            goto out;
    
        }
    
    
    
        p->major = major;
    
        strlcpy(p->name, name, sizeof(p->name));
    
        p->next = NULL;
    
        index = major_to_index(major);
    
    
    
        for (n = &major_names[index]; *n; n = &(*n)->next) {
    
            if ((*n)->major == major)
    
                break;
    
        }
    
        if (!*n)
    
            *n = p;
    
        else
    
            ret = -EBUSY;
    
    
    
        if (ret < 0) {
    
            printk("register_blkdev: cannot get major %d for %s\n",
    
             major, name);
    
            kfree(p);
    
        }
    
    out:
    
        mutex_unlock(&block_class_lock);
    
        return ret;
    
    }
    
    
    
    EXPORT_SYMBOL(register_blkdev);
    

    
    
    
    
  2. 2.注销。

int unregister_blkdev(unsigned int major, const char *name); //参数必须与register_blkdev()匹配,否则返回错误。

  1. void unregister_blkdev(unsigned int major, const char *name)
    
    {
    
        struct blk_major_name **n;
    
        struct blk_major_name *p = NULL;
    
        int index = major_to_index(major);
    
    
    
        mutex_lock(&block_class_lock);
    
        for (n = &major_names[index]; *n; n = &(*n)->next)
    
            if ((*n)->major == major)
    
                break;
    
        if (!*n || strcmp((*n)->name, name)) {
    
            WARN_ON(1);
    
        } else {
    
            p = *n;
    
            *n = p->next;
    
        }
    
        mutex_unlock(&block_class_lock);
    
        kfree(p);
    
    }
    
    
    
    EXPORT_SYMBOL(unregister_blkdev);
    

     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值