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