[linux驱动]linux块设备学习笔记(二)

1,gendisk结构体
在linux内核中,使用gendisk结构体来表示一个实际的磁盘设备的抽象,结构体定义如下所示:

struct gendisk {
int major; //主设备号
int first_minor;//次设备号
int minors;        //最大次设备数,如果不能分区则为1             
char disk_name[DISK_NAME_LEN]; //设备名称,显示在/proc/partitions和sysfs中
struct disk_part_tbl *part_tbl;//表示容纳分区表
struct hd_struct part0;//表示一个分区
struct block_device_operations *fops;//指向块设备操作集合
struct request_queue *queue;//指向I/O请求队列
void *private_data;//可以指向磁盘任何私有数据
int flags;//一些标志
struct device *driverfs_dev;  // FIXME: remove
struct kobject *slave_dir;
sector_t  capacity  //以512字节表示一个扇区的时候,该驱动器包含的扇区数目
struct timer_rand_state *random;
atomic_t sync_io;
struct work_struct async_notify;
#ifdef  CONFIG_BLK_DEV_INTEGRITY
struct blk_integrity *integrity;
#endif
int node_id;

};


<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">linux内核中提供了一组函数来操作gendisk,如下</span>

1.分配gendisk
使用下面函数来分配gendisk
struct gendisk *alloc_disk(int minors);
minors参数是这个磁盘使用的次设备号的数量
2.增加gendisk
gendisk结构体被分配后,系统还不能使用这个磁盘,需要用如下函数来注册设备,使用这个函数之前要保证驱动程序初始化工作完成并响应磁盘请求之后
void add_disk(struct gendisk *disk);
3.释放gendisk
当不需要一个磁盘时,用如下函数来释放gendisk;
void del_gendisk(struct gendisk *gp);
4.gendisk的引用计算
通过下面两个函数可以用来操作gendisk的引用计算和释放这个引用
struct kobject *get_disk(struct gendisk *disk);
void put_disk(struct gendisk *disk);

如果一个磁盘分成了几个分区,那么其分区表保存在hd_struct结构的数组中,该数组的地址存在gendisk的part字段中

2,block_device结构体
每个块设备都是由struct block_device结构体表示的,struct block_device来表示一个逻辑块设备对象。

描述块设备的数据结构有两个,一个是struct block_device,用来描述一个块设备或者块设备的一个分区,是逻辑抽象,侧重和文件系统交互;另一个是struct gendisk,用来描述实际块设备的特性,侧重和块设备驱动程序的交互。对于一个包含多个分区的块设备,struct block_device结构有多个,而struct gendisk结构永远只有一个。

struct block_device {  
    dev_t          bd_dev;  /该设备(分区)的设备号/  
    struct inode *    bd_inode / 指向该设备文件的inode/
    struct super_block *    bd_super;  
    int        bd_openers;  /一个引用计数,记录了该块设备打开的次数,或者说有多少个进程打开了该设备
    struct mutex        bd_mutex;  /* open/close mutex */  
    struct list_head    bd_inodes;  
    void *          bd_holder;  
    int        bd_holders;  
    struct block_device *  bd_contains;  /如果该block_device描述的是一个分区,则该变量指向描述主块设备的block_device,反之,其指向本身/
    unsigned        bd_block_size;  
    struct hd_struct *  bd_part;  /如果该block_device描述的是一个分区,则该变量指向分区的信息
    /* number of times partitions within this device have been opened. */  
    unsigned        bd_part_count;  
    int        bd_invalidated;  
    struct gendisk *    bd_disk;  /指向描述整个设备的gendisk结构
    struct list_head    bd_list;  
    unsigned long      bd_private;  
    /* The counter of freeze processes */  
    int        bd_fsfreeze_count;  
    /* Mutex for freeze */  
    struct mutex        bd_fsfreeze_mutex;  
}; 


3,struct hd_struct结构体

该结构体用来表示一个分区信息,该结构体中的start_sect nr_sects和partno分别表示当前分区的起始扇区,分区的大小即扇区的数量,以及分区的编号

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux设备驱动程序是用于控制和管理硬件设备的软件模块。学习Linux设备驱动程序可以帮助开发人员理解和掌握Linux内核的工作原理,以及如何编写和调试设备驱动程序。 以下是一些学习Linux设备驱动程序的笔记和建议: 1. 理解Linux设备模型:Linux设备模型是一种用于管理设备的框架,它提供了一种统一的方式来表示和操作设备。学习Linux设备模型可以帮助你理解设备的注册、初始化和销毁过程。 2. 学习字符设备驱动程序:字符设备是一种以字节为单位进行读写的设备,如串口、终端等。学习字符设备驱动程序可以帮助你了解字符设备的打开、关闭、读写等操作,并学习如何实现设备文件的注册和操作。 3. 学习块设备驱动程序:块设备是一种以块为单位进行读写的设备,如硬盘、闪存等。学习块设备驱动程序可以帮助你了解块设备的分区、缓存、IO调度等操作,并学习如何实现块设备的注册和操作。 4. 学习中断处理:中断是设备向处理器发送信号的一种机制,用于通知处理器设备的状态变化。学习中断处理可以帮助你了解中断的注册、处理和释放过程,并学习如何编写中断处理程序。 5. 学习设备驱动程序的调试技巧:设备驱动程序的调试是一个重要的技能,可以帮助你快速定位和解决问题。学习设备驱动程序的调试技巧可以帮助你理解和使用调试工具,如 printk、kprobe等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值