⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 layout_g1.c

📁 目前最精确的磁盘模拟器的第3版
💻 C
📖 第 1 页 / 共 4 页
字号:
  blkspercyl = b->blkspertrack * d->dm_surfaces;  blksperrange = blkspercyl * l->rangesize;  lbnsperrange = blksperrange - b->sparecnt;  rangeno = lbn / lbnsperrange;  lbn = lbn % lbnsperrange;  if ((maptype == MAP_ADDSLIPS) || (maptype == MAP_FULL)) {    firstblkinrange = rangeno * blksperrange;    for (i=0; i<b->numslips; i++) {      if ((b->slip[i] >= firstblkinrange) && 	  ((b->slip[i] - firstblkinrange) <= (lbn+slips))) {	slips++;      }    }  }  lbn += slips;  if (maptype == MAP_FULL) {    for (i=0; i<b->numdefects; i++) {      if ((b->defect[i] == (firstblkinrange + lbn)) && 	  (b->remap[i] != b->defect[i])) {	// XXX global/remapsetor	if(remapsector) *remapsector = 1;	lbn = b->remap[i];	lbn = lbn % blksperrange;	break;      }    }  }    result->cyl = b->startcyl +     (rangeno * l->rangesize) + (lbn / blkspercyl);  result->head = (lbn % blkspercyl) / b->blkspertrack;  result->head = g1_surfno_on_cyl(l,b,result);  result->sector = lbn % b->blkspertrack;  return DM_OK;}static dm_ptol_result_tg1_ltop_sectperzonespare(struct dm_disk_if *d, 			 int lbn, 			 dm_layout_maptype maptype,			 struct dm_pbn *result,			 int *remapsector){  int i;  int blkspercyl;  int slips = 0;  struct dm_layout_g1 *l = (struct dm_layout_g1 *)d->layout;  struct dm_layout_g1_band *b = find_band_lbn(l, lbn);  lbn -= l->band_blknos[b->num];  lbn += b->deadspace;  if ((maptype == MAP_ADDSLIPS) || (maptype == MAP_FULL)) {    for (i=0; i<b->numslips; i++) {      if (b->slip[i] <= (lbn+slips)) {	slips++;      }    }  }  lbn += slips;  if (maptype == MAP_FULL) {    for (i=0; i<b->numdefects; i++) {      if ((b->defect[i] == lbn) && 	  (b->remap[i] != b->defect[i])) {	if(remapsector) *remapsector = 1;	lbn = b->remap[i];	break;      }    }  }  blkspercyl = b->blkspertrack * d->dm_surfaces;  result->cyl = b->startcyl + lbn / blkspercyl;  result->head = (lbn % blkspercyl) / b->blkspertrack;  result->head = g1_surfno_on_cyl(l,b,result);  result->sector = lbn % b->blkspertrack;  return DM_OK;}/* * NOTE: The total number of allowable slips and remaps per band is * equal to the number of spare tracks per band.  The following code * will produce incorrect results if this rule is violated.  To fix * this, b needs to be re-calculated after the detection of a * slip or spare.  Also, slips on immediately previous bands need to * be accounted for.  Lastly, the mismatch in sectors per track * between zones must be handled.   * Extremely low priority.   */static dm_ptol_result_tg1_ltop_trackspare(struct dm_disk_if *d, 		   int lbn, 		   dm_layout_maptype maptype,		   struct dm_pbn *result, 		   int *remapsector){  int i;  int blkspertrack;  int trackno;  struct dm_layout_g1 *l = (struct dm_layout_g1 *)d->layout;  struct dm_layout_g1_band *b = find_band_lbn(l, lbn);  lbn -= l->band_blknos[b->num];  lbn += b->deadspace;  blkspertrack = b->blkspertrack;  trackno = lbn/blkspertrack;  if ((maptype == MAP_ADDSLIPS) || (maptype == MAP_FULL)) {    for (i=0; i<b->numslips; i++) {      if (b->slip[i] <= trackno) {	trackno++;      }    }  }  if (maptype == MAP_FULL) {    for (i=0; i<b->numdefects; i++) {      if (b->defect[i] == trackno) {	trackno = b->remap[i];	break;      }    }  }  result->cyl = (trackno/d->dm_surfaces) + b->startcyl;  result->head = trackno % d->dm_surfaces;  result->head = g1_surfno_on_cyl(l,b,result);  result->sector = lbn % blkspertrack;  return DM_OK;}static dm_ptol_result_tg1_seek_distance(struct dm_disk_if *d,		 int start_lbn,		 int end_lbn){  struct dm_pbn p1, p2;  int rv;  rv = d->layout->dm_translate_ltop(d, start_lbn, MAP_NONE, &p1, 0);  if(rv != DM_OK) {    return rv;  }  rv = d->layout->dm_translate_ltop(d, end_lbn, MAP_NONE, &p2, 0);  if(rv != DM_OK) {    return rv;  }    return abs(p2.cyl - p1.cyl);}static dm_angle_tg1_get_sector_width(struct dm_disk_if *d,		    struct dm_pbn *track,		    int num){  struct dm_layout_g1 *l = (struct dm_layout_g1 *)d->layout;  struct dm_layout_g1_band *b = find_band_pbn(l, track);  dm_angle_t result;  if(num > b->blkspertrack) {    return 0;  }  result = b->sector_width;  result *=  num;  return result;}static dm_angle_tg1_lbn_offset(struct dm_disk_if *d, int lbn1, int lbn2){  struct dm_pbn pbn1, pbn2;  dm_angle_t a1, a2;  struct dm_layout_g1 *l = (struct dm_layout_g1 *)d->layout;  struct dm_layout_g1_band *b1 = find_band_lbn(l, lbn1);  struct dm_layout_g1_band *b2 = find_band_lbn(l, lbn2);    d->layout->dm_translate_ltop(d, lbn1, MAP_FULL, &pbn1, 0);  d->layout->dm_translate_ltop(d, lbn2, MAP_FULL, &pbn2, 0);  a1 = d->layout->dm_pbn_skew(d, &pbn1);  a2 = d->layout->dm_pbn_skew(d, &pbn2);  return a2 - a1;}int layout_g1_marshalled_len(struct dm_disk_if *d) {  int c;  struct dm_layout_g1 *l = (struct dm_layout_g1 *)d->layout;  int result = sizeof(struct dm_marshall_hdr) + sizeof(struct dm_layout_g1);   // band blknos  result += l->bands_len * sizeof(int);  // add the zones  result += l->bands_len * sizeof(struct dm_layout_g1_band);  for(c = 0; c < l->bands_len; c++) {    struct dm_layout_g1_band *b = &l->bands[c];    result += b->numslips * sizeof(int);    // defects and remapped locations    result += b->numdefects * 2 * sizeof(int);  }    return result;}void *layout_g1_marshall(struct dm_disk_if *d, char *buff) {  int c;  struct dm_layout_g1 *l = (struct dm_layout_g1 *)d->layout;  char *ptr = buff;  struct dm_marshall_hdr *hdr = (struct dm_marshall_hdr *)buff;  hdr->type = DM_LAYOUT_G1_TYP;  hdr->len = layout_g1_marshalled_len(d);    ptr += sizeof(struct dm_marshall_hdr);  memcpy(ptr, d->layout, sizeof(struct dm_layout_g1));  // fix function pointers here  marshall_fns((void **)&l->hdr, 	       sizeof(l->hdr) / sizeof(void *),	       ptr,	       DM_LAYOUT_G1_TYP);  ptr += sizeof(struct dm_layout_g1);   // now do the zones  for(c = 0; c < l->bands_len; c++) {    struct dm_layout_g1_band *b = &l->bands[c];    memcpy(ptr, b, sizeof(struct dm_layout_g1_band));    ptr += sizeof(struct dm_layout_g1_band);    // slips    memcpy(ptr, b->slip, b->numslips * sizeof(int));    ptr += b->numslips * sizeof(int);    // defect locations    memcpy(ptr, b->defect, b->numdefects * sizeof(int));    ptr += b->numdefects * sizeof(int);    // defect remaps    memcpy(ptr, b->remap, b->numdefects * sizeof(int));    ptr += b->numdefects * sizeof(int);  }  // do the band blknos array  memcpy(ptr, l->band_blknos, l->bands_len * sizeof(int));  ptr += l->bands_len * sizeof(int);  return ptr;}char *layout_g1_unmarshall(struct dm_marshall_hdr *hdr, 		     void **result,		     void *parent){  int c;  struct dm_layout_g1 *l = malloc(sizeof(struct dm_layout_g1));  char *ptr = (char *)hdr;    ddbg_assert(hdr->type = DM_LAYOUT_G1_TYP);    ptr += sizeof(struct dm_marshall_hdr);  memcpy(l, ptr, sizeof(struct dm_layout_g1));  unmarshall_fns((void **)&l->hdr,		 sizeof(l->hdr) / sizeof(void*),		 ptr,		 DM_LAYOUT_G1_TYP);  ptr += sizeof(struct dm_layout_g1);    l->bands = malloc(l->bands_len * sizeof(struct dm_layout_g1_band));  // now do the zones  for(c = 0; c < l->bands_len; c++) {    struct dm_layout_g1_band *b = &l->bands[c];    memcpy(b, ptr, sizeof(struct dm_layout_g1_band));    ptr += sizeof(struct dm_layout_g1_band);    // slips    if(b->numslips != 0) {      b->slip = malloc(b->numslips * sizeof(int));      memcpy(b->slip, ptr, b->numslips * sizeof(int));      ptr += b->numslips * sizeof(int);    }    // defect locations    if(b->numdefects != 0) {      b->defect = malloc(b->numdefects * sizeof(int));      memcpy(b->defect, ptr, b->numdefects * sizeof(int));      ptr += b->numdefects * sizeof(int);      // defect remaps      b->remap = malloc(b->numdefects * sizeof(int));      memcpy(b->remap, ptr, b->numdefects * sizeof(int));      ptr += b->numdefects * sizeof(int);    }  }  // do the band blknos array  l->band_blknos = malloc(l->bands_len * sizeof(int));  memcpy(l->band_blknos, ptr, l->bands_len * sizeof(int));  ptr += l->bands_len * sizeof(int);  l->disk = parent;  *result = l;  return ptr;}void *layout_g1_fns[] = {  g1_ltop_sectperzonespare,  g1_ptol_sectperzonespare,  g1_st_lbn,  g1_st_pbn,  g1_track_boundaries_sectperzonespare,  g1_seek_distance,  g1_map_pbn_skew,  g1_get_track_0l,  g1_convert_ptoa,  g1_convert_atop,  g1_get_sector_width,  layout_g1_marshalled_len,  layout_g1_marshall,  g1_lbn_offset,  g1_ltop_0t,  g1_ptol_0t};struct dm_marshall_module dm_layout_g1_marshall_mod ={   layout_g1_unmarshall,   layout_g1_fns,   sizeof(layout_g1_fns) / sizeof(void *) };// instances of interface struct for the various sparing schemesstruct dm_layout_if g1_layout_nosparing = {  g1_ltop_nosparing,  g1_ltop_0t,  g1_ptol_nosparing,  g1_ptol_0t,  g1_st_lbn,  g1_st_pbn,  g1_track_boundaries_nosparing,  g1_seek_distance,  g1_map_pbn_skew,  g1_get_track_0l,  g1_convert_ptoa, // ptoa  g1_convert_atop, // atop  g1_get_sector_width,  g1_lbn_offset,  layout_g1_marshalled_len,  layout_g1_marshall};struct dm_layout_if g1_layout_tracksparing = {  g1_ltop_trackspare,  g1_ltop_0t,  g1_ptol_trackspare,  g1_ptol_0t,  g1_st_lbn,  g1_st_pbn,  g1_track_boundaries_trackspare,  g1_seek_distance,  g1_map_pbn_skew,  g1_get_track_0l,  g1_convert_ptoa, // ptoa  g1_convert_atop, // atop  g1_get_sector_width,  g1_lbn_offset,  layout_g1_marshalled_len,  layout_g1_marshall};struct dm_layout_if g1_layout_sectpertrackspare = {  g1_ltop_sectpertrackspare,  g1_ltop_0t,  g1_ptol_sectpertrackspare,  g1_ptol_0t,  g1_st_lbn,  g1_st_pbn,  g1_track_boundaries_sectpertrackspare,  g1_seek_distance,  g1_map_pbn_skew,  g1_get_track_0l,  g1_convert_ptoa, // ptoa  g1_convert_atop, // atop  g1_get_sector_width,  g1_lbn_offset,  layout_g1_marshalled_len,  layout_g1_marshall};struct dm_layout_if g1_layout_sectpercylspare = {  g1_ltop_sectpercylspare,  g1_ltop_0t,  g1_ptol_sectpercylspare,  g1_ptol_0t,  g1_st_lbn,  g1_st_pbn,  g1_track_boundaries_sectpercylspare,  g1_seek_distance,  g1_map_pbn_skew,  g1_get_track_0l,  g1_convert_ptoa, // ptoa  g1_convert_atop, // atop  g1_get_sector_width,  g1_lbn_offset,  layout_g1_marshalled_len,  layout_g1_marshall};struct dm_layout_if g1_layout_sectperrangespare = {  g1_ltop_sectperrangespare,  g1_ltop_0t,  g1_ptol_sectperrangespare,  g1_ptol_0t,  g1_st_lbn,  g1_st_pbn,  g1_track_boundaries_sectperrangespare,  g1_seek_distance,  g1_map_pbn_skew,  g1_get_track_0l,  g1_convert_ptoa,  // ptoa  g1_convert_atop,  // atop  g1_get_sector_width,  g1_lbn_offset,  layout_g1_marshalled_len,  layout_g1_marshall};struct dm_layout_if g1_layout_sectperzonespare = {  g1_ltop_sectperzonespare,  g1_ltop_0t,  g1_ptol_sectperzonespare,  g1_ptol_0t,  g1_st_lbn,  g1_st_pbn,  g1_track_boundaries_sectperzonespare,  g1_seek_distance,  g1_map_pbn_skew,  g1_get_track_0l,  g1_convert_ptoa, // ptoa  g1_convert_atop,  // atop  g1_get_sector_width,  g1_lbn_offset,  layout_g1_marshalled_len,  layout_g1_marshall};//// here lies various random crap from disksim// static void bandcopy(struct dm_layout_g1_band **destbands, 		     struct dm_layout_g1_band *srcbands, 		     int numbands){   int i;   *destbands = malloc(numbands * sizeof(struct dm_layout_g1_band));   memcpy(*destbands,srcbands,sizeof(struct dm_layout_g1_band));   for (i=0; i<numbands; i++) {      (*destbands)[i].slip = malloc (srcbands[i].numslips * sizeof(int));      (*destbands)[i].defect = malloc (srcbands[i].numdefects * sizeof(int));      (*destbands)[i].remap = malloc (srcbands[i].numdefects * sizeof(int));      memcpy((*destbands)[i].slip, 	     srcbands[i].slip, 	     srcbands[i].numslips * sizeof(int));      memcpy((*destbands)[i].defect, 	     srcbands[i].defect, 	     srcbands[i].numdefects * sizeof(int));      memcpy((*destbands)[i].remap, 	     srcbands[i].remap, 	     srcbands[i].numdefects * sizeof(int));   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -