UBIS分析:重要结构体_第1页
UBIS分析:重要结构体_第2页
UBIS分析:重要结构体_第3页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、UBIFS中的重要的结构体用leeming的话来说,一个大的工程中,最最核心的往往是数据结构体的定义。所以看 代码不急着看c文件,而是主要看document和h文件,来理解设计者的思路,这样才能走对路。1. struct ubi_deviceUBI中对于一个 UBI设备的抽象是以 struct ubi_device来定义,其中包括了该 UBI设备 的各种信息。struct ubi_device struct cdev cdev;struct device dev;int ubi_num;/UBI设备的标号,在 ubiattach用户程序时以-d选项来输入char ubi_ namesizeof

2、(UBI_NAME_STR)+5;/ubi设备的名称int vol_count;在该UBI设备中有多少个 volumestruct ubi_volume *volumesUBI_MAX_VOLUMES+UBIN T_VOL_COUNT;spinl ock_t volumes_lock;int ref_co unt;int image_seq;int rsvd_pebs;/保留的 LEB 数目int avail_pebs;/ 可用的 LEB 数目int beb_rsvd_pebs;/为坏块处理而保留的LEB数目int beb_rsvd_level;/为坏块处理而保留的LEB的正常数目int au

3、toresize_vol_id;int vtbl_slots;int vtbl_size;/volume 表的大小(bytes)struct ubi_vtbl_record *vtbl;/ 内存中 volume 表的拷贝struct mutex device_mutex;int max_ec;/最大的 erase counter/* Note, mean_ec is not updated run-time - should be fixed */int mean_ec;/平均 erase counter/* EBA sub-system's stuff */un sig ned lo

4、ng long global_s qnum;spinl ock_t ltree_lock;struct rb_root ltree;struct mutex alc_mutex;/* Wear-leveli ng sub-system's stuff */struct rb_root used;/ 一个红黑树,其中是已用的blcokstruct rb_root erron eous;/ RB-tree of erron eous used physical eraseblocksstruct rb_root free;/红黑树的根,其中是没有用到的blockstruct rb_root

5、 scrub;/ 需要擦除的 blcokstruct list_head pqUBI_PROT_QUEUE_LEN;int pq_head;spinl ock_t wl_lock;struct mutex move_mutex;struct rw_semaphore work_sem;int wl_scheduled;struct ubi_wl_e ntry *lookuptbl; a table to quickly find a &struct ubi_wl_e ntry object for any physical eraseblock,,一个 struct ubi_wl_en

6、try 类型的数组,以 pnum 为下标,记录该 UBI设备的每一个blockstruct ubi_wl_e ntry *move_from; physical eraseblock from where the data is being movedstruct ubi_wl_e ntry *move_to; physical eraseblock where the data is being moved toint move_to_put;标志位,用于标志目的LEB是否被putstruct list_head works;/ list of pending worksint works_

7、co un t; count of pending worksstruct task_struct *bgt_thread;/UBI 的后台进程int thread_e nabled;char bgt_ namesizeof(UBI_BGT_NAME_PATTERN)+2;后台进程的名字struct no tifier_block reboot_ no tifier;/ 内核通知链/* I/O sub-system's stuff */long long flash_size;/MTD 分区的大小int peb_count;/LEB 的数目int peb_size;/LEB 的大小(每

8、一个 block 的大小)int bad_peb_cou nt; 坏块数目int good_peb_count;/ 能使用的 LEB 数目int erron eous_peb_co unt;int max_err on eous;int mino_size;最小操作单元的大小,也就是一个page的大小int hdrs_m in_i o_size;int ro_mode;int leb_size;/逻辑块的大小,一般等于peb_sizeint leb_start;/逻辑块块从物理块中那一块开始算,也就是之前的物理块保留用于其他目 的int ec_hdr_alsize;/ size of the

9、EC header alig ned to hdrs_min_io_sizeint vid_hdr_alsize; /size of the VID header alig ned to hdrs_min_io_sizein t vid_hdr_offset;/VID 头部在一块之中的偏移量。一般是一个pagesizeint vid_hdr_aloffset;/ starti ng offset of the VID header alig ned to hdrs_min_io_sizeint vid_hdr_shift/ contains vid_hdr_offset - vid_hdr_a

10、loffsetun sig ned int bad_allowed:1;un sig ned int no r_flash:1;/ non-zero if work ing on top of NOR flashstruct mtdnfo *mtd;/指向MTD分区信息,我们知道,UBI层是构建在 MTD层之上的。void *peb_buf1;/ 一个缓冲区,大小为一个block的大小void *peb_buf2; / 一个缓冲区,大小为一个block的大小struct mutex buf_mutex;struct mutex ckvol_mutex;#ifdef CONFIG_MTD_UBI

