块设备驱动

一、块设备和字符设备的区别
 1,读取数据的单元不同,块设备读写数据的基本单元式块,字符设备的基本单元是字节。

 2,块设备可以随机访问,字符设备只能顺序访问。


二、linux内核中块设备的描述  
gendisk结构体
 struct gendisk { ...
  struct block_device_operations *fops;  /*块设备操作结构体*/
  struct request_queue *queue; 请求队列
  ………………………………………………
  int node_id;
 };
 request与bio结构体
1、请求( request结构体
在Linux块设备驱动中,使用request结构体来表征 等待进行的I/O请求
 struct request{ ...
  struct bio *bio;请求的bio结构体的链表
  struct bio *biotail;请求的bio结构体的链表尾
 }

2、请求队列(request_queue结构体
(1)一个块请求队列是一个块 I/O 请求的队列
(2)请求队列就是IO请求request所形成的队列。在linux内核中用struct request_queue来描述。
(3)请求队列操作函数

3、块I/O
通常1个bio对应1个I/O请求,IO调度算法可将连续的bio合并成1个请求。所以,1个请求可以包含多个bio

三、设备操作   
block_device_operations结构体
 struct block_device_operations { ...
  int (*open)(struct block_device *,fmode_t );
 }
四、块设备驱动注册与注销
1、注册到内核的函数,完成这个任务的函数是 register_blkdev(),
2、注销函数是unregister_blkdev()
3、块设备驱动注册模板


五、I/O的请求处理
1.使用请求队列
2.不使用请求队列,提供一个“制造请求函数”


六、Linux块设备驱动模块加载与卸载
在块设备驱动的模块加载函数中通常需要完成如下工作:
① 分配、初始化请求队列,绑定请求队列和请求函数。
② 分配、初始化gendisk,给gendisk的major、fops、queue等成员赋值,最后添加gendisk。
③ 注册块设备驱动。

卸载与之相反

你可能感兴趣的:(块设备驱动)