首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

将超级块读入 C 结构

首先,我们需要了解什么是超级块。超级块是一个文件系统的基本结构,它包含了文件系统的元数据和一些关键信息,例如文件系统的大小、文件系统的类型、文件系统的创建时间等等。

在 C 语言中,我们可以使用结构体来表示超级块。以下是一个示例结构体,用于表示超级块:

代码语言:c
复制
struct super_block {
    unsigned long s_blocksize;
    unsigned long s_blocks_count;
    unsigned long s_free_blocks_count;
    unsigned long s_r_blocks_count;
    unsigned long s_free_inodes_count;
    unsigned long s_first_data_block;
    unsigned long s_log_block_size;
    unsigned long s_log_frag_size;
    unsigned long s_frags_per_group;
    unsigned long s_blocks_per_group;
    unsigned long s_inodes_per_group;
    unsigned long s_mtime;
    unsigned long s_wtime;
    unsigned short s_links_count;
    unsigned short s_errors;
    unsigned short s_flags;
    unsigned short s_raid_stride;
    unsigned short s_mnt_count;
    unsigned short s_max_mnt_count;
    unsigned short s_magic;
    unsigned short s_state;
    unsigned short s_errors_behavior;
    unsigned short s_minor_rev_level;
    unsigned int s_lastcheck;
    unsigned int s_checkinterval;
    unsigned int s_creator_os;
    unsigned int s_rev_level;
    unsigned short s_def_resuid;
    unsigned short s_def_resgid;
    unsigned int s_first_ino;
    unsigned short s_inode_size;
    unsigned short s_block_group_nr;
    unsigned int s_feature_compat;
    unsigned int s_feature_incompat;
    unsigned int s_feature_ro_compat;
    unsigned char s_uuid[16];
    char s_volume_name[16];
    char s_last_mounted[64];
    unsigned int s_algorithm_usage_bitmap;
    unsigned char s_prealloc_blocks;
    unsigned char s_prealloc_dir_blocks;
    unsigned short s_reserved_gdt_blocks;
    unsigned char s_journal_uuid[16];
    unsigned int s_journal_inum;
    unsigned int s_journal_dev;
    unsigned int s_last_orphan;
    unsigned int s_hash_seed[4];
    unsigned char s_def_hash_version;
    unsigned char s_reserved_char_pad;
    unsigned short s_reserved_word_pad;
    unsigned int s_default_mount_opts;
    unsigned int s_first_meta_bg;
    unsigned int s_mkfs_time;
    unsigned char s_jnl_blocks[17];
    unsigned int s_blocks_count_hi;
    unsigned int s_r_blocks_count_hi;
    unsigned int s_free_blocks_count_hi;
    unsigned int s_min_extra_isize;
    unsigned int s_want_extra_isize;
    unsigned int s_flags_hi;
    unsigned short s_raid_stride_width;
    unsigned short s_mmp_update_interval;
    unsigned int s_mmp_block;
    unsigned int s_raid_stripe_width;
    unsigned char s_log_groups_per_flex;
    unsigned char s_checksum_type;
    unsigned char s_encryption_level;
    unsigned char s_reserved_pad;
    unsigned int s_kbytes_written;
    unsigned int s_snapshot_inum;
    unsigned int s_snapshot_id;
    unsigned int s_snapshot_r_blocks_count;
    unsigned int s_snapshot_list;
    unsigned int s_error_count;
    unsigned int s_first_error_time;
    unsigned int s_first_error_ino;
    unsigned int s_first_error_block;
    unsigned char s_first_error_func[32];
    unsigned int s_first_error_line;
    unsigned int s_last_error_time;
    unsigned int s_last_error_ino;
    unsigned int s_last_error_line;
    unsigned int s_last_error_block;
    unsigned char s_last_error_func[32];
    unsigned int s_mount_opts;
    unsigned int s_usr_quota_inum;
    unsigned int s_grp_quota_inum;
    unsigned int s_overhead_blocks;
    unsigned int s_backup_bgs[2];
    unsigned char s_encrypt_algos[4];
    unsigned char s_encrypt_pw_salt[16];
    unsigned int s_lpf_ino;
    unsigned int s_prj_quota_inum;
    unsigned char s_checksum_seed[32];
    unsigned int s_reserved[165];
};

