和字符设备的fil_operations
一样,块设备也有操作集,为结构体block_device_operations
,此结构体定义在include/linux/blkdev.h
中,结构体内容如下:
struct block_device_operations {
int (*open) (struct block_device *, fmode_t);
void (*release) (struct gendisk *, fmode_t);
int (*rw_page)(struct block_device *, sector_t, struct page *, bool);
int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
unsigned int (*check_events) (struct gendisk *disk, unsigned int clearing);
/* ->media_changed() is DEPRECATED, use ->check_events() instead */
int (*media_changed) (struct gendisk *);
void (*unlock_native_capacity) (struct gendisk *);
int (*revalidate_disk) (struct gendisk *);
int (*getgeo)(struct block_device *, struct hd_geometry *);
/* this callback is with swap_lock and sometimes page table lock held */
void (*swap_slot_free_notify) (struct block_device *, unsigned long);
struct module *owner;
const struct pr_ops *pr_ops;
};
我们来看一下其中比较重要的几个成员函数:
open
函数用于打开指定的块设备;release
函数用于关闭(释放)指定的块设备;rw_page
函数用于读写指定的页;ioctl
函数用于块设备的I/O控制compat_ioctl
函数和ioctl
函数一样,都是用于块设备的I/O控制。区别在于在64位系统上,32位应用程序的ioctl
会调用compat_iotl
函数。在32位系统上运行的32位应用程序调用的就是ioctl
函数;getgeo
函数用于获取磁盘信息,包括磁头、柱面和扇区等信息;owner
表示此结构体属于哪个模块,一般直接设置为THIS_MODULE
。