




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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(UBI_NAME_STR)+5;/ubi设备的名称int vol_count;/在该UBI设备中有多少个volumestruct ubi_volume *volumesUBI_MAX_VOLUMES+UBI_INT_VOL_COUNT;spinlock_t volumes_lock;int ref_count;int image_seq;int rsvd_pebs;/保留的LEB数目int avail_pebs;/可用的LEB数目int beb_rsvd_pebs;/为坏块处理而保留的LEB数目int beb_rsvd_level;/为坏块处理而保留的LEB的正常数目int autoresize_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-systems stuff */unsigned long long global_sqnum;spinlock_t ltree_lock;struct rb_root ltree;struct mutex alc_mutex;/* Wear-leveling sub-systems stuff */struct rb_root used;/一个红黑树,其中是已用的blcokstruct rb_root erroneous;/ RB-tree of erroneous used physical eraseblocksstruct rb_root free;/红黑树的根,其中是没有用到的blockstruct rb_root scrub;/需要擦除的blcokstruct list_head pqUBI_PROT_QUEUE_LEN;int pq_head;spinlock_t wl_lock;struct mutex move_mutex;struct rw_semaphore work_sem;int wl_scheduled;struct ubi_wl_entry *lookuptbl;/ a table to quickly find a &struct ubi_wl_entry object for any physical eraseblock,,一个struct ubi_wl_entry类型的数组,以pnum为下标,记录该UBI设备的每一个blockstruct ubi_wl_entry *move_from;/ physical eraseblock from where the data is being movedstruct ubi_wl_entry *move_to;/ physical eraseblock where the data is being moved toint move_to_put;/标志位,用于标志目的LEB是否被putstruct list_head works;/ list of pending worksint works_count;/ count of pending worksstruct task_struct *bgt_thread;/UBI的后台进程int thread_enabled;char bgt_namesizeof(UBI_BGT_NAME_PATTERN)+2;/后台进程的名字struct notifier_block reboot_notifier;/内核通知链/* I/O sub-systems stuff */long long flash_size;/MTD分区的大小int peb_count;/LEB的数目int peb_size;/LEB的大小(每一个block的大小)int bad_peb_count;/坏块数目int good_peb_count;/能使用的LEB数目int erroneous_peb_count;int max_erroneous;int min_io_size;/最小操作单元的大小,也就是一个page的大小int hdrs_min_io_size;int ro_mode;int leb_size;/逻辑块的大小,一般等于peb_sizeint leb_start;/逻辑块块从物理块中那一块开始算,也就是之前的物理块保留用于其他目的int ec_hdr_alsize;/ size of the EC header aligned to hdrs_min_io_sizeint vid_hdr_alsize; /size of the VID header aligned to hdrs_min_io_sizeint vid_hdr_offset;/VID头部在一块之中的偏移量。一般是一个pagesizeint vid_hdr_aloffset;/ starting offset of the VID header aligned to hdrs_min_io_sizeint vid_hdr_shift/ contains vid_hdr_offset - vid_hdr_aloffsetunsigned int bad_allowed:1;unsigned int nor_flash:1;/ non-zero if working on top of NOR flashstruct mtd_info *mtd;/指向MTD分区信息,我们知道,UBI层是构建在MTD层之上的。void *peb_buf1;/一个缓冲区,大小为一个block的大小void *peb_buf2; /一个缓冲区,大小为一个block的大小struct mutex buf_mutex;struct mutex ckvol_mutex;#ifdef CONFIG_MTD_UBI_DEBUG_PARANOIDvoid *dbg_peb_buf;struct mutex dbg_buf_mutex;#endif;2. struct ubi_vtbl_record下一个重要的结构体struct ubi_vtbl_record,在认识这个结构体之前我们先看一副截图,这幅截图是我们在attach一个设备时候的打印内容,红色的划线部分是我们要注意的内容:internal 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 for this volume_be32 alignment;/ volume alignment_be32 data_pad;/ how many bytes are unused at the end of the each physical eraseblock to satisfy the requested alignment_u8 vol_type;/volume的类型,分为动态和静态两种,动态volume可以动态的改变它的大小_u8 upd_marker;_be16 name_len;/volume name length_u8 nameUBI_VOL_NAME_MAX+1; /volume name_u8 flags;_u8 padding23;_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;/ number of users holding this volume in read-only modeint writers;/ number of users holding 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 without paddingint used_ebs/可用PEB数目int last_eb_bytes;/ how many bytes are stored in the last logical eraseblocklong long used_bytes;/已用空间大小int alignment;int data_pad;int name_len;/volume名字的长度char nameUBI_VOL_NAME_MAX + 1;int upd_ebs;int ch_lnum; LEB number which is being changing by the atomic LEB change operation(这样在后面修改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得影射关系需要查该表来获得unsigned int checked:1;unsigned int corrupted:1;unsigned int upd_marker:1;unsigned int updating:1;unsigned int changing_leb:1;unsigned int direct_writes:1;4. struct ubi_scan_info这个结构体是在attach的过程中使用的。在attach的过程中,UBIFS需要获知该设备上每一个PEB的状态,然后为重新挂载文件系统做准备。struct ubi_scan_info struct rb_root volumes;/volume的红黑树的根节点/下面是4个链表,是在扫描的过程将扫描的block进行分类,然后连接到下面4个链表中的其中一个。struct list_head corr;struct list_head free;struct list_head erase;struct list_head alien;int bad_peb_count;/坏块数int vols_found;/volume数int highest_vol_id;/volume 的最高标号int alien_peb_count;int is_empty;/标志位,用于表示该UBI设备是否为空的,在上面所说的扫描过程被置位int min_ec;/最小erase counterint max_ec;/最大erase counterunsigned long long max_sqnum;/64位的sqnumint mean_ec;/平均erase counteruint64_t ec_sum;int ec_count;int corr_count;5 struct ubi_scan_leb在上面的struct ubi_scan_info中我们说到了在attach操作中的扫描过程,并且说到了struct ubi_scan_info中的4个队列,是将扫描的每一个block的信息抽象,然后挂载到这些队列中去,下面就简单的说一下对于block扫描信息的抽象。struct ubi_scan_leb int ec;/erase counter,用于均衡损耗目的,以后详细介绍/每一个卷的eba_table就是由下面两个成员构成的。int pnum;/物理块标号int lnum;/逻辑块标号int scrub;unsigned 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 _be32 magic;_u8 version;_u8 padding13;_be64 ec; /* Warning: the current limit is 31-bit anyway! */_be32 vid_hdr_offset;_be32 data_offset;_be32 image_seq;_u8 padding232;_be32 hdr_crc; _attribute_ (packed);我们注意其中的一个成员变量为_be64 ec,ec是什么,ec就是erase counter。我们知道NANDFLASH是的擦除是有次数限制的,当擦除的次数太多的时候,就会变成坏块。什么是均衡损耗,就是在文件系统的管理下,我们不能对其中的一块进行过多的擦除操作。我们来看函数ensure_wear_leveling,它只要是来判断UBI设备是否需要进行均衡损耗的相关处理,这儿就有两个问题了。1.它判断的依据是什么。2.它会进行什么样的相关来避免对一个可擦出块进行过多的擦除操作。那么我们先来回答第一个问题,在WL子系统中,所有的可擦出块都归WL子系统来进行管理。这是一个RB数,我们来其中的每一个结点。struct ubi_wl_entry union struct rb_node rb;struct list_head list; u;int ec;int pnum;说白了,WL只关心一个东西,那么就是ec的数值。下面是wear_leveling_worker函数中的一段核心代码:e1 = rb_entry(rb_first(&ubi-used), struct ubi_wl_entry, u.rb);e2 = find_wl_entry(&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_leb(ubi, e1-pnum, e2-pnum, vid_hdr);将内容从一个LEB搬到另外一个LEB中去。6.struct ubi_vid_hdr在上面EC头部中有一个成员变量是vid_hdr_offset,是指vid_hdr在FLASH中的偏移量,接着分析第二重要的数据结构struct ubi_vid_hdr。struct ubi_vid_hdr _be32 magic;_u8 version;_u8 vol_type;_u8 copy_flag;_u8 compat;_be32 vol_id;_be32 lnum;_u8 padding14;_be32 data_size;_be32 used_ebs;_be32 data_pad;_be32 data_crc;_u8 padding24;_be64 sqnum;_u8 padding312;_be32 hdr_crc; _attribute_ (packed);这其中最重要的成员变量是_be32 vol_id和_be32 lnum。vol_id是标示该LEB属于哪儿一个volume。Lnum是指与该PNUM相对于的lnum。对于上层而言,我们操作的是逻辑块,也就是lnum,但是最终需要将数据写进pnum中去,在ubi_eba_write_leb函数中有这样的一句:pnum = vol-eba_tbllnum;每一个volume都有一个eba_tbl,是在扫描的时候建立的。如果该lnum没有影射,那么调用ubi_wl_get_peb来获得一个pnum,并相应的修改volume的eba_tbl;7. struct ubi_scan_volumestruct ubi_scan_volume 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头部建立起来的关于volume的临时信息。在ubifs-media.h中定义了很多的结构体,下面简单的解释一下。在A brief 。中讲到了,UBIFS采用的n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025贵州毕节市大方县人民医院专项引进高层次急需紧缺人才40人考前自测高频考点模拟试题及答案详解(必刷)
- 2025国家电投集团陕西公司招聘11人模拟试卷及一套完整答案详解
- 2025吉林大学白求恩第一医院日间观察病房护理平台招聘考前自测高频考点模拟试题参考答案详解
- 2025年牡丹江绥芬河市公开招聘公益性岗位工作人员20人(第一批)模拟试卷完整答案详解
- 浙江国企招聘2025台州市椒江区社会事业发展集团有限公司公开招聘工作人员及特殊人才3人笔试历年参考题库附带答案详解
- 康定市投资发展集团有限公司2025年公开招聘人员综合排名笔试历年参考题库附带答案详解
- 中国航空工业集团建投2025届校园招聘正式启动笔试历年参考题库附带答案详解
- 2025黑龙江哈尔滨智能信息系统发展有限公司招聘笔试历年参考题库附带答案详解
- 2025陕西融发建设集团有限公司3月招聘笔试历年参考题库附带答案详解
- 2025重庆庆铃车桥有限公司招聘4人笔试历年参考题库附带答案详解
- 2023年检验检测机构质量手册(依据2023年版评审准则编制)
- 变化点(4M变更)管理管控表
- 洪恩识字配套字库完整版识字启蒙200字-生字组词句子完整版可打印-点读指读
- 辽宁省2023年中考语文试题【6套】(含真题答案)
- 虚拟现实技术在物流与快递配送中的应用与创新
- 《小儿支气管肺炎》课件
- 技能认证输油工初级考试(习题卷24)
- 食品小经营店、小食堂备案信息采集表
- 教科版小学四年级科学上册《2 呼吸与消化 第2课 呼吸与健康生活》课堂教学课件PPT公开课
- 生产型企业员工奖惩制度
- 电子商务运营PPT完整全套教学课件
评论
0/150
提交评论