SSDsim源码分析之main

原创 2016年06月01日 12:17:18

由于研究论文的选题定在了ssd的能耗存储优化上,所以就顺便写一些博客文章,主要的先介绍一下ssdsim这个开源工具的一些内容以及基本的知识:


SSDsim介绍

SSDsim是一款固态硬盘的模拟仿真软件,它提供了一系列强大的前期功能验证手段并且可以较为准确地对真实SSD固态硬盘嵌入式硬件设备进行一个仿真模拟,所以可以有效地模拟硬件结构以及软件算法的有效性。最大的特点就是可塑自由性极高,可以通过特定的输入参数文件检测特定的SSD进行一系列实验。这款开源软件是由华中科技大学的胡洋博士开发并且经过了不断改良的开源项目,下载网址是在SSDsim之中,并且有配套的用户说明手册;这里也借鉴了一些用户手册中的知识。

SSD基本概念介绍

由于篇幅的原因,所以这里只是简单地介绍一下关于SSD的一部分最基本的需要理解的概念;其他的详细概念以及与Linux kernel,存储架构等相关的具体概念会在其他博文中一一展开。
SSD(Solid State Drive)是一种利用Flash芯片或者DRAM芯片作为数据永久存储的硬盘,它与传统的机械硬盘HDD也就是磁盘有些本质上的差别。SSD不再采用了磁技术来进行数据的存储,它利用了一种叫做“浮动门场效应晶体管”的基本cell来进行保存数据,主要现在有三种类型的cell,分别是SLC(每一个cell只能保存1Bit的数据)、MLC(每一个cell能保存2Bit的数据)、TLC(每一个cell能保存3Bit的数据)。而且就成本而言SLC>MLC>TLC;出错率SLC小于MLC小于TLC;但是它们都有一个共同的特点就是这些类型的cell都需要额外的空间来保存一个叫ECC校验的数据,这个ECC校验可以负责数据的错误恢复。
SSD的基本结构图示如下:
SSD基本架构

SSD的操作特性也与HDD有着巨大的差别,最显著的主要有:

  • 读和写操作都是以页page为基本单位
  • 如果page是vaild或者unvaild状态则写操作是不可以覆盖写,必须先擦除后才能进行写操作
  • 擦除操作是以块为基本单位的

其他的基本特性会在其他博文中一一详细介绍,以上三点操作特性的具体原理和原因也会详细说明;

主体功能

SSDsim主要实现了对固态盘的软硬件系统环境的模拟仿真;运行于SSDsim之上的软件算法与真实SSD的系统软件的基本误差很小。而SSD的硬件系统主要是由多个通道,通道下的多个芯片,芯片下多个晶圆,晶圆下多个闪存片,闪存片下多个闪存块,闪存块下多个闪存页这样的一种并行多层级架构,所以这个SSDsim也用了一个极其庞大的结构体组来对这个并行多层级架构进行了一个模拟,具体可以看下图的结构体关系图:
SSDsim结构体组

关于这些结构体的详细介绍以及在这个SSDsim中的作用会在后续的博文中一一结合源码展开。
SSDsim的主体功能主要是提供了对能耗和时间的模拟,具体的实现原理要根据源码分模块进行分析。

main函数解析

我们先来看看ssdsim中的main函数,分析一个开源项目最好的入口就是main和makefile,这里由于用到的makefile非常简单就不介绍了,直接看main:

