DiskSim没有64位版本,即使侥幸编译成功,运行时也会出现段错误。因此需要对源码进行一些修改,才能在64位环境使用,下文总结了在Ubuntu 64bit上编译DiskSim的全过程。

1.安装bison和flex

DiskSim需要bison和flex,如下:

apt-get install bison flex

2.math库的依赖问题

在链接libmems_internals.a时,提示mems_hong_seek.c中的sqrt、acos等引用未定义,这个错误的原因是未链接math库。检查memsmodel/Makefile,发现:

mems_seektest: mems_seektest.o libmems_internals.a$(CC) -o $@ mems_seektest.o $(LDFLAGS) $(CFLAGS) -lmems_internals

其中LDFLAGS变量包含了-lm,应该将$(LDFLAGS)移到-lmems_internals后面。此类错误不止一处,在src/Makefile里定义的LDFLAGS

LDFLAGS = -lm -L. -ldisksim $(DISKMODEL_LDFLAGS) $(MEMSMODEL_LDFLAGS)                             $(LIBPARAM_LDFLAGS) $(LIBDDBG_LDFLAGS)

需要加-lm放到最后。同样的,在dixtrac/Makefile里,LDFAGS的定义

LDFLAGS  = -L. -lm -l$(LIBNAME) -ldxtools         $(LIBDISKSIM_LDFLAGS)         $(MEMSMODEL_LDFLAGS)         $(DISKMODEL_LDFLAGS)         $(LIBPARAM_LDFLAGS)         $(LIBDDBG_LDFLAGS)         $(ST_LDFLAGS)

也需要将-lm放到最后。

3.duplicate case value

这个错误的意思是switch语句里面,两个case使用了相同的值。出错的代码在src/disksim_iosim.c:712,代码很有意思:

StaticAssert (sizeof(ioreq_event) <= DISKSIM_EVENT_SIZE);

而StaticAssert的定义是:

#define StaticAssert(c) switch (c) case 0: case (c):

sizeof(ioreq_event)和DISKSIM_EVENT_SIZE的值可以在编译时获得,当不等式不成立时,c==0导致编译错误。这行代码旨在检测运行环境是否32位。有的解决方法是加上-m32选项,这个选项会将程序按照32位编译,但是我试过之后会遇到其它问题,而且既然不是32位环境,这句判断也就多余,所以我这里将其注释,并且继续按照64位程序进行编译。

4.段错误

到此,程序应该已经编译成功,但是如果尝试运行的话,一定会遇到很多段错误,不信可以运行valid/runvalid试一试。我在一个博客(DiskSim 4.0 - 64bit patch和DiskSim 4.0 + SSD extention : 64bit patch)里找到了解决方案,patch如下:

diff -urN disksim-4.0/diskmodel/layout_g1.c disksim-4.0.x86_64/diskmodel/layout_g1.c--- disksim-4.0/diskmodel/layout_g1.c 2009-12-29 20:56:51.141949420 +0900+++ disksim-4.0.x86_64/diskmodel/layout_g1.c 2009-12-29 19:46:03.834085354 +0900@@ -1939,10 +1939,10 @@      struct dm_layout_zone *result) {   struct dm_layout_g1 *l = (struct dm_layout_g1 *)d->layout;-  struct dm_layout_g1_band *z;+  struct dm_layout_g1_band *z = calloc(sizeof(struct dm_layout_g1_band), 1);

   // check args  -  if(z == 0) { return -1; }+  if(z == NULL) { return -1; }   if(n < 0 || n >= l->bands_len) { return -1; }

   z = &l->bands[n];diff -urN disksim-4.0/diskmodel/layout_g2.c disksim-4.0.x86_64/diskmodel/layout_g2.c--- disksim-4.0/diskmodel/layout_g2.c 2007-01-09 13:58:48.000000000 +0900+++ disksim-4.0.x86_64/diskmodel/layout_g2.c 2009-12-29 19:46:03.835085497 +0900@@ -248,13 +248,13 @@

   // return st for the nearest (lower) zone if this cyl is unmapped   while(!(z = find_zone_pbn(d, &p2)) && p2.cyl >= 0) { p2.cyl--; }-  ddbg_assert(z);+  ddbg_assert(z != NULL);

   return z->st; }

