1:普通文件的数据块里面保存的是文件数据,而目录文件的数据块里面保存的是目录里面一项一项的文件信息,目录文件的数据不占用数据块,放在inode表中的inode项中

 

2:被链接模块应按调用顺序先后指定,将静态库放在链接命令行的最后,本来属于ld的参数若用gcc引入则需要在参数前添加 -Wl,另2个同理

 

3:在启用MMU的情况下,程序指令中的地址是VA,而访问内存用的是PA,MMU硬件单元的作用就是将VA转换为PA;不启用时都是PA

  

4:i_zone[9]的理解:假设文件系统基本块大小为1k,若文件大小为2k则只需2个数据块即可放下,假设放在块id为100和101上,则i_zone[0]==100,i_zone[1]==101,i_zone[2-8]==0;假设文件是8k,放在数据块100到107上,则i_zone[0-6]==100-106;而i_zone[7]却不是简单地等于107,这里用了扩展的方式;假设块67只用于扩展记录,则将块67的1k空间划分为512个u16的空间,每一个u16空间内的数用于指定一个扩展后的数据块id值,因此块67可以扩展出512个数据块,每一个u16空间内的值都对应一个真实数据块id值;因此i_zone[7]的取值范围是[0, 512](表示在扩展数据区中用了几个数据块),因此i_zone[7]==1,且块67的前2字节值是107;同理若文件大小为9k,则i_zone[7]==(9 - 7),且块67的前2字节值是107,再2字节值是108;这就是ext2fs的存储方式

 

5:一个具体文件包含2种数据,1种是文件的内容数据保存在数据块中,由数据块位图索引;一种是文件的信息数据保存在inode块中,由inode位图索引;一个N字节大小的数据块位图可以索引8N个大小为N字节的数据块;一个N字节大小的inode块位图可以索引8N个大小为sizeof(struct inode)字节的inode结构体,inode块会占用多个物理块;m_inode是inode在ram/mem中的组织形式,d_inode是inode在rom/disk中的组织形式,从rom中读取d_inode的数据,并构建ram中的m_inode

 

6:物理硬盘中的文件在linux内核中被抽象为 FILE 结构体,文件的各项参数将与 FILE 结构体中的成员一一对应,即内核代码用一个 FILE 结构体变量来表示硬盘中一个文件的全部信息;一切皆文件,同时文件又只是代码中一个结构体类型的抽象;因此一切东西抽象后都只是代码中的一个结构体类型,对应存放在RAM中一个此类型的结构变量而已,这也是面向对象编程的核心方法论

 

7:“索引节点位图”的工作方式与“块位图”类似,区别在于每个位代表“索引节点表”中的一个索引节点而不是一个块。由于索引节点编号从1而不是0开始,因此第一个块组的索引节点位图中的第一个位表示索引节点编号1。每个组有一个inode位图,它的位置可以通过读取相关组描述符中的“bg_inode_bitmap”来确定。当创建索引节点表时,所有保留的索引节点都被标记为已使用。

 

8:“块位图”通常位于每个块组的第一个块,如果存在超级块备份,则位于第二个块。它的正式位置可以通过阅读“bg_block_bitmap”在其关联的组描述符中。每个位表示该块组中一个块的当前状态,其中1表示“已用”,0表示“空闲/可用”。该块组的第一个数据块由字节0的第0位表示,第二个块由字节0的第1位表示,第8个块由字节0的第7位(最高有效位)表示,而第9个块由字节1的第0位(最低有效位)表示。

 

9:s_first_data_block:标识第一个数据块的32位值,即包含超级块结构的块id。注意,对于块大小大于1KB的文件系统,该值始终为0,对于块大小为1KB的文件系统,该值始终为1。超级块总是从磁盘的第1024字节开始,它通常恰好是第三扇区(一个扇区大小为512B)的第一个字节。

 

10:bg_block_bitmap:所代表的块组的“块位图”的第一个块的32位块id(一般块位图只占用一块),块id是文件系统中索引块的唯一标识,假设硬盘大小1M,块大小1K,因此这个硬盘的块id值为[0, 1023],每个值都唯一对应一个物理块。

 

11:一块硬盘格式化后最前面的1kB是boot区域,紧接着是超级块SB(用来描述整个文件系统的信息),块组描述符表BGDT;剩下的空间分为若干个块组,块组大小不必相同,每一个块组从低地址到高地址依次为块位图,inode位图,inode表(会占用多个块,inode块中的1bit对应这里的一项结构体),数据块;对于文件系统中的每个块组,都会创建这样一个group_desc。group_desc中的每项表示文件系统中的一个块组,仅与它所描述的块组相关,所有块组对应的group_desc集合起来就是BGDT。块组描述符表包含所有块组的所有信息。新版本中不是每个块组中都有SB和BGDT的备份;多个块组又构成一个分区,一个硬盘上可以有多个分区,只有MBR(主引导)分区中最开始的1K为boot区域。

 