void main()
{
    unsigned  int i,j,k;        
    struct ssd_info *ssd;       //声明定义一个ssd结构

    #ifdef DEBUG
    printf("enter main\n");     //如果进入debug模式则显示相关信息
    #endif

    ssd=(struct ssd_info*)malloc(sizeof(struct ssd_info));      //为ssd分配内存
    alloc_assert(ssd,"ssd");                //检测分配内存的情况,若失败则返回并显示出错信息
    memset(ssd,0, sizeof(struct ssd_info)); //将ssd指向的那部分结构体内存空间清零,相当于初始化

    ssd=initiation(ssd);    //初始化ssd(重点函数模块,需要仔细阅读)
    make_aged(ssd);         //模拟ssd的使用情况
    pre_process_page(ssd);  //读请求的预处理函数

    for (i=0;i<ssd->parameter->channel_number;i++)
    {
        for (j=0;j<ssd->parameter->die_chip;j++)
        {
            for (k=0;k<ssd->parameter->plane_die;k++)
            {
                printf("%d,0,%d,%d:%5d\n",i,j,k,ssd->channel_head[i].chip_head[0].die_head[j].plane_head[k].free_page);
            }       
        }
    }   
/********************************************************************************************
这段嵌套循环体输出的分别是:

SSDsim将ssd的通道channel,通道上的每个芯片chip,每个芯片上的颗粒die,每个颗粒上面的闪存片plane(也就是块block),
每个闪存片上的闪存页page都用了结构体来进行描述,然后都实现了一个结构体数组来对每个层次的结构体进行一个关系连接;所以
此处的循环体相当于将ssd中按照层次分级将所有空闲状态的pege按照层次的划分输出;显示当前ssd中空闲页的位置;

*********************************************************************************************/
    fprintf(ssd->outputfile,"\t\t\t\t\t\t\t\t\tOUTPUT\n");
    fprintf(ssd->outputfile,"****************** TRACE INFO ******************\n");
/********************************************************************************************
fprintf函数的格式是:int fprintf( FILE *stream, const char *format, [ argument ]...),fprintf()函数
根据指定的格式(format)向输出流(stream)写入数据(argument)。
所以此处的两个fprintf函数的作用分别是:

1.按照"\t\t\t\t\t\t\t\t\tOUTPUT\n"这个格式将数据输入到outputfile中
2.按照"****************** TRACE INFO ******************\n"这样的格式将数据输入至outputfile中


*********************************************************************************************/


    ssd=simulate(ssd);      //核心处理函数,对ssd进行一个模拟能耗过程
    statistic_output(ssd);  //输出模拟后的结果
/*  free_all_node(ssd);*/   //释放malloc的ssd空间

    printf("\n");
    printf("the simulation is completed!\n");

}

SSDsim的main函数功能主要分为了五个模块进行理解,主要是初始化函数initiation()、SSD旧化模拟函数make_aged()、页操作请求预处理函数pre_process_page()、核心模拟函数simulate()以及输出模拟结果函数statistic_output();当然在这五大模块之中重中之重的是初始化函数initiation()、页操作请求预处理函数pre_process_page()以及核心模拟函数simulate()这三个大模块。后续将会将重点解析放在这三部分之中。

main函数调用关系图示

后续总结

第一次写博客,难免有些杂乱无章而且水准不够,不过这是一个再学习的过程,需要自己继续坚持!好好加油!接下来就是继续分析源码并且总结整个SSDsim还有SSD相关的一些知识点!

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

在disksim-3.0中安装flashsim,并测试不同FTL算法在不同trace下的性能

1、flashsim的安装 成功安装disksim-3.0之后,按照如下步骤安装flashsim: a、将flashsim-psu中的src.release.tar.gz压缩包解压生成src.re...

flashsim源码阅读笔记1

因为实验室要用到,所以我打算读一下flashsim的源代码。 首先确定要阅读的内容应该都在src文件夹,然后大致看一下名字,命名根据英文意思还是大致能了解的。暂时懒得去看每个东西,那不妨从d...

flashsim源码阅读笔记2

好久没用过c语言,想起来c语言都需要一个main函数,所以找找main在哪先。 功夫不负有心人呐,经过一分钟的努力,终于发现main函数并不在disksim.c,而是在disksim_mai...

flashsim配置2015最新版本

flashsim安装2015最新教程,flashsim下载百度网盘地址

SSDsim源码分析之get_ppn_for_pre_process

get_ppn_for_pre_process()介绍 前面我们介绍了SSDsim的读请求预处理函数,其功能就是将IOtrace文件中的所有IO读请求先预先处理,整体上的功能和过程就是为了模拟经过一...

FlashSim配置流程详细

FlashSim配置流程详细 作者:kimmy    撰写日期:2011-10-25        最近做SSD方面的实验,需要用到SSD模拟器FlashSim。因网上几乎难以找到其配置过程的详细...

flashsim源码阅读笔记3

首先有一点就是,Flashsim和Disksim的关系按照我认为是插件的关系。 然后Flashsim是PSU的,于是根据版权信息分出来几个PSU的c文件,当然也可以按照同样地方法去区分一下h文件 ...

SSDsim源码分析之initiation

SSDsim之initiation本文继续介绍SSDsim中有关的代码解析和注解: SSDsim之initiation initiation函数的主要功能 initiation函数的调用关系图 in...

SSDsim源码分析之Buffer_management()

Buffer_management()也就是缓存管理函数,这个是核心函数模块之一,其主要模拟数据缓存层cache的功能。但是在SSDsim中,所谓的缓存其实主要就是一个写buffer,主要优先为写操作...

SSDsim源码分析之find_nearest_event()

SSDsim源码分析之find_nearest_event()在介绍find_nearest_event()函数之前,我们很有必要了解下关于SSDsim的一些必要的模拟驱动原理:SSDsim模拟驱动原...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)