11、_DEBUG_PARANOIDvoid *dbg_peb_buf;struct mutex dbg_buf_mutex;#en dif;2. struct ubi_vtbl_record下一个重要的结构体struct ubi_vtbl_record,在认识这个结构体之前我们先看一副截图B ubidttach /dev/ubi_ctri -m u -d aUB1 :attachinq ntdB to uibiophasical erasehlock size i52289 byttS (512 KiR)UBI:logical f51d»d bptesUBI:sraallest if l

12、ash I/O unit:4096UB1 :VIDr offset:(JLlgnoti 4096)UB1 :data oFfset:UB| iattached nitd B to ubi 0UBI:HTD Mevd" none:UBI:HTD device size:hiBUB1 :number of good PEBs:UBI :number uF bd PEBu:0UBI 1nax. aliamed ualunps:UBI:war=leveling threshold:UBI:number of internal uolunes:1UBI :number cm- user u&g

13、t;olum«s:1UBX :PEBs:983UBI itotal number of reserved PElBs: 10ASUBI:number of PEBs reserved forbad PEB hanilling:UBI:nax/Fiean erse coumter: 2/1UBI :sequence nunber: QUBX :bdCkgrounJ Eoatl "ubiPIO 321UBI device nunber &, total 2MB LEBs (1QS696M081finB.fi IliB) , auailmbjg 993 LEBs (5fl

14、73223dB htes这幅截图是我们在attach 一个设备时候的打印内容,红色的划线部分是我们要注意的内容:in ternal volume什么是internal volume ?它是与下面的 user volume相区别的。internal volume是内核使用来保持相应的信息的,那么它保持的是什么呢?它保持的是volume table。它是以struct ubi_vtbl_record 数据结构的格式来保持的。struct ubi_vtbl_record _be32 reserved_pebs; how many physical eraseblocks are reserved f

15、or this volume_be32 alig nmen t; volume alig nment_be32 data_pad; how many bytes are unu sed at the end of the each physical eraseblock to satisfy the requested alig nment_u8 vol_type;/volume 的类型,分为动态和静态两种,动态volume可以动态的改变它的大小_u8 upd_marker;_be16 n ame_le n; /volume n ame len gth_u8 n ameUBI_VOL_NAME

16、_MAX+1; /volume name_u8 flags;_u8 paddi ng23;_be32 crc; _attribute_ (packed);3. struct ubi_volumestruct ubi_volume是对UBI设备上每一个 volume的抽象。struct ubi_volume struct device dev;struct cdev cdev;struct ubi_device *ubi; 该 volume 在哪一个 UBI 设备上int vol_id;/volume 标号int ref_count;引用次数(不知道什么用途)int readers;/ nu m

17、ber of users hold ing this volume in read-only modeint writers;/ nu mber of users holdi ng this volume in read-write modeint exclusive;/ whether somebody holds this volume in exclusive modeint reserved_pebs;该 volume 中保留的 peb 数int vol_type;/volume 类型int usable_leb_size;/ logical eraseblock size witho

18、ut paddi ngint used_ebs可用 PEB 数目int last_eb_bytes; how many bytes are stored in the last logical eraseblocklong long used_bytes;/ 已用空间大小int alig nment;int data_pad;int name_len;/volume 名字的长度char nameUBI_VOL_NAME_MAX + 1;int upd_ebs;int ch_lnum; LEB nu mber which is being cha nging by the atomic LEB

19、cha nge operatio n(这样在后面修改LEB数据的操作中可以看到)int ch_dtype;long long upd_bytes;long long upd_received;void *upd_buf;int *eba_tbl;/ EBA table of this volume ,极其重要,LEB到PEB得影射关系需要查该表 来获得un sig ned int checked:1;un sig ned int corrupted:1;un sig ned int upd_marker:1;un sig ned int updati ng:1;un sig ned int c

20、ha ngin g_leb:1;un sig ned int direct_writes:1;4. struct ubi_sca n_info这个结构体是在 attach的过程中使用的。 在attach的过程中,UBIFS需要获知该设备上每一 个PEB的状态,然后为重新挂载文件系统做准备。struct ubi_sca n_info struct rb_root volumes;/volume 的红黑树的根节点下面是4个链表,是在扫描的过程将扫描的block进行分类,然后连接到下面4个链表中的其中一个。struct list_head corr;struct list_head free;str

21、uct list_head erase;struct list_head alie n;int bad_peb_cou nt; 坏块数int vols_found;/volume 数int highest_vold;/volume的最高标号int alie n_peb_co unt;int is_empty;标志位,用于表示该UBI设备是否为空的,在上面所说的扫描过程被置位int min_ec; 最小 erase counterint max_ec; 最大 erase counterunsigned long long max_sqnum;/64 位的 sqnumint mean_ec;/平均

