块设备驱动

块设备I/O与字符设备操做的主要区别如下所示 。
·
1) 结构体 ons
在文件 /linux/fs.h 中定义了结构体 ons, 此结构体描述了对块设备的
操作的集合,具体代码如下所示:
ons结构体
ons {
int (*open) (*, );// 打开
int (*) (*, );//释放
int (*) (*, , ,long);
int (*ioctl) (*, , ,long);
int (*) (*, , ,long);
int (*) (*, ,
void **,long *);
int (*) (*);// 介质被改变
int (*) (*);// 使介质改变
int (*)(*,*);// 填充驱动器信息
*owner;// 模块拥有者
};
2) 结构体
结构体来描述一个独立的磁盘设备或者分区,具体代码如下:
{
int major;/* 主设备号 */
int ;// 第一个次设备号
int ;/*最大此设备数,如果不能分区 为1*/
char [32];/* name of major*/
**part; /*磁盘分区信息 */
int ;
ons *fops; // 块设备操作
*queue;// 请求队列,用于 管理设备 I/O 请求队列的指针
void *;// 私有数据
【块设备驱动】 ;// 扇区数,512 字节 为一个扇区,描述设备容量
int flags;
*;
kobj;
*;
*;
*;
int ;
;/* RAID */
long stamp;
int ;

块设备驱动

文章插图
#ifdef
*;
#else
;
#endif
;
};
3) 结构体和 bio
(1) 请求
结构体和在Lmux块设备驱动中,使用结构体来表征等待进行的
I/O请求,用来表征一个块I/O请求队列 。这两个结构体的定义代码如下所示:
{
;
long flags;
;/*要传输的下一个扇区*/
long ;/*要传送的扇区数目*/
int ;/*当前要传送的扇区*/
;/*要完成的下一个扇区*/
long ;/*要被完成的扇区数目*/
int ;/*当前要被完成的扇区数目*/
bio* bio;/*请求的bio结构体的链表*/
bio* ;/*请求的bio结构体的链表尾*/
/*请求在屋里内存中占据的不连续的段的数目*/
short ;
short ;
int tag;
char* ;/*传送的缓冲区,内核的虚拟地址*/
int ;/*引用计数*/
...
};
(2) 请求队列
请求队列跟踪等候的块I/O请求,它存储用于描述这个设备能够支持的请求的类型信息 。请求队列
还要实现一个插入接口,这个接囗允许使用多个I/O调度器,I/O调度器以最优性能的方式向驱动提交
I/O请求 。大部分I/O调度器积累批量的I/O请求,并将其排列为递增/递减的块索引顺序后提交给驱动 。
另外,I/O调度器还负责合并邻近的请求,当一个新的I/O请求被提交给调度器后,它会在队列中搜寻
包含邻近的扇区的请求 。如果找到一个并且此请求合理,则调度器会将这两个请求合并 。
结构体的定义代码如下所示:
{
...
/*自旋锁,保护队列结构体*/
ck;
*;
;/*队列*/
/*队列设置*/
sts;/*最大的请求数量*/
;
;
ng;
tors;/*最大扇区数*/
;
;/*最大的段数*/
;
;/*硬件扇区尺寸*/
;/*最大的段尺寸*/
;/*段边界掩码*/
ment;/*DMA传送内存对齐限制*/
*;
;/*引用计数*/
;
t;
;
;
_list;
*;
;
};
当然: 在块设备上,同样可以使用函数 实现 块设备 驱动的 模块卸载 、 加载 、打开与释放操作,相关知识请参阅先关资料 。
的 块设备 驱动在目录 /dev/block 中,其中主要内容如下所示:
在上述内容中,主设备号为1的是各个内存块设备,主设备号为7的是各个回环块设备,主设
备号为31的是mtd设备中的块设备,表示SD卡的块设备 。