SSDsim源码分析之main
由于研究论⽂的选题定在了ssd的能耗存储优化上,所以就顺便写⼀些博客⽂章,主要的先介绍⼀下ssdsim这个开源⼯具的⼀些内容以及基本的知识:
SSDsim介绍
SSDsim是⼀款固态硬盘的模拟仿真软件,它提供了⼀系列强⼤的前期功能验证⼿段并且可以较为准确地对真实SSD固态硬盘嵌⼊式硬件设备进⾏⼀个仿真模拟,所以可以有效地模拟硬件结构以及软件算法的有效性。最⼤的特点就是可塑⾃由性极⾼,可以通过特定的输⼊参数⽂件检测特定的SSD进⾏⼀系列实验。这款开源软件是由华中科技⼤学的胡洋博⼠开发并且经过了不断改良的开源项⽬,下载⽹址是在之中,并且有配套的⽤户说明⼿册;这⾥也借鉴了⼀些⽤户⼿册中的知识。
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的操作特性也与HDD有着巨⼤的差别,最显著的主要有:
读和写操作都是以页page为基本单位
如果page是vaild或者unvaild状态则写操作是不可以覆盖写,必须先擦除后才能进⾏写操作
擦除操作是以块为基本单位的
其他的基本特性会在其他博⽂中⼀⼀详细介绍,以上三点操作特性的具体原理和原因也会详细说明;
主体功能
SSDsim主要实现了对固态盘的软硬件系统环境的模拟仿真;运⾏于SSDsim之上的软件算法与真实SSD的系统软件的基本误差很⼩。⽽SSD的硬件系统主要是由多个通道,通道下的多个芯⽚,芯⽚下多个晶圆,晶圆下多个闪存⽚,闪存⽚下多个闪存块,闪存块下多个闪存页这样的⼀种并⾏多层级架构,所以这个SSDsim也⽤了⼀个极其庞⼤的结构体组来对这个并⾏多层级架构进⾏了⼀个模拟,具体可以看下图的结构体关系图:
关于这些结构体的详细介绍以及在这个SSDsim中的作⽤会在后续的博⽂中⼀⼀结合源码展开。
SSDsim的主体功能主要是提供了对能耗和时间的模拟,具体的实现原理要根据源码分模块进⾏分析。
fprintf格式
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()这三个⼤模块。后续将会将重点解析放在这三部分之中。
后续总结
第⼀次写博客,难免有些杂乱⽆章⽽且⽔准不够,不过这是⼀个再学习的过程,需要⾃⼰继续坚持!
好好加油!接下来就是继续分析源码并且总结整个SSDsim还有SSD相关的⼀些知识点!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。