22、 erase counteruin t64_t ec_sum;int ec_co unt;int corr_co unt;5 struct ubi_sca n_leb在上面的struct ubi_scan_info中我们说到了在 attach操作中的扫描过程,并且说到了structubi_scan_info中的4个队列,是将扫描的每一个 block的信息抽象,然后挂载到这些队列中 去,下面就简单的说一下对于block扫描信息的抽象。struct ubi_sca n_leb int ec;/erase counter,用于均衡损耗目的,以后详细介绍每一个卷的eba_table就是由下面两个成员构

23、成的。int pnum;物理块标号int Inum;/逻辑块标号int scrub;un sig ned long long sqnum;union struct rb_node rb;struct list_head list; u;6. struct ubi_ec_hdr我们知道UBIFS是一个 Wear-level的文件系统,即均衡损耗。我们就以struct ubi_ec_hdr 这个开始重要结构体的介绍。struct ubi_ec_hdr _be32magic;_u8versi on;_u8paddi ng13;_be64ec; /* Warning: the curre nt lim

24、it is 31-bit any way! */_be32vid_hdr_offset;_be32data_offset;_be32image_seq;_u8paddi ng232;_be32hdr_crc; _attribute_ (packed);我们注意其中的一个成员变量为_be64 ec,ec是什么,ec就是erase counter。我们知道NANDFLASH 是的擦除是有次数限制的,当擦除的次数太多的时候,就会变成坏块。什么是均衡损耗,就是在文件系统的管理下,我们不能对其中的一块进行过多的擦除操作。我们来看函数 ensure_wear_leveling ,它只要是来判断 UBI设备

25、是否需要进行均衡损耗的相 关处理,这儿就有两个问题了。1它判断的依据是什么。2它会进行什么样的相关来避免对一个可擦出块进行过多的擦除操作。那么我们先来回答第一个问题,在WL子系统中,所有的可擦出块都归WL子系统来进行管理。这是一个 RB数,我们来其中的每一个结点。struct ubi_wl_e ntry union struct rb_node rb;struct list_head list; u;int ec;int pnum;说白了,WL只关心一个东西,那么就是ec的数值。下面是 wear_leveling_worker函数中的一段核心代码:e1 = rb_e ntry(rb_first

26、(&ubi->used), struct ubi_wl_e ntry, u.rb);e2 = fin d_wl_e ntry(&ubi->free, WL_FREE_MAX_DIFF);if (!(e2->ec - e1->ec >= UBI_WL_THRESHOLD)从used中队里中取出一个LEB,显然EC是最小的(每擦除一次,EC值加一),再从free队列中取出一个 EC值最大的LEB。如果两个LEB的ec差值大于了 UBI_WL_THRESHOLD ,那么就需要进行 WL操作了。那么多操作是什么呢?err = ubi_eba_copy_le

27、b(ubi, e1->p num, e2->p num, vid_hdr);将内容从一个LEB搬到另外一个LEB中去。6.struct ubi_vid_hdr在上面EC头部中有一个成员变量是vid_hdr_offset,是指vid_hdr在FLASH中的偏移量,接着分析第二重要的数据结构struct ubi_vid_hdr。struct ubi_vid_hdr be32magic;u8versi on;u8vol_type;u8copy_flag;u8compat;be32vol_id;be32lnum;u8paddi ng14;be32data_size;be32used_ebs

28、;be32data_pad;be32data_crc;u8paddi ng24;be64sqnum;u8paddi ng312;be32hdr_crc; _attribute_ (packed);这其中最重要的成员变量是_be32 vol_id和_be32 Inum。vold是标示该LEB属于哪儿 一个volume。Lnum是指与该PNUM相对于的Inum。对于上层而言,我们操作的是逻辑块, 也就是Inum,但是最终需要将数据写进 pnum中去,在ubi_eba_write_leb函数中有这样的一 句:pnum = vol->eba_tbl Inu m;每一个volume都有一个eba_

29、tbl,是在扫描的时候建立的。如果该 Inum没有影射,那么调 用ubi_wl_get_peb来获得一个 pnum,并相应的修改 volume的eba_tbl;7. struct ubi_sca n_volume struct ubi_sca n_vo lume int vol_id;/volume 标号int highest_lnum;/该volume中的最高逻辑块标号int leb_count;/leb 数目int vol_type;/volume 类型int used_ebs;已用 PEB 数int last_data_size;int data_pad;int compat;struct rb_node rb;/不清楚具体目的,猜想应该是一个节点的cache,缓存的是刚刚访问的结点struct rb_root root;这儿主要注意一下上面的struct rb_root root变量,这个成员是一个红黑树的根,用来链接在扫描的过程中发现的属于该volume的PEB。这个结构体是在扫描的过程中读VID头部建立起来的关于volum

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论