12:exft2文件系统使用块作为存储的基本单位,使用索引节点作为跟踪文件和系统对象的手段,使用块组将磁盘逻辑地分割为更易于管理的部分,使用目录提供文件的分层组织,使用块和索引节点位图跟踪已分配的块和索引节点,使用超级块定义文件系统的参数及其总体状态。硬盘的格式化程序会确定硬盘上文件系统一切参数的值,比如块的大小和总数,分区数据,超级块SB和BGDT中各成员的值,数据块组个数等。

 

13:块被聚类到块组中,以减少碎片,并在读取大量连续数据时最大限度地减少寻头次数。关于每个块组的信息保存在一个描述符表中,该描述符表存储在紧挨着超级块的块中。每个组开始附近的两个块保留用于块使用位图和索引节点使用位图,显示哪些块和索引节点正在使用。由于每个位图被限制为单个块,这意味着块组的最大大小是块大小的8倍。每个块组中位图后面的块被指定为该块组的索引表,其余的是数据块。块分配算法试图将数据块分配到与包含它们的inode相同的块组中。

 

14:目录是一个文件系统对象,它像文件一样有一个inode。它是一种特殊格式的文件,其中包含将每个名称与索引节点号相关联的记录。后来的文件系统版本还对对象的类型(文件、目录、符号链接、设备、fifo、套接字)进行编码,以避免需要检查inode本身以获取这些信息。inode分配代码应该尝试分配与第一次创建inode的目录在同一块组中的inode。

 

15:inode(索引节点)是ext2文件系统中的一个基本概念。文件系统中的每个对象都由一个索引节点表示。一个文件只需要一个inode节点来存储文件的元信息就够了,所以文件和inode节点是一一对应的 ; 文件的数据都存放在数据块中; 通过超级块检索数据块位图和inode块位图,再通过数据块位图检索数据块,inode块位图检索inode节点块; inode结构包含指向文件系统块的指针,其中包含对象中保存的数据和关于对象的所有元数据,除了对象的名称。对象的元数据包括权限、所有者、组、标志、大小、已用块数、访问时间、修改时间、修改时间、删除时间、链接数、分片数、版本(适用于NFS)和扩展属性(EAs)和/或访问控制列表(acl)。

 

16:超级块SB包含有关文件系统配置的所有信息。超级块中的信息包含诸如文件系统中inode和块的总数以及空闲的数目、每个块组中有多少inode和块等字段,以及当挂载文件系统时(如果它被完全卸载了),它是什么时候被修改的,它是哪个版本操作系统创建的文件系统等信息。超级块的 主副本存储在设备开始处1024字节的偏移位置,这对于挂载文件系统至关重要。由于超级块非常重要,因此超级块的备份副本存储在整个文件系统的块组中。只要您知道一些基本信息,磁盘上的布局是非常可预测的; 块大小,每个组的块,每个组的索引节点。这些信息都位于超级块结构中,或者可以从超级块结构中计算出来。然而,除非使用受控参数制作映像,否则永远不应该假定磁盘上各种结构的位置(超级块除外)。总是先加载超级块。注意,在块大小为1KiB的文件系统中,块0不是块组0的一部分。这样做的原因是块组0总是从包含超级块的块开始。因此,在1KiB块系统上,块组0从块1开始,但在更大的块大小上,它从块0开始。且不同块组的块序号是递增的,不是从0计。

 

17:符号链接(也称为符号链接或软链接)是一种特殊类型的文件,它以绝对或相对路径的形式包含对另一个文件或目录的引用,并且影响路径名解析。对于大多数操作来说,符号链接的操作是透明的:读或写由符号链接命名的文件的程序将表现得像直接在目标文件上操作一样。然而,需要专门处理符号链接的程序(例如,备份实用程序)可以直接识别和操作它们。符号链接仅仅包含一个文本字符串,操作系统将其解释为另一个文件或目录的路径。它本身就是一个文件,可以独立于它的目标而存在。符号链接不影响索引节点链接数。如果符号链接被删除,它的目标不受影响。如果目标被移动、重命名或删除,任何曾经指向它的符号链接将继续存在,但现在指向一个不存在的文件。指向不存在文件的符号链接有时被调用“孤儿”或“悬空”。符号链接也是带有inode的文件系统对象。对于长度小于60字节的所有符号链接,数据存储在索引节点本身中;它使用通常用于存储指向数据块的指针的字段。这是一个有价值的优化,因为我们避免了为符号链接分配一个完整的块,而且大多数符号链接的长度都小于60个字符。符号链接还可以指向其他分区和文件系统的文件或目录。

 

18:Ext2文件系统从位于卷开始处的字节偏移量1024处的超级块开始。对于1KiB块格式化的卷,这是块1,对于更大的块大小,这是块0。请注意,无论块大小如何,超级块的大小都是恒定的。在超级块之后的下一个块是块组描述符表;其中概述了如何将卷划分为块组,以及在哪里可以找到每个块组的inode位图、块位图和inode表。在Ext2的revision 0中,每个块组由一个拷贝超级块、一个块组描述符表的副本、一个块位图、一个索引节点位图、一个索引节点表和数据块组成。随着版本1的引入和Ext2中的稀疏超级块特性的引入,只有特定的块组包含超级块和块组描述符表的副本。所有块组仍然包含块位图、索引节点位图、索引节点表和数据块。超级块的影子副本可以位于0、1和3、5、7的幂块组中。块位图和索引节点位图每个块组限制为1个块,因此每个块组的总块是有限的。

 

 

