在块设备驱动中,有一个类似于字符设备驱动中file_operations
结构体的block_device_operations
结构体,他是对块设备操作的集合。
1.block_device_operations结构体
2.打开和释放
int (*open)(struct block_device *,fmode_t);
void (*release)(struct gendisk *,fmode_t);
3.I/O控制
int (*ioctl)(struct block_device *,fomede_t,unsigned,unsigned long);
int (*compat_ioctl)(struct block_device *,fomde_t,unsigned,unsigned long);
上述函数是ioctl()
系统调用的实现,块设备包含大量的标准请求
,这些请求由Linux通用块设备层
处理,因此大部分块设备驱动的ioctl()
函数相当短,当一个64位系统内的32位进程调用ioctl()
的时候,调用的是compat_ioctl()
。
4.介质改变
int (*media_changed)(struct gendisk *gd);
被内核调用以检查驱动器中的介质是否已经改变,该函数已经被checkout_events()
替代。老的linux在用户空间里轮询可移动磁盘介质是否存在,而新的内核则在内核空间里轮询。
check_events()
函数检查有没有挂起的事件,如果有DISK_event_media_change
和DISK_EVENT_EJECT_REQUEST
事件,就返回。
5.使介质有效
int (revalidate_disk)(struct gendisk *gd);
revalidate_disk()
函数被调用用响应一个介质改变
,他给驱动一个机会来进行必要的工作以使新介质准备好。
6.获得驱动器信息
int (*getgeo)(struct block_device*,struct hd_geometry *);
该函数根据驱动器的几何信息填充一个hd_geometry
结构体,hd_geometry
结构体包含磁头、扇区、柱面
等信息,其定义在include/linux/hdreg.h
头文件中。