kobject *holder_dir;
struct kobject *slave_dir;
struct timer_rand_state *random; //该指针指向的这个数据结构记录磁盘中断的定时;
//由内核内置的随机数发生器使用
int policy; //如果磁盘是只读的,则置为1(写操作禁止),否则为0
atomic_t sync_io;
unsigned long stamp; //统计磁盘队列使用情况的时间戳
int in_flight; //正在进行的I/O操作数
#ifdef CONFIG_SMP
struct disk_stats *dkstats;
#else
struct disk_stats dkstats; //统计每个CPU使用磁盘的情况
#endif
};
flags字段存放了关于磁盘的信息。其中最重要的标志是GENHD_FL_UP:如果设置它,那么磁盘将被初始化并可以使用。另一个相关的标志是GENHD_FL_REMOVABLE,如果是诸如软盘或光盘这样可移动的磁盘,那么就要设置该标志。
gendisk对象的fops字段指向一个表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, unsignedlong);
long (*unlocked_ioctl) (struct file *, unsigned, unsignedlong);
long (*compat_ioctl) (struct file *, unsigned, unsignedlong);
int (*direct_access) (struct block_device *, sector_t, unsignedlong *);
int (*media_changed) (struct gendisk *);
int (*revalidate_disk) (struct gendisk *); //检查块设备是否持有有效数据
int (*getgeo)(struct block_device *, struct hd_geometry *);
struct module *owner;
};
通常硬盘被划分成几个逻辑分区。每个块设备文件要么代表整个磁盘,要么代表磁盘中的某一个分区。struct hd_geometry例如,一个主设备号为3、次设备号为0的设备文件/dev/hda代表的可能是一个主EIDE磁盘;该磁盘中的前两个分区分别由设备文件/dev/hda1和/dev/hda2代表,它们的主设备号都是3,而次设备号分别为1和2。一般而言,磁盘中的分区是由连续的次设备号来区分的。
如果将一个磁盘分成了几个分区,那么其分区表保存在hd_struct结构的数组中,该数组的地址存放在gendisk对象的part字段中。通过磁盘内分区的相对索引对该数组进行索引。hd_struct描述符中的字段如下所示:
struct hd_struct {
sector_t start_sect; //磁盘中分区的起始扇区
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-48358-1.html
才是最明智者