-static void+static dm_ptol_result_t track_boundaries(struct dm_disk_if *d,    struct dm_pbn *p,    int *l1,@@ -283,6 +283,7 @@       *l2 = d->layout->dm_translate_ptol(d, &p2, remapsector);     } while((*l2 == DM_NX) && p2.sector);   }+  return DM_OK; }

 static dm_angle_tdiff -urN disksim-4.0/dixtrac/.paths disksim-4.0.x86_64/dixtrac/.paths--- disksim-4.0/dixtrac/.paths 2009-12-29 20:57:46.518830693 +0900+++ disksim-4.0.x86_64/dixtrac/.paths 2009-12-29 19:46:22.429960003 +0900@@ -39,3 +39,10 @@ export MEMSMODEL_CFLAGS=-I$(MEMSMODEL_INCL) export MEMSMODEL_LDPATH=$(MEMSMODEL_PREFIX)/lib export MEMSMODEL_LDFLAGS=-L$(MEMSMODEL_LDPATH) -lmemsmodel++# path to ssdmodel+export SSDMODEL_PREFIX=../ssdmodel+export SSDMODEL_INCL=$(SSDMODEL_PREFIX)/include+export SSDMODEL_CFLAGS=-I$(SSDMODEL_INCL)+export SSDMODEL_LDPATH=$(SSDMODEL_PREFIX)/lib+export SSDMODEL_LDFLAGS=-L$(SSDMODEL_LDPATH) -lssdmodeldiff -urN disksim-4.0/dixtrac/Makefile disksim-4.0.x86_64/dixtrac/Makefile--- disksim-4.0/dixtrac/Makefile 2008-05-15 15:37:34.000000000 +0900+++ disksim-4.0.x86_64/dixtrac/Makefile 2009-12-29 20:17:39.857941323 +0900@@ -57,13 +57,15 @@  $(LIBDISKSIM_LDFLAGS)   $(MEMSMODEL_LDFLAGS)   $(DISKMODEL_LDFLAGS) + $(SSDMODEL_LDFLAGS)   $(LIBPARAM_LDFLAGS)   $(LIBDDBG_LDFLAGS)   $(ST_LDFLAGS)

 CFLAGS   = -Wall -g -MD -I. $(DEFINES) -I$(STHREADS) $(DMINCLUDES)   $(LIBDISKSIM_CFLAGS) - $(DISKMODEL_CFLAGS) $(LIBPARAM_CFLAGS) $(LIBDDBG_CFLAGS) + $(DISKMODEL_CFLAGS) $(LIBPARAM_CFLAGS) $(LIBDDBG_CFLAGS) + $(SSDMODEL_CFLAGS)

 all: all-redirectdiff -urN disksim-4.0/libparam/myutil.c disksim-4.0.x86_64/libparam/myutil.c--- disksim-4.0/libparam/myutil.c 2008-05-12 07:09:29.000000000 +0900+++ disksim-4.0.x86_64/libparam/myutil.c 2009-12-29 20:23:44.199835151 +0900@@ -150,7 +150,7 @@ {   struct lp_param *result = calloc(1, sizeof(struct lp_param));   result->source_file = source;-  result->name = name;+  result->name = strdup(name);   result->v = v;

diff -urN disksim-4.0/libparam/util.c disksim-4.0.x86_64/libparam/util.c--- disksim-4.0/libparam/util.c 2009-12-29 20:56:51.143862773 +0900+++ disksim-4.0.x86_64/libparam/util.c 2009-12-29 20:34:08.735171314 +0900@@ -47,7 +47,7 @@

 #include 

-//#include +#include 

 #include "libparam.h" #include "bitvector.h"@@ -941,12 +941,15 @@       (*b)[c] = p;       break;     }+    printf("%d: name = %sn", c, (*b)[c]->name);   }-  if(c == *plen) {+  fflush(stdout);+  if(c == *plen) { // BONK     /* didn't find a free slot -- double the array */     int newlen = 2 * (*plen) + 1;-    (*b) = realloc((*b), newlen * sizeof(int *));-    bzero((int *)(*b) + *plen, ((*plen) + 1) * sizeof(int*));+    struct lp_param **new = calloc(newlen, sizeof(struct lp_param *));+    memcpy(new, *b, (*plen) * sizeof(struct lp_param *));+    (*b) = new;     (*b)[(*plen)] = p;     *plen = newlen;   }@@ -986,7 +989,7 @@

   for(c = 0; c < lp_max_mod; c++) {

-    lp_typetbl[c] = malloc(sizeof(struct lp_subtype));+    lp_typetbl[c] = calloc(sizeof(struct lp_subtype),1);     bzero(lp_typetbl[c], sizeof(struct lp_subtype));     lp_typetbl[c]->sub = strdup(lp_modules[c]->name);   }@@ -1395,20 +1398,22 @@   int i;

 #ifndef _WIN32-  if(name[0] == '/')+  if(name[0] == '/'){     if(stat(name, &s))       goto fail;     else       goto succ;+  }

   snprintf(cand, LP_PATH_MAX, "%s/%s", cwd, name);

 #else-  if(name[0] == '\')+  if(name[0] == '\'){     if(stat(name, &s))       goto fail;     else       goto succ;+  }

   if (strcmp(cwd, "") == 0)       cwd = ".";diff -urN disksim-4.0/src/disksim_device.c disksim-4.0.x86_64/src/disksim_device.c--- disksim-4.0/src/disksim_device.c 2009-12-29 20:56:51.145831412 +0900+++ disksim-4.0.x86_64/src/disksim_device.c 2009-12-29 19:46:03.836085835 +0900@@ -143,32 +143,24 @@   /* note that numdisks must be equal to diskinfo->disks_len */   newlen = numdevices ? (2 * numdevices) : 2;   zerocnt = (newlen == 2) ? 2 : (newlen/2);-  disksim->deviceinfo->devicenames = -    realloc(disksim->deviceinfo->devicenames, newlen * sizeof(char *));-  bzero(disksim->deviceinfo->devicenames + c, zerocnt * sizeof(char *));--  devicenos = realloc(devicenos, newlen*sizeof(int));-#ifndef WIN32-  bzero(devicenos + c, zerocnt * sizeof(int));-#else-  bzero(devicenos + c, zerocnt * sizeof(*(devicenos)));-#endif--  devicetypes = realloc(devicetypes, newlen*sizeof(int));-#ifndef WIN32-  bzero(devicetypes + c, zerocnt * sizeof(int));-#else-  bzero(devicetypes + c, zerocnt * sizeof(*(devicetypes)));-#endif--  disksim->deviceinfo->devices = realloc(disksim->deviceinfo->devices, -      newlen*sizeof(int));-#ifndef WIN32-  bzero(disksim->deviceinfo->devices + c, zerocnt * sizeof(int));-#else-  bzero(disksim->deviceinfo->devices + c, zerocnt * sizeof(*(disksim->deviceinfo->devices)));-#endif

+  char **tmpdevname = calloc(newlen, sizeof(char *));+  int *newdevnos    = calloc(newlen, sizeof(int));+  int *newdevtypes  = calloc(newlen, sizeof(int));+  struct deviceheader **newdevs = calloc(newlen, sizeof(struct deviceheader *));++  if (numdevices){+    memcpy(tmpdevname, disksim->deviceinfo->devicenames, numdevices * sizeof(char*));+    memcpy(newdevnos, devicenos, numdevices * sizeof(int));+    memcpy(newdevtypes, devicetypes, numdevices * sizeof(int));+    memcpy(newdevs, disksim->deviceinfo->devices,+    numdevices * sizeof(struct deviceheader *));+  }++  disksim->deviceinfo->devicenames = tmpdevname;+  devicenos = newdevnos;+  devicetypes = newdevtypes;+  disksim->deviceinfo->devices = newdevs;   disksim->deviceinfo->devs_len = newlen;

  foundslot:diff -urN disksim-4.0/src/disksim_global.h disksim-4.0.x86_64/src/disksim_global.h--- disksim-4.0/src/disksim_global.h 2009-12-29 20:56:51.157895353 +0900+++ disksim-4.0.x86_64/src/disksim_global.h 2009-12-29 19:46:03.836085835 +0900@@ -253,7 +253,7 @@    int    temp; } foo;

