今天主要看的是上层的代码逻辑,不深究具体的变量赋值。
initFlash()
函数:
主函数main
里面的initFlash()
函数里面根据全局变量ftl_type
的类型选择了FTL类型操作读写函数flt_op
指针。Ftl_type
是在一开始的ssd_interface.h
头文件定义,但是在ssd_interface.c
中直接可以修改值,选择要仿真的FTL算法。initFlash()
函数里面调用的nand_init()
是对底层的flash
块初始化,nand_stat_reset()
函数只是对flash
块操作记录的重置,并不是对flash
块的内容作修改。若对nand的操作进一步深究,则是阅读flash.c
和flash.h
文件的内容。
warmFlash()
函数:
是一个预热函数,因为我们做实验的时候希望试验环境能模拟最真实的情况,以我们并不想每次在做实验的时候,trace 数据都是跑在一个全新的 SSD 上面。这个时候我们可以在真实实验之前给 SSD 做一次 warm up,也就是用一些 trace 先让 SSD 跑一会,然后再运行我们需要测试的 trace 文件。单纯做仿真不需要深究,只是需要知道其接口输入的参数是预热trace文件名。
下面开始的是disksim_run_simulation()
函数,也就是总体仿真的函数。
Disksim_run_simulation
函数在Disksim.c
函数中定义,输入参数无,返回类型void
该函数判断disksim
结构体中的stop_sim
来反复执行调用disksim_simulate_event()
函数,这里给出截取代码段:
void disksim_run_simulation ()
{
int event_count = 0;
while (disksim->stop_sim == FALSE) {
disksim_simulate_event(event_count);
event_count++;
}
}
下面进入disksim_simulate_event()
函数,这个函数输入参数是int类型的event_count,该函数,该函数也在disksim.c
中定义。对这个函数咱一步步阅读,先给出这个函数的完整代码:
void disksim_simulate_event (int num)
{
event *curr;
if ((curr = getnextevent()) == NULL) {
disksim_simstop ();
}
else {
switch(disksim->trace_mode) {
case DISKSIM_NONE:
case DISKSIM_MASTER:
// fprintf(outputfile,