1.字符设备与块设备IO操做的区别
1)块设备只能以块为单位接收输入返回输出,而字符设备则以byte为单位.大多数设备是字符设备,他们不需要缓冲并且不以固定块大小进行操作.
2)块设备对于IO请求有对应的缓冲区,所以他们可以选择以什么顺序进行响应.字符设备无须缓冲且被直接读写.
3)字符设备只能被顺序读写,块设备可以随机访问.
2.block_device_operations结构体
block_device_operations描述了对块设备的操作的集合
struct block_device_operations {
int (*open) (struct inode *, struct file *);/*打开*/
int (*release) (struct inode *, struct file *);/*释放*/
int (*ioctl) (struct inode *, struct file *, unsigned, unsigned long);
long (*unlocked_ioctl) (struct file *, unsigned, unsigned long);
long (*compat_ioctl) (struct file *, unsigned, unsigned long);
int (*direct_access) (struct block_device *, sector_t, unsigned long *);
int (*media_changed) (struct gendisk *);/*介质被改变?*/
int (*revalidate_disk) (struct gendisk *);/*使介质改变*/
int (*getgeo)(struct block_device *, struct hd_geometry *);/*填充驱动器信息*/
struct module *owner;/*模块拥有者,一般初始化为THIS_MODULE*/
};
关于block_device_operations的操作:
//open and release
int (* open)(struct inode*, struct file*);
int (* release)(struct inode*, struct file*);
//io contrl
//系统调用实现,块设备包含大量的标准请求,由设备层处理,所以此函数一般相当短
int (* ioctl)(struct inode*,struct file*,unsigned int,unsigned long);
//media changed
//如果改变返回非0值,否则返回0
int (*media_changed)(struct gendisk*);
//revalidate media
//用于响应一个介质的改变,给驱动一个机会做准备工作
int (* revalidate_disk)(struct gendisk*);
//get driver informaiton
//根据驱动器的几何信息填充hd_geometry,包含磁头,柱面,扇区等信息.
int (* getgeo)(struct block_device*, struct hd_geometry*);
3.gendisk结构体
使用gendisk结果提来描述一个独立的磁盘设备或分区.
//gendisk structure
struct gendisk{
/*前三个元素共同表征了一个磁盘的主,次设备号,同一个磁盘的各个分区共享一个主设备号*/
int major;/*主设备号*/
int first_minor;/*第一个次设备号*/
int minors;/*最大的次设备数,如果不能分区,则为1*/
char disk_name[32];
struct hd_struct** part;/*磁盘上的分区信息*/