SSDsim源码分析之main

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

    • SSDsim介绍
    • SSD基本概念介绍
    • 主体功能
    • main函数解析
    • 后续总结


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的基本结构图示如下:
SSDsim源码分析之main_第1张图片

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

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

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

主体功能

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

关于这些结构体的详细介绍以及在这个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;iparameter->channel_number;i++)
    {
        for (j=0;jparameter->die_chip;j++)
        {
            for (k=0;kparameter->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()这三个大模块。后续将会将重点解析放在这三部分之中。

SSDsim源码分析之main_第3张图片

后续总结

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

你可能感兴趣的:(SSDsim)