-#define DISKSIM_EVENT_SIZE 128+#define DISKSIM_EVENT_SIZE 200 #define DISKSIM_EVENT_SPACESIZE (DISKSIM_EVENT_SIZE - sizeof(struct foo))

 typedef struct ev {diff -urN disksim-4.0/src/disksim_iosim.c disksim-4.0.x86_64/src/disksim_iosim.c--- disksim-4.0/src/disksim_iosim.c 2009-12-29 20:56:51.157895353 +0900+++ disksim-4.0.x86_64/src/disksim_iosim.c 2009-12-29 20:34:30.740046410 +0900@@ -353,10 +353,7 @@    slotpath->byte[depth] = (inslotno & 0x0F) | (outslotno << 4); }

----static int iosim_load_map(struct lp_block *b, int n) {+static int iosim_load_map(struct lp_block *b, int64_t n) {   int c;   int i = 0;   char *s = 0; diff -urN disksim-4.0/ssdmodel/include/ssdmodel/ssd.h disksim-4.0.x86_64/ssdmodel/include/ssdmodel/ssd.h--- disksim-4.0/ssdmodel/include/ssdmodel/ssd.h 2008-09-12 14:20:00.000000000 +0900+++ disksim-4.0.x86_64/ssdmodel/include/ssdmodel/ssd.h 2009-12-29 20:24:10.100271314 +0900@@ -127,7 +127,7 @@     int *lba_table;                 // a table mapping the lba to the physical pages                                     // on the chip.

-    char *free_blocks;              // each bit indicates whether a block in the+    unsigned char *free_blocks;              // each bit indicates whether a block in the                                     // ssd_element is free or in use. number of bits                                     // in free_blocks is given by                                     // (struct ssd*)->params.blocks_per_elementdiff -urN disksim-4.0/ssdmodel/ssd.h disksim-4.0.x86_64/ssdmodel/ssd.h--- disksim-4.0/ssdmodel/ssd.h 2008-08-14 19:05:52.000000000 +0900+++ disksim-4.0.x86_64/ssdmodel/ssd.h 2009-12-29 19:46:03.836085835 +0900@@ -127,7 +127,7 @@     int *lba_table;                 // a table mapping the lba to the physical pages                                     // on the chip.

-    char *free_blocks;              // each bit indicates whether a block in the+    unsigned char *free_blocks;              // each bit indicates whether a block in the                                     // ssd_element is free or in use. number of bits                                     // in free_blocks is given by                                     // (struct ssd*)->params.blocks_per_elementdiff -urN disksim-4.0/ssdmodel/ssd_init.c disksim-4.0.x86_64/ssdmodel/ssd_init.c--- disksim-4.0/ssdmodel/ssd_init.c 2008-08-16 14:10:34.000000000 +0900+++ disksim-4.0.x86_64/ssdmodel/ssd_init.c 2009-12-29 20:34:43.724920839 +0900@@ -445,7 +445,7 @@

 void ssd_initialize (void) {-    static print1 = 1;+//    static print1 = 1;    int i, j;

    if (disksim->ssdinfo == NULL) {

patch不是很完善,可手动添加。

现在运行valid/runvalid不会出现段错误了。

转载于:https://www.cnblogs.com/opennaive/p/3312769.html

64位环境编译DiskSim 4.0相关推荐

  1. Hadoop2.2.0伪分布式环境搭建(附:64位下编译Hadoop-2.2.0过程)

    Hadoop2.2.0伪分布式环境搭建: 写在前面:Hadoop2.2.0默认是支持32位的OS,如果想要在64位OS下运行的话,可以通过在64位OS下面编译Hadoop2.2.0来实现,编译的操作步 ...

  2. Windows7 WIN 7 64位 环境编译6sv2.1版本的大气传输模型

    从来没见过Fortran...这次为了添加国产卫星光谱响应的支持,只能从零开始肯了. 6S模型主页:http://6s.ltdri.org/index.html. 下载最新的2015年更新的6SV2. ...

  3. VS 2015 64位CMake编译openCV3.1.0必备文件

    用Cmake编译的时候遇到编译出错,原因是下载两个文件的时候下载时间超出了编译设定的响应时间.然后需要在ippcv和ffmpeg中分别添加下列文件 链接:http://pan.baidu.com/s/ ...

  4. linux cmake 编译64位,cmake编译win下64位obs

    obs是一款开源编码推流工具,简单易用,非常流行. 一次项目中,发现本台式机I3处理器下32位obs推流CPU使用率100%.而使用的第三方设备在64位下,性能较好. 所以需要编译64位obs并且编译 ...

  5. 64位环境0和NULL的区别

    0 & NULL 在C语言中将值为0的指针作为NULL,NULL通常被定义为0或((void *)0); 有很多应该使用NULL的地方写0代替的程序,通常这样的写法也不会发生问题,如: cha ...

  6. oracle连接超时 pb,pb9 在win7 64位环境上连接oracle10g出错

    pb9 在win7 64位环境下连接oracle10g出错我在本机重装了操作系统,操作系统是win7 64位的系统,数据库是oracle 10g,我用plsql.sql plus等连接本机数据库均能正 ...

  7. 在64位Windows中使用64位版本ASP.NET 2.0的问题

    如果你准备使用64位版本的ASP.NET 2.0,在迁移之前你需要考虑一下文章中提到的问题.      经过这几天的努力,终于在测试环境下将博客园的程序迁移到ASP.NET 2.0,迁移的原因之一是博 ...

  8. 64位环境中使用SQL查询excel的方式解决

    --64位环境中使用SQL查询excel的方式 环境: OS:Windows Server 2008 R2 Enterprise MSSQL:Microsoft SQL Server 2008 R2 ...

  9. Ubuntu 10.10(64位)编译Android 2.3

    转载的网址:http://www.linuxidc.com/Linux/2011-03/33564.htm Android编译的时候可能会碰到关于g++或者gcc找不到的问题,这个问题是由于g++-4 ...

最新文章

  1. docker的学习笔记(一)-一些基本的命令的学习
  2. echarts解决自适应图表被压缩问题
  3. 41. 缺失的第一个正数 golang
  4. 常用机器学习算法汇总(中)
  5. MySQL数据导入导出(一)
  6. 【人脸识别】VGGFace2数据集介绍
  7. php mb开启,windows环境下如何为php开启mb_string函数库功能
  8. 什么是ZigBee技术
  9. 仿大众点评下拉菜单完成
  10. 萤火虫小程序_十一爱萌乐园试营业欢乐开启!萤火虫星光夜梦幻来袭!更有…...
  11. 软考网络工程师下午题知识点汇总
  12. 自动化测试ROI计算器
  13. 葵花卫星数据介绍与下载教程
  14. unity材质球复制
  15. 新手做网页设计?这9款经典网页布局设计了解下
  16. javascript - 字符串的操作
  17. 18 禁警告!这个工具教你涂鸦画丁丁,数据还开源了
  18. 机械加工工艺品配件的影响
  19. Ubuntu 16.04 LTS 64位下安装steam游戏平台
  20. 做TopCoder应注意什么

热门文章

  1. 收音机磁棒天线4根接法_无线电科技基础:无声的海上GPS导航 天线接收的方向性...
  2. java sort算法名称_快速排序算法(Quick Sort)(java)
  3. stream测试内存_.net core百万设备连接服务和硬件需求测试
  4. 帧率配置_《骑马与砍杀2》配置探究:CPU显卡怎么搭配达到理想画质和帧数?...
  5. 有关计算机组装的书,计算机组装实习报告书.doc
  6. 今天 CSDN 编辑器的一个惊人的变化
  7. 设计带有SD卡的 MM32F3277 MicroPython 实验板
  8. 讯飞智慧餐厅(全国赛区)比赛通知
  9. 铁路运货的运费与路程远近java_JAVA铁路运货的运费与路程远近及货物的重 – 手机爱问...
  10. mysql 导入8msql文件_MySQL导入大容量SQL文件数据问题