Linux块设备驱动(2)---块驱动中相关相关模块模板

1.块设备驱动的模块加载与卸载

1)块设备驱动的模块加载完成的工作如下:

Ø 分配,初始化请求队列,绑定请求队列和请求函数

Ø 分配,初始化gendisk,给gendisk的major,fops,queue等成员赋值,最后添加gendisk.

Ø 注册块设备驱动.

代码1:使用blk_alloc_queue函数完成块设备驱动的模块加载模板

    static int __init xxx_init(void){

        //分配gendisk

        xxx_disks = alloc_disk(1);

        if(!xxx_disks){

            goto out;

        }

        //块设备驱动注册

        if(register_blkdev(xxx_MAJOR, "xxx"){

            err = -EIO;

            goto out;

        }

        //"请求队列"分配

        xxx_queue = blk_alloc_queue(GFP_KERNEL);

        if(!xxx_queue){

            goto out_queue;

        }

        blk_queue_make_request(xxx_queue, &xxx_make_request);//绑定"制造请求"函数

        blk_queue_hardsect_size(xxx_queue,xxx_blocksize);//告知内核硬件扇区尺寸

        //gendisk初始化

        xxx_disks->major = xxx_MAJOR;

        xxx_disks->first_minor = 0;

        xxx_disks->fops = &xxx_fop;

        xxx_disks->queue = xxx_queue;

        sprintf(xxx_disks->disk_name, "xxx%d", i);

        set_capacity(xxx_disks, xxx_size);//设置gendisk容量为xxx_size个扇区大小

        add_disk(xxx_disks);

 

        return 0;

 

        out_queue:unregister_blkdev(xxx_MAJOR, "xxx");

        out:put_disk(xxx_disks);

        blk_cleanup_queue(xxx_queue);

 

        return -ENOMEM;

    }

代码2:使用blk_init_queue函数完成块设备驱动的模块加载模板

    static int __init xxx_init(void){

        //块设备驱动注册

        if(register_blkdev(xxx_MAJOR, "xxx"){

            err = -EIO;

            goto out;

        }

        //请求队列初始化

        xxx_queue = blk_init_queue(xxx_request, xxx_lock);

        if(!xxx_queue){

            goto out_queue;

        }

 

        blk_queue_ha

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值