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

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

[cpp] view plaincopy

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

[cpp] view plaincopy

  1. <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结构永远只有一个。

[cpp] view plaincopy

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

3,struct hd_struct结构体

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

时间: 2024-12-09 12:05:35

[linux驱动]linux块设备学习笔记(二)的相关文章

linux驱动开发之块设备学习笔记

学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.html 1.块设备 块设备将数据按照固定块大小的块中,每个块的大小通常在512字节到32768字节之间,磁盘.SD卡都是常见的块设备. 2.字符设备和块设备的区别: 字符设备 块设备 ---------------------------------------------- 按字节访问 按块进行访问 只能按照数据流访问 随机访问 直接访问设备 挂在文件系统的方式访问

[linux驱动]linux块设备学习笔记(四)——请求处理

一,请求处理 块设备的处理函数里没有read write等函数,所有对块设备的请求如读取 写入等都是通过request函数处理的.request函数的原型是void request(request_queue_t *queue);request函数的处理是异步的.每一个设备都有一个请求队列,当请求队列生成的时候,request函数就与该请求队列绑定在一起了,request函数总是与一个自旋锁一起使用,当request函数拥有自旋锁的时候,该锁防止内核为设备安排其它请求.构request代表了挂起

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

1,区别块设备和字符设备:块设备是系统中能随机访问固定大小的数据片的硬件.,扇区是所有块设备物理上的最小可寻址单位,通常大小为512Byte,块是文件系统的最小寻址单位,大小是扇区的整数倍,同时不能超过一个页的大小~ 操作块设备的时候需要在内存中有一个对应的缓冲区,用struct buffer_head结构体表示. [cpp] view plaincopy struct buffer_head { unsigned long b_state;        /* buffer state bit

Linux 驱动之块设备 (一)

1.引言 块设备的驱动比字符设备的难,这是因为块设备的驱动和内核的联系进一步增大,但是同时块设备的访问的几个基本结构和字符还是有相似之处的. 有一句话必须记住:对于存储设备(硬盘~~带有机械的操作)而言,调整读写的顺序作用巨大,因为读写连续的扇区比分离的扇区快. 但是同时:SD卡和U盘这类设备没有机械上的限制,所以像上面说的进行连续扇区的调整显得就没有必要了 2.块设备概念 块设备(blockdevice) --- 是一种具有一定结构的随机存取设备,对这种设备的读写是按块进行的,他使用缓冲区来存

linux学习笔记二:linux文件系统

各大linux的版本都遵循着FHS(Filesystem Hierarchy Standard)文件系统目录标准,是一个树形结构的组织文件.在此简要记录各目录. linux下所有文件都处在/文件下. 树形结构图: /boot:  系统启动相关的文件 主要文件 1.vmliunx:内核    2.initramfs:磁盘映像文件   3.grub(bootloader) /dev:设备文件 块设备:随机访问设备. 字符设备:线性设备,顺序访问.按字符为单位.键盘.鼠标. 设备号:主设备号(majo

linux学习笔记二:硬盘信息查询

在linux管理中,硬盘管理是很重要的一部分.包括阵列,分区,逻辑卷等操作,在对硬盘操作前,需要充分的了解硬盘的信息.常用的硬盘查询有以下几种: 1.df  查看文件系统空间使用情况: linux-lszd-db:~ # dfFilesystem     1K-blocks     Used Available Use% Mounted on/dev/sda6      809262496 37615092 770825244   5% /udev             8076412    

Linux学习笔记二:Linux的文件处理命令

1.文件处理命令:ls 作用:显示目录文件 语法:ls [选项] [文件或目录] [选项]:-a 显示所有文件,包括隐藏文件   -l 显示详细信息 -d 查看目录属性 [文件或目录]:当省略时默认将当前路径作为参数 实例: · ls 显示当前文件夹下所有文件(不包括隐藏文件)的信息 · ls -l 显示当前文件夹下所有文件(不包括隐藏文件)的详细信息 · ls -ld  显示当前文件夹的详细信息 技巧:要查看文件夹的信息,必须加-d参数:要查看详细参数,必须加-l参数. 2.文件的属性 使用”

Linux System Programming 学习笔记(二) 文件I/O

1.每个Linux进程都有一个最大打开文件数,默认情况下,最大值是1024 文件描述符不仅可以引用普通文件,也可以引用套接字socket,目录,管道(everything is a file) 默认情况下,子进程会获得其父进程文件表的完整拷贝 2.打开文件 open系统调用必须包含 O_RDONLY,O_WRONLY,O_RDWR 三种存取模式之一 注意 O_NONBLOCK模式 int fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 0644

Linux学习笔记(二)——主机规划及磁盘分区

最近进行系统性的学习Linux系统,读了鸟哥的Linux私房菜,摘录学习笔记如下: 1)  在Linux系统中,每个装置都被当成一个档案来对待,每个装置都会有装置文件名. 2)  磁盘的装置文件名主要分为IDE接口的/dev/hd[a-d]及 SATA/SCSI/USB界面的/dev/sd[a-p]两种: 3)  整颗磁盘的第一个扇区非常重要,因为他记录了整颗磁盘的重要信息!磁盘的第一个扇区主要记录了两个重要的信息,分别是: 主要启动记录区(Master Boot Record, MBR):可以