linux驱动学习--第二十五天:第十三章:Linux 块设备驱动(二):gendisk(通用磁盘) 结构体

gendisk 结构体

 

在 Linux 内核中,使用gendisk(通用磁盘)结构体来表示1 个独立的磁盘设备(或分区)。

gendisk 结构体
1 struct gendisk
2 {
3 int major; /* 主设备号 */
4 int first_minor; /*第1 个次设备号*/
5 int minors; /* 最大的次设备数,如果不能分区,则为1*/
6 char disk_name[32]; /* 设备名称 */
7 struct hd_struct **part; /* 磁盘上的分区信息 */
8 struct block_device_operations *fops; /*块设备操作结构体*/
9 struct request_queue *queue; /*请求队列*/
10 void *private_data; /*私有数据*/
11 sector_t capacity; /*扇区数,512 字节为1 个扇区*/
12
13 int flags;
14 char devfs_name[64];
15 int number;
16 struct device *driverfs_dev;
17 struct kobject kobj;
18
19 struct timer_rand_state *random;
20 int policy;
21
22 atomic_t sync_io; /* RAID */
23 unsigned long stamp;
24 int in_flight;
25 #ifdef CONFIG_SMP
26 struct disk_stats *dkstats;
27 #else
28 struct disk_stats dkstats;
29 #endif
30 };
major、first_minor 和minors 共同表征了磁盘的主、次设备号,同一个磁盘的各个分区共享一个主设备
号,而次设备号则不同。fops 为block_device_operations,即上节描述的块设备操作集合。queue 是内核
用来管理这个设备的I/O 请求队列的指针。capacity 表明设备的容量,以512 个字节为单位。private_data
可用于指向磁盘的任何私有数据,用法与字符设备驱动file 结构体的private_data 类似。
Linux 内核提供了一组函数来操作gendisk,如下所示。

 

1.分配gendisk
gendisk 结构体是一个动态分配的结构体,它需要特别的内核操作来初始化,驱动不能自己分配这个结
构体,而应该使用下列函数来分配gendisk:
struct gendisk *alloc_disk(int minors);
minors 参数是这个磁盘使用的次设备号的数量,一般也就是磁盘分区的数量,此后minors 不能被修改。

 

2.注册gendisk
gendisk 结构体被分配之后,系统还不能使用这个磁盘,需要调用如下函数来注册这个磁盘设备。
void add_disk(struct gendisk *gd);

特别要注意的是对 add_disk()的调用必须发生在驱动程序的初始化工作完成并能响应磁盘的请求之后。

 

3.释放gendisk
当不再需要一个磁盘时,应当使用如下函数释放gendisk。
void del_gendisk(struct gendisk *gd);

 

4.gendisk 引用计数
gendisk 中包含一个kobject 成员,因此,它是一个可被引用计数的结构体。通过get_disk()和put_disk()
函数可用来操作引用计数,这个工作一般不需要驱动亲自做。通常对del_gendisk()的调用会去掉gendisk
的最终引用计数,但是这一点并不是必须的。因此,在del_gendisk()被调用后,这个结构体可能继续存在。

 

5.设置gendisk 容量
void set_capacity(struct gendisk *disk, sector_t size);
块设备中最小的可寻址单元是扇区,扇区大小一般是2 的整数倍,最常见的大小是512 字节。扇区的
大小是设备的物理属性,扇区是所有块设备的基本单元,块设备无法对比它还小的单元进行寻址和操作,
不过许多块设备能够一次就传输多个扇区。虽然大多数块设备的扇区大小都是512 字节,不过其他大小的
扇区也很常见,比如,很多CD-ROM 盘的扇区都是2KB。
不管物理设备的真实扇区大小是多少,内核与块设备驱动交互的扇区都以512 字节为单位。因此,
set_capacity()函数也以512 字节为单位。

 

 

你可能感兴趣的:(linux驱动开发)