linux驱动学习--第二十五天:第十三章:Linux 块设备驱动(二):gendisk(通用磁盘) 结构体
2013-06-30 22:57
323 查看
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 内核中,使用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驱动学习--第二十四天:第十三章:Linux 块设备驱动(一):块设备的 I/O 操作特点 和 block_device_operations 结构体
- linux驱动学习--第九天:第五章 Linux 文件系统与设备文件系统(三) 之 file 结构体 和 inode 结构体
- 如何学习linux设备驱动
- Linux驱动学习——混杂设备
- Linux内核与驱动开发学习总结:主设备号和次设备号(二)
- 面对不断升级的内核,如何学习linux设备驱动
- 嵌入式Linux驱动学习之路(十七)驱动程序分层分离概念-平台设备驱动
- linux学习笔记1:linux驱动设备概述
- LINUX字符设备驱动学习
- linux网络设备应用与驱动编程学习4——模板与实例(C)——其它方法
- Linux网络设备驱动学习笔记(-)
- Linux设备驱动模型学习之基础篇--Kobject.txt翻译
- Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)
- Linux 字符设备驱动结构(四)—— file_operations 结构体知识解析
- 一步一步学习 Linux 驱动之自动创建设备节点
- Linux驱动学习(二)——字符设备驱动程序入门 .
- [Linux驱动]字符设备驱动学习笔记(一)
- [linux驱动]linux块设备学习笔记(三)——程序设计
- linux驱动学习(九) usb设备驱动的初步认知
- linux设备驱动程序学习笔记--第一个有用的驱动