Flashsim安装以及支持4KB,8KB闪存页

1、进行环境配置,具体配置内容可参照博主另一篇文章《 DiskSim+ssd_add_on使用指南

2、下载对应的Disksim3.0以及Flashsim安装压缩包,可在博主提供的下载页中获得

http://download.csdn.net/detail/g382112762/9834319

3、解压disksim3.0.zip,进入解压后的/disksim3.0文件夹
4、删除压缩包内的disksim-3.0文件夹,然后进行解压 tar xfz disksim-3.0.tar.gz
5、解压后,进入disksim-3.0文件夹,输入make指令进行编译

6、编译完成后,cd valid ,进入valid文件后,执行./runvalid

      输出结果为以下内容则编译成功 :

   These results represent actual drivevalidation experiments

   QUANTUM_QM39100TD-SW (rms should be about0.378)

   disksim_run_simulation(): simulated 1090390events

   rms = 0.377960

   SEAGATE_ST32171W (rms should be about0.349)

   disksim_run_simulation(): simulated 1585900events

   rms = 0.347581

  ......

 7、上述过程完成后,说吗disksim3.0已安装成功,接下来进行flashsim安装

8、回到disksim3.0文件夹下,解压src压缩包 tar xfz src.release.tar.gz

9、删除原src文件夹下所有内容 rm -r disksim-3.0/src/*

10、将解压后的src.release中的内容拷贝到disksim-3.0/src/文件夹下 cp -r src.release/* ./disksim-3.0/src/

11、将flashsim-20100324.patch拷贝至disksim-3.0/src/文件夹下 cp flashsim-20100324.patch ./disksim-3.0/src/

12、进入disksim-3.0/src/文件夹,并打补丁 patch -p1 -i flashsim-20100324.patch,成功后出现下列语句:

patching file dftl.c
patching file disksim_logorg.c
patching file fast.c
patching file flash.c
patching file pagemap.c
patching file syssim_driver.c

13、然后,退回到disksim-3.0文件夹,进行编译make。

14、到此,flashsim安装完成。但是,此时的flashsim在一定程度上的某些参数设计不够合理,例如支持的flash page size是2kb,因此,接下来我们需要对相应的配置参数进行调整。

15、flash.h文件中替换以下内容

#ifndef SSD_LAYOUT
#define SSD_LAYOUT

#include  "type.h"

#define LB_SIZE_512  1
#define LB_SIZE_1024 2
#define LB_SIZE_2048 4

#define SECT_NUM_PER_PAGE  8        //gaocm    original value is 4
#define PAGE_NUM_PER_BLK  64
#define SECT_NUM_PER_BLK  (SECT_NUM_PER_PAGE * PAGE_NUM_PER_BLK)
#define SECT_SIZE_B 512

#define SECT_BITS       3    //gaocm  original value is 2
#define PAGE_BITS       6    //original value is 6
#define PAGE_SECT_BITS  9    //original value is 8
#define BLK_BITS       28        //original value is 24

#define NAND_STATE_FREE    -1
#define NAND_STATE_INVALID -2

#define SECT_MASK_IN_SECT 0x0003
#define PAGE_MASK_IN_SECT 0x00FC
#define PAGE_SECT_MASK_IN_SECT 0x00FF
#define BLK_MASK_IN_SECT  0xFFFFFF00
#define PAGE_BITS_IN_PAGE 0x003F
#define BLK_MASK_IN_PAGE  0x3FFFFFC0

#define PAGE_SIZE_B (SECT_SIZE_B * SECT_NUM_PER_PAGE)
#define PAGE_SIZE_KB (PAGE_SIZE_B / 1024)
#define BLK_SIZE_B  (PAGE_SIZE_B * PAGE_NUM_PER_BLK)
#define BLK_SIZE_KB (BLK_SIZE_B / 1024)

#define BLK_NO_SECT(sect)  (((sect) & BLK_MASK_IN_SECT) >> (PAGE_BITS + SECT_BITS))
#define PAGE_NO_SECT(sect) (((sect) & PAGE_MASK_IN_SECT) >> SECT_BITS)
#define SECT_NO_SECT(sect) ((sect) & SECT_MASK_IN_SECT)
#define BLK_PAGE_NO_SECT(sect) ((sect) >> SECT_BITS)
#define PAGE_SECT_NO_SECT(sect) ((sect) & PAGE_SECT_MASK_IN_SECT)
#define BLK_NO_PAGE(page)  (((page) & BLK_MASK_IN_PAGE) >> PAGE_BITS)
#define PAGE_NO_PAGE(page) ((page) & PAGE_MASK_IN_PAGE)
#define SECTOR(blk, page) (((blk) << PAGE_SECT_BITS) | (page))

#define BLK_MASK_SECT 0x3FFFFE00
#define PGE_MASK_SECT 0x000001F8    //gaocm default value is 0x000000FC
#define OFF_MASK_SECT 0x00000007    //gaocm default value is 0x00000003
#define IND_MASK_SECT (PGE_MASK_SECT | OFF_MASK_SECT)
#define BLK_BITS_SECT 22
#define PGE_BITS_SECT  6
#define OFF_BITS_SECT  3    //gaocm    default value is 2
#define IND_BITS_SECT (PGE_BITS_SECT + OFF_BITS_SECT)
#define BLK_F_SECT(sect) (((sect) & BLK_MASK_SECT) >> IND_BITS_SECT)
#define PGE_F_SECT(sect) (((sect) & PGE_MASK_SECT) >> OFF_BITS_SECT)
#define OFF_F_SECT(sect) (((sect) & OFF_MASK_SECT))
#define PNI_F_SECT(sect) (((sect) & (~OFF_MASK_SECT)) >> OFF_BITS_SECT)
#define IND_F_SECT(sect) (((sect) & IND_MASK_SECT))
#define IS_SAME_BLK(s1, s2) (((s1) & BLK_MASK_SECT) == ((s2) & BLK_MASK_SECT))
#define IS_SAME_PAGE(s1, s2) (((s1) & (~OFF_MASK_SECT)) == ((s2) & (~OFF_MASK_SECT)))

以及以下结构体:

struct nand_blk_info {
  struct blk_state state;                   // Erase Conunter
  struct sect_state sect[SECT_NUM_PER_BLK]; // Logical Sector Number
  int fpc : 11; // free page counter
  int ipc : 11; // invalide page counter
  int lwn : 13; // last written page number
  int page_status[PAGE_NUM_PER_BLK];
};

16、disksim_iotrace.c文件中替换iotrace_ascii_get_ioreq_event函数中以下内容:

//flashsim    gaocm
   new->bcount = ((new->blkno+ new->bcount-1)/8 - (new->blkno)/8 + 1) * 8;
   new->blkno /= 8;
   new->blkno *= 8;

17、disksim_main.c文件中替换warmFlash函数中以下内容:

    bcount = ((blkno + bcount -1) / 8 - (blkno)/8 + 1) * 8;
    blkno /= 8;
    blkno *= 8;

18、完成上述参数调整后,当前的flashsim已经支持4KB闪存页,然后回到disksim3.0文件夹,将test.release.tar.gz压缩包解压至disksim-3.0

19、解压完成后,进入test.release文件夹,可进行运行程序,上述我们修改的是针对DFTL的部分进行/8,若需要修改其他ftl,可进行类似修改

20、运行命令../src/disksim dftl.parv dftl.outv ascii ./trace/test.file 0命令,gdb运行命令:

gdb ../src/disksim  然后, r dftl.parv dftl.outv ascii ./trace/test.file 0



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flashsim是一个用于模拟闪存存储系统的开源仿真工具,可以帮助研究人员和开发人员更好地了解闪存存储系统的性能和行为。 Flashsim的源码是用C++语言编写的,提供了闪存存储系统的各个组件的实现,包括闪存芯片、控制器、存储设备等。通过研究和修改Flashsim的源码,可以进行不同的实验和开发,以满足特定的研究需求或系统设计目标。 Flashsim的源码主要包含以下几个方面的内容: 1. 数据结构:Flashsim使用了许多数据结构来组织和管理闪存系统中的数据,如位图、表等。源码中定义了这些数据结构,并提供了相应的操作方法。 2. 算法实现:Flashsim实现了各种用于管理和优化闪存系统的算法,如垃圾回收、面替换等。源码中包含了这些算法的具体实现细节。 3. IO调度:Flashsim提供了多种IO调度算法,用于管理和调度来自主机的IO请求。源码中定义了这些调度算法,并提供了相应的接口函数。 4. 性能评估:Flashsim源码中还包含了用于评估系统性能的工具,如统计分析模块、性能计数等。这些模块可以帮助用户了解闪存系统的性能情况,并进行性能优化。 通过分析和修改Flashsim的源码,研究人员和开发人员可以深入了解闪存存储系统的工作原理和性能特点,并在此基础上进行相关研究和开发工作。同时,Flashsim的源码还可以为开发者提供一个参考和示例,帮助他们更好地开发和优化自己的闪存存储系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值