Linux文件系统学习--块设备驱动

文章详细介绍了Linux内核中块设备的注册和注销过程,包括register_blkdev和unregister_blkdev函数的使用,以及如何通过blk_major_name结构体管理设备。在注册时,如果主设备号为0,则会自动分配,通过kmalloc申请内存并插入到major_names链表。注销时,需要匹配主设备号和设备名,成功则从链表中移除。
摘要由CSDN通过智能技术生成

块设备的注册

int register_blkdev(unsigned int major, const char *name)

注册块设备时需要指定快设备的主设备号和设备的名字。

int unregister_blkdev(unsigned int major, const char *name)

块设备注销的时候也是同样需要注明块设备号和设备的名字。

结构体

static struct blk_major_name {
    struct blk_major_name *next;
    int major;
    char name[16];
} *major_names[MAX_PROBE_HASH];

设备的存储在major_names, 一个指针数组。每个指针指向一组块设备驱动,这一组块设备驱动的共同点就是major%255 相同。
major_names

Source Code

为了让结构更清楚一些,去掉了一些出错的处理。内存申请blk_major_name, 并接入major_names指针数组中。

int register_blkdev(unsigned int major, const char *name)
{
    /* temporary */
    if (major == 0) {
        for (index = ARRAY_SIZE(major_names)-1; index > 0; index--) {
            if (major_names[index] == NULL)
                break;
        }
        major = index;
        ret = major;
    }

    p = kmalloc(sizeof(struct blk_major_name), GFP_KERNEL);
    p->major = major;
    strlcpy(p->name, name, sizeof(p->name));
    p->next = 0;
    index = major_to_index(major);

    spin_lock_irqsave(&major_names_lock, flags);
    for (n = &major_names[index]; *n; n = &(*n)->next) {
        if ((*n)->major == major)
            break;
    }
    if (!*n)
        *n = p;
    else
        ret = -EBUSY;

}
int 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);
    unsigned long flags;
    int ret = 0;

    down_write(&block_subsys.rwsem);
    spin_lock_irqsave(&major_names_lock, flags);
    for (n = &major_names[index]; *n; n = &(*n)->next)
        if ((*n)->major == major)
            break;
    if (!*n || strcmp((*n)->name, name))
        ret = -EINVAL;
    else {
        p = *n;
        *n = p->next;
    }
    spin_unlock_irqrestore(&major_names_lock, flags);
    up_write(&block_subsys.rwsem);
    kfree(p);

    return ret;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值