将超级块读入 C 结构体中,可以使用以下代码:

代码语言:c
复制
#include<stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include<string.h>
#include <errno.h>

#include "superblock.h"

int main(int argc, char *argv[]) {
    int fd;
    struct super_block sb;

    if (argc != 2) {
        fprintf(stderr, "Usage: %s<device>\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    fd = open(argv[1], O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(EXIT_FAILURE);
    }

    if (read(fd, &sb, sizeof(sb)) != sizeof(sb)) {
        perror("read");
        exit(EXIT_FAILURE);
    }

    close(fd);

    // 在这里可以使用 sb 结构体中的信息

    return 0;
}

在这个示

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C 语言】文件操作 ( 结构体写出到文件中并读取结构体数据 | 结构体数组写出到文件中并读取结构体数组数据 )

文章目录 一、结构体写出到文件中并读取结构体数据 二、结构体数组写出到文件中并读取结构体数组数据 一、结构体写出到文件中并读取结构体数据 ---- 写出结构体 : 直接结构体指针指向的 , 结构体大小的内存..., 写出到文件中即可 ; // 要写入文件的结构体 struct student s1 = {"Tom", 18}; // 结构体写出到文件中 fwrite(&s1,..."D:/File/student.dat", "w"); // 打开失败直接退出 if(p == NULL) return 0; // 结构体写出到文件中..., age=%d\n", s2.name, s2.age); return 0; } 执行结果 : 写出的文件字节数为 24 , 20 字节的字符串数据 , 4 字节 int 值 ; 二、结构体数组写出到文件中并读取结构体数组数据...", 18}, {"Jerry", 20}}; // 结构体写出到文件中 fwrite(s1, 2, sizeof (struct student), p); 读取结构体数组 : 给定接收数据的结构体指针

2.5K20
  • Linux下设备缓存Bcache设置

    Bcache简介 Bcache是Linux内核设备层cache,支持多HDD使用同一SSD作为缓存盘。它让SSD作为HDD的缓存成为了可能。...Write-misses写缺失(写入的数据不在缓存中)有两种处理方式: * Write allocate方式写入位置读入缓存,然后采用write-hit(缓存命中写入)操作。...* No-write allocate方式并不将写入位置读入缓存,而是直接数据写入存储。这种方式下,只有读操作会被缓存。...update sudo apt-get install bcache-tools 操作 假设我们的HDD设备为/dev/sdb, SSD设备为/dev/sdc,我们需要用SSD加速HDD 擦除磁盘中的超级信息...看一下设备结构 1 2 3 4 5 6 7 8 # lsblk sdb 8:16 0 1000G 0 disk └─bcache0 251:0 0 1000G 0 disk

    5.1K40

    又来搞事情了,这次女友让我研究如何实现一个文件系统

    当计算机开始 boot 时,BIOS 读入并执行 MBR。 引导 MBR 做的第一件事就是确定活动分区,读入它的第一个,称为引导(boot block) 并执行。...超级 紧跟在引导后面的是 超级(Superblock),超级的大小为 4096 字节,从磁盘上的字节偏移 4096 开始。...超级包含文件系统的所有关键参数 文件系统的大小 文件系统中的数据数 指示文件系统状态的标志 分配组大小 在计算机启动或者文件系统首次使用时,超级会被读入内存。...第一种解决方案,磁盘不列入目录中,而是会把磁盘放在与文件本身相关联的小型数据结构中。目录指向这个小型数据结构。这是 UNIX 中使用的方式(小型数据结构就是 inode)。...所以我们能做的就是删除 C 的目录项,但是 inode 保留下来,并将计数设置为 1 ,如上图 c 所示。c 表示的是只有 B 有指向该文件的目录项,而该文件的前者是 C

    40410

    只会建文件的你,考虑过文件系统设计吗?来看一下

    1.png 当计算机开始引 boot 时,BIOS 读入并执行 MBR。 引导 MBR 做的第一件事就是确定活动分区,读入它的第一个,称为引导(boot block) 并执行。...通常文件系统会包含一些属性,如下 2.jpg 超级 紧跟在引导后面的是 超级(Superblock),超级 的大小为 4096 字节,从磁盘上的字节偏移 4096 开始。...超级包含文件系统的所有关键参数 文件系统的大小 文件系统中的数据数 指示文件系统状态的标志 分配组大小 在计算机启动或者文件系统首次使用时,超级会被读入内存。...第一种解决方案,磁盘不列入目录中,而是会把磁盘放在与文件本身相关联的小型数据结构中。目录指向这个小型数据结构。这是 UNIX 中使用的方式(小型数据结构就是 inode)。...所以我们能做的就是删除 C 的目录项,但是 inode 保留下来,并将计数设置为 1 ,如上图 c 所示。c 表示的是只有 B 有指向该文件的目录项,而该文件的前者是 C

    51220

    又来搞事情了,这次女友让我研究如何实现一个文件系统

    当计算机开始 boot 时,BIOS 读入并执行 MBR。 引导 MBR 做的第一件事就是确定活动分区,读入它的第一个,称为引导(boot block) 并执行。...通常文件系统会包含一些属性,如下 超级 紧跟在引导后面的是 超级(Superblock),超级的大小为 4096 字节,从磁盘上的字节偏移 4096 开始。...超级包含文件系统的所有关键参数 文件系统的大小 文件系统中的数据数 指示文件系统状态的标志 分配组大小 在计算机启动或者文件系统首次使用时,超级会被读入内存。...第一种解决方案,磁盘不列入目录中,而是会把磁盘放在与文件本身相关联的小型数据结构中。目录指向这个小型数据结构。这是 UNIX 中使用的方式(小型数据结构就是 inode)。...所以我们能做的就是删除 C 的目录项,但是 inode 保留下来,并将计数设置为 1 ,如上图 c 所示。c 表示的是只有 B 有指向该文件的目录项,而该文件的前者是 C

    30420

    又来搞事情了,这次女友让我研究如何实现一个文件系统

    当计算机开始 boot 时,BIOS 读入并执行 MBR。 引导 MBR 做的第一件事就是确定活动分区,读入它的第一个,称为引导(boot block) 并执行。...超级 紧跟在引导后面的是 超级(Superblock),超级的大小为 4096 字节,从磁盘上的字节偏移 4096 开始。...超级包含文件系统的所有关键参数 文件系统的大小 文件系统中的数据数 指示文件系统状态的标志 分配组大小 在计算机启动或者文件系统首次使用时,超级会被读入内存。...第一种解决方案,磁盘不列入目录中,而是会把磁盘放在与文件本身相关联的小型数据结构中。目录指向这个小型数据结构。这是 UNIX 中使用的方式(小型数据结构就是 inode)。...所以我们能做的就是删除 C 的目录项,但是 inode 保留下来,并将计数设置为 1 ,如上图 c 所示。c 表示的是只有 B 有指向该文件的目录项,而该文件的前者是 C

    48210

    C++】面向对象模型 ② ( C++ 类对象的内存存储方式 | C 语言内存四区回顾 | C++ 类对象内存结构 | C++ 编译器 C++ 类 转为 C 语言代码 分析 )

    一、C++ 类对象的内存存储方式 1、C 语言内存四区回顾 操作系统 C 代码 分为 4 个区 , 由上到下 : 堆区 , 栈区 , 全局区 , 代码区 ; 堆区 : 开发者负责分配释放内存 ,...二进制代码 ; 2、C++ 类对象内存结构 C++ 类对象内存结构 : C++ 类 实例对象 中的 成员变量 和 成员函数 在内存中是分开存储的 ; 成员变量 : 普通成员变量 : 在 对象 指针指向的内存中存储...静态成员函数 , 都存储在 代码段 中 ; C++ 面向对象 的底层 , 也是通过 C 语言实现的 ; 3、C++ 编译器 C++ 类 转为 C 语言代码 分析 C++ 编译器 C++ 类 的...结构体 , 然后 普通成员变量 转为 结构体中的成员 ; 普通成员方法存储 : Test 类中的成员函数 getI , 转为 C 语言后 , 方法名变为 类名_成员函数名 , 即 Test_getI...getI 函数 , 最终转为了 Test_getI(Test* pThis) 函数 , 这是一个普通的 C 语言函数 ; 参数个数 : C++ 类成员函数 转为 C 语言函数 后 , 对应的 C

    71451

    浅谈Linux内核中页缓存和缓存

    Page Cache高速缓存使用的是物理页帧,以页为单位文件内容缓存,逻辑文件(struct file)中每一个页可以划分为单位,每个映射到磁盘的盘,因此一个文件的页可以和多个Buffer Cache...页缓存中采用了struct address_space数据结构来管理。它特指一个文件内容所形成的的页缓存空间。...struct address_space不仅仅管理某个文件已经读入的页帧内容,同时也管理这些页帧到进程空间的文件映射关系(多个进程打开同一个文件下,多个进程读取不同位置的数据)。...,主要是针对超级和索引节点等磁盘数据管理操作时候才会用到。...例如sb_read和sb_getblk根据传入的盘号读入缓存中。

    3.1K30

    虚拟文件系统

    VFS 抽象了几个数据结构来组织和管理不同的文件系统,分别为:超级(super_block)、索引节点(inode)、目录结构(dentry) 和 文件结构(file),要理解 VFS 就必须先了解这些数据结构的定义和作用...超级(super block) 因为Linux支持多文件系统,所以在内核中必须通过一个数据结构来描述具体文件系统的信息和相关的操作等,VFS 定义了一个名为 超级(super_block) 的数据结构来描述具体的文件系统...,也就是说内核是通过超级来认知具体的文件系统的,一个具体的文件系统会对应一个超级结构,其定义如下(由于super_block的成员比较多,所以这里只列出部分): struct file_system_type...成功读取超级信息后,会把根目录的 dentry 结构保存到当前进程的 root 和 pwd 字段中,root 表示根目录,pwd 表示当前工作目录。...lookup() 方法需要把要打开的目录或者文件的 inode结构 从磁盘中读入到内存中(如果目录或者文件存在的话),并且把其 inode结构 保存到 dentry结构 的 d_inode 字段中。

    1.6K30

    浅谈Linux文件系统

    1 文件系统概述Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。...每个文件系统由逻辑的序列组成,一个逻辑盘空间一般划分为几个用途各不相同的部分,即引导超级、inode区以及数据区等。...引导:在文件系统的开头,通常为一个扇区,其中存放引导程序,用于读入并启动操作系统;超级:用于记录文件系统的管理信息。...特定的文件系统定义了特定的超级;inode区(索引节点):一个文件或目录占据一个索引节点。第一个索引节点是该文件系统的根节点。...mnt opt proc root run sbin srv sys tmp usr var2.1 一般模式下:2.2 多用户模式下:2.3 几个常见目录的作用/:根目录位于目录结构的最顶层

    34710

    【AlexeyAB DarkNet框架解析】三,加载数据进行训练

    前言 昨天讲了DarkNet的底层数据结构,并且网络配置文件进行了解析存放到了一个network结构体中,那么今天我们就要来看一下Darknet是如何加载数据进行训练的。...darknet/blob/master/src/data.c#L355 /* ** 开辟多个线程读入图片数据,读入数据存储至ptr.d中(主要调用load_in_thread()函数完成) ** 输入:...,之后,args.d所指的内存会变(反正也没什么用了,变就变吧), // 但out不会变,这样可以保证out与最原始的ptr指向同一存储读入图片数据的内存,因此最终将图片读到out中,...// 其一,因为ptr是一个结构体,是一个包含众多的指针变量的结构体,如data* d等(当然还有其他非指针变量如int h等), // 直接free(ptr)将会导致函数外实参无法再访问非指针变量...// 但是对于指针变量,free(ptr)无作为(这个结论也是经过测试的,也是用的gcc编译器),不会释放或者擦写掉ptr指针变量本身的值, // 当然也不会影响函数外实参,更不会牵扯到这些指针变量所指的内存

    1.1K20

    深入理解Linux文件系统之ext2路径名查找

    表位于 5-6 (+4) 79 个可用 ,5 个可用inode,2 个目录 可用数: 21-99 可用inode数: 12-16 这实际是是读取文件系统的超级组描述符信息。...) Inode size: 128 inode大小为128字节 组的信息(这里只有一个组) 1 - 99号 超级块块编号为 1 组描述符编号为 2 ...大小 保存磁盘的超级 (dumpe2fs的部分信息从这里获得) 2 00000800 开始的1k大小 保存组描述符 (dumpe2fs的部分信息从这里获得) 3...Inode表 剩下的为数据 磁盘中的文件系统对象结构在内核如下文件定义: fs/ext2/ext2.h 磁盘超级: struct ext2_super_block {.../ }; 大家可以对照磁盘镜像文件和磁盘数据结构定义来解析出文件系统的超级组描述符信息

    1.3K30

    深入理解Linux文件系统之文件系统挂载(上)

    如nfs文件系统 结构体定义源码路径:include/linux/fs.h +2226 2.2 super_block 超级,用于描述设备上的一个文件系统总体信息(如文件大小,最大文件大小,文件系统魔数等...结构体定义源码路径:include/linux/fs.h +1414 2.3 mount 挂载描述符,用于建立超级和挂载点等之间的联系,描述文件系统的一次挂载,一个设备上的文件系统可以被挂载多次,每次挂载内存中有一个...结构体定义源码路径:include/linux/fs.h +610 2.5 dentry 目录项对象,用于描述文件的层次结构,从而构建文件系统的目录树,文件系统目录当作文件,目录的数据由目录项组成,而每个目录项存储一个目录或文件的名称和索引节点号等内容...sb->s_fs_info = sbi; //vfs的超级 的s_fs_info指向内存的ext2 超级信息结构...sbi->s_es = es; // 内存的ext2 超级信息结构的 s_es指向真正的ext2磁盘超级信息结构

    1.8K10

    InnoDB引擎的底层实现

    1、InnoDB引擎采用B+Tree结构来作为索引结构 B-Tree(平衡多路查找树):为磁盘等外存储设备设计的一种平衡查找树 系统从磁盘读取数据到内存时是以磁盘位基本单位的,位于同一磁盘中的数据会被一次性读取出来...,读入内存。...【磁盘I/O操作第一次】 b.比较关键字29在区间(17,35),找到磁盘1的指针P2; c.根据P2指针找到磁盘3,读入内存。...【磁盘I/O操作第二次】 d.比较关键字29在区间(26,30),找到磁盘3的指针P2; e.根据P2指针找到磁盘8,读入内存。...MySQL的InnoDB存储引擎在设计时是根节点常驻内存的,因此力求达到树的深度不超过3,也就是I/O不需要超过三次; 分析上面的结果,发现需要三次磁盘I/O操作,和三次内存查找操作。

    1.2K40

    Linux 虚拟文件系统

    CD-ROM等 网络文件系统,它们存储在网络中的其他主机上,通过网络进行访问,例如 NFS 特殊文件系统,内存的映射、例如/proc 案例如以下截图,Linux上的进程通过Sytem Calls(系统调用)数据经过...有四个主要对象类型: Superblock 表示特定加载的文件系统 Inode 表示特定的文件 Dentry 表示一个目录项,路径的一个组成部分 File 表示进程打开的一个文件 Superblock 超级...这个对象对应为文件系统超级或者文件系统控制,它存储在磁盘特定的扇区上。不是基于磁盘的文件系统临时生成超级,并保存在内存中。 Inode 索引节点对象包含了内核在操作文件或目录时需要的全部信息。...对于Unix文件系统来 说,这些信息可以从磁盘索引节点直接读入。如果一个文件系统没有索引节点,那么,不管这些相关信息在磁盘上是怎么存放的,文件系统都必须从中提取这些信息。...进程直接处理的是文件而不是超级、索引节点或目录。文件对象包含我们非常熟悉的信息(如访问模式、当前偏移等), 文件操作和我们非常熟悉的系统调用read()和write()等也很类似。

    1.6K51
    领券