19:块组描述符表是一个块组描述符数组,用于定义所有块组的参数。它提供了索引节点位图和索引节点表的位置、块位图、空闲块和索引节点的数量,以及其他一些有用的信息。块组描述符表从超级块之后的第一个块开始。这将是1KiB块文件系统上的第三个块,或者是2KiB或更大块文件系统上的第二个块。块组描述符表的影子副本也存储在超级块的每个副本中。根据定义的块组的数量,块组描述符表可能占用多个块。

 

    

 

20:inode表 用于跟踪每个目录、常规文件、符号链接或特殊文件;它们的位置、大小、类型和访问权限都存储在索引节点中。inode本身没有存储文件名,名称仅包含在目录文件中。每个块组有一个inode表,可以通过读取其关联的组描述符中的bg_inode_table来定位它。每个表有s_inodes_per_group索引节点。每个inode包含系统上单个物理文件的信息。文件可以是目录、套接字、缓冲区、字符或块设备、符号链接或常规文件。因此,可以将inode视为与实体相关的信息块,描述实体在磁盘上的位置、大小和所有者。inode表的前几个条目是保留的。在版本0中保留了11个条目,之后的版本在超级块结构的s_first_ino中指定了保留的索引节点条目的数量。 

i_block :15个32位块号,指向包含该索引节点数据的数据块。数组前12个值是直接的块id值。数组的第13项是第一个间接块的块号;它是一个包含包含数据的块ID数组的块。因此,文件的第13个块将是间接块中包含的第一个块ID。当块大小为1KiB时,块13到268的文件数据包含在这个间接块中。使用值0表示尚未为该文件分配哪些块。

i_blocks :32位值,表示为包含该索引节点的数据而保留的512字节块的总数,而不管这些块是否被使用。这些保留块的块号包含在i_block数组中。因为这个值代表512字节的块,而不是文件系统块,所以这个值不应该直接用作i_block数组的索引。相反,i_block数组的最大索引应该由 i_blocks/(2<<s_log_block_size)计算。

i_file_acl : 用于指定包含扩展属性的块号,配合i_block[13,15]的间接数据块索引, i_file_acl即上面的块67,即i_file_acl==67

i_dir_acl :在revision 0中,这个32位的值总是0。在修订版1中,对于普通文件,这个32位值表示文件大小的高32位。如果文件不是常规文件(即块设备、目录等),Linux将此值设置为0。理论上,可以将此值设置为指向包含目录或特殊文件的扩展属性的块。

 

21: 定位一个inode 

 

22:目录用于对文件进行分层组织。每个目录可以包含其他目录、普通文件和特殊文件。目录作为数据块存储,并由索引节点引用。它们可以通过文件类型来识别EXT2_S_IFDIR存储在inode结构的i_mode字段中。Inode表的第二个条目包含指向根目录数据的Inode; 由EXT2_ROOT_INO常量定义。下图为描述路径的结构体:

 

假设 ~ 路径下有如下成员,则

 

 

23:索引目录条目用于快速查找与文件名散列相关联的inode号。这些条目位于目录数据块的假链接目录条目之后,或者位于称为“索引目录根”的部分之后。第一个索引目录条目,而不是包含实际的哈希值和块号,它包含可容纳在块中的索引目录条目的最大数量以及存储在块中的索引目录条目的实际数量。

  

24:扇区(sector)是硬盘控制器操作的最小基本物理单元,硬盘中的扇区空间小且个数多,寻址比较繁琐,因此文件系统将多个物理扇区组合在一起形成一个更大的逻辑单元,并对这个单元整体进行读写操作;而这个单元在win下的FAT, NTFS 等文件系统中叫做簇(cluster),而在linux下的ext2等文件系统中叫做块(block)。

 

25:检索硬盘中的数据,方式1是调用硬盘驱动程序直接读取数据进行检索,是一种面向mcu的开发方式;方式2是提前调用硬盘驱动程序将待检索区的数据提前读入到RAM中,之后在RAM中检索数据,是一种面向pc的开发方式。

  若数据输出端在clk的下降沿输出数据,那么数据接收/采样端就必须在clk的上升沿进行,反之亦然;数据的输出对应时序图中数据线上的X,数据的输入/采样对应时序图中数据线上的=  

  访问mcu内RAM中的存储地址时变量名前须有*;而访问mcu外其他存储体中的地址时变量名前不需要*;char *a = 0x20000000 和 int b = 0x30000000 会分别访问mcu内RAM和mcu外e2prom的0x20000000和0x30000000地址处

  if(a = b( )){ } 等同于 a = b( ); if (a) { }

 

posted on 2023-10-07 11:14  lance9527  阅读(46)  评论(0编辑  收藏  举报