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

📄 memstatdump.c

📁 一个用在mips体系结构中的操作系统
💻 C
字号:
/* * Copyright (C) 1996-1998 by the Board of Trustees *    of Leland Stanford Junior University. *  * This file is part of the SimOS distribution.  * See LICENSE file for terms of the license.  * *//***************************************************************** * memstatdump.c  *  * reads the detail output files into something that is perl-able *  * Author: bugnion  * Date: nov. 94 -... *  * Disclaimer: this is the grossest code ever written. Although it * does the job, I am sometimes not quite sure how and mainly what * possessed it to evolve in this direction, independently of my * will. * *******************************************************************/#include <sys/types.h>#include <unistd.h>#include <fcntl.h> #include <stdio.h>#include <stddef.h>#include <string.h>#ifdef __alpha#include <string.h>#else#include <bstring.h>#endif#include <malloc.h>#include "memstatdump.h"struct Context{	int fd;	VA addr;	int remaining;	int eof;};static void GetNextBucket( struct Context *cnt,uint *bucket);static void CalcDiff(uint *buck1,uint *buck2, uint *buck3);  int fd;VA simRecHighRes;VA simRecLowRes;int numCPUs;SimRecHeader msHeader;static int GetLog2(long x);#ifdef __alphaint VASizeLog2 = 44;#elseint VASizeLog2 = 32;#endifint MemStatFileOpen(char *filename){  char *fieldNames;  char *start,*end;  int count=0;  fd = open(filename,O_RDONLY,0);  if( fd < 0 ) {    return fd;  }  if( read(fd,(char *) &msHeader,sizeof(msHeader))!=(int)sizeof(msHeader)) {    fprintf(stderr,"read failed -bailing \n");    exit(1);  }  if( msHeader.magic != SIMREC_MAGIC ) {    	fprintf(stderr,"wrong magic number!\n");        exit(1);  }  if (msHeader.version< 6) {     fprintf(stderr,"wrong version number %d. Expecting 6 or greater \n",             msHeader.version);     exit(1);  }         fieldNames = (char *)malloc(msHeader.fieldNamesLen);  if (read(fd,fieldNames,msHeader.fieldNamesLen)!=msHeader.fieldNamesLen) {     fprintf(stderr,"read failed -bailing \n");     exit(1);  }     simRecHighRes = msHeader.highRes;  simRecLowRes = msHeader.lowRes;  if (1) {    fprintf(stderr,"MemStat file: ");    fprintf(stderr,"version=%i name=%s ",	   msHeader.version,msHeader.tableName);    fprintf(stderr,"  highRes=0x%lx lowRes=0x%lx fieldSize=%i bucketSize=%i\n",            msHeader.highRes,            msHeader.lowRes,msHeader.entrySize,msHeader.bucketSize);        start = fieldNames;    while (1) {       end = start;       while (*end && *end != ',') {          end++;       }       if (!(*end)) {          end = 0;       } else {           *end = '\0';       }       printf("FIELD %d %s\n",count,start);       if (!end) { break;}       start = end+1;       count++;    }  }  return fd;}void MemStatFileIterate( void (*process)(VA,void *,Resolution)){   char bucket[1024];  VA a;  long rd,i,numChunks;  int startEnd[2];  Resolution resolution;  numChunks = 1<<(VASizeLog2 - GetLog2(msHeader.lowRes)) ;  /* lowRes */  resolution = Low;  for(a=0;a<numChunks;++a) {    if( read(fd,bucket,msHeader.bucketSize)!=msHeader.bucketSize) {      	   fprintf(stderr,"read failed at lowRes\n");	   exit(1);	 }    process(a*msHeader.lowRes,bucket,resolution);  }  /* out of range */  if( read(fd,bucket,(uint)msHeader.bucketSize)!=msHeader.bucketSize) {     fprintf(stderr,"read failed at lowRes\n");     process(0,bucket,resolution);     exit(1);  }  process(0,bucket,resolution);  /* highRes and detailRes*/  while(( rd = read(fd,startEnd,8))==8 ) {    if( !startEnd[0] && !startEnd[1] )  /* end of High Res Area */      break;    if( startEnd[1] < 0 ) {    /* detail resolution */             resolution = Detail;      startEnd[1] *= -1;    } else      resolution = High;        for(a=0;a<(VA)startEnd[1];++a) {      rd = read(fd,bucket,(uint)msHeader.bucketSize);      if( rd != msHeader.bucketSize ) {	fprintf(stderr,"read failed at %08x %i out of %i\n",startEnd[0],		a,startEnd[1]);      }      for(i=0;i<msHeader.bucketSize;++i)		if( bucket[i] )		  break;      if( i !=msHeader.bucketSize ) {		if( resolution==High )		  process((VA)startEnd[0]+a*simRecHighRes,bucket,resolution);		else		  process((VA)startEnd[0]+a*4,bucket,resolution);      }      }  }  close(fd);}void MemStatDiff(char *file1, char *file2,char *file3){  char tableName1[24];  struct Context cnt1,cnt2;  int out[2],i;  long numChunks;  uint b1[1024];  uint b2[1024];  uint b3[1024];  struct SimRecHeader hdr;  if( MemStatFileOpen(file1)<0 ) {	fprintf(stderr,"could not open %s\n",file1);	return;  }  cnt1.fd = fd;  if( MemStatFileOpen(file2)<0) {	fprintf(stderr,"could not open %s\n",file2);	return;  }  cnt2.fd = fd;  fd = open(file3, O_RDWR|O_CREAT|O_TRUNC, 0666);  if (fd < 0) {	printf("Error in MemStatDiff\n");	return;  }  /* for now, assume full compatibility */  cnt1.eof = 0;  cnt2.eof = 0;  cnt1.remaining = 0;  cnt2.remaining = 0;  hdr.magic = SIMREC_MAGIC;  hdr.version = 2;  strncpy(hdr.tableName, tableName1, sizeof(hdr.tableName)-1);  hdr.addrStart = 0;  hdr.lowRes = simRecLowRes;  hdr.highRes = simRecHighRes;  hdr.bucketSize = msHeader.bucketSize;  numChunks = 1<<(VASizeLog2 - GetLog2(msHeader.lowRes)) ;  if (write(fd, (char *) &hdr, sizeof(hdr)) != sizeof(hdr)) 	goto err;  /* lowRes bucket  + out of bounds bucket */  for( i=0;i<numChunks+ 1;++i) {	if( read(cnt1.fd,b1,msHeader.bucketSize)!=msHeader.bucketSize)	  goto err;	if( read(cnt2.fd,b2,msHeader.bucketSize) != msHeader.bucketSize) 	  goto err;	CalcDiff(b1,b2,b3);	if( write(fd,b3,msHeader.bucketSize) != msHeader.bucketSize)	  goto err;  }  GetNextBucket(&cnt1,b1);  GetNextBucket(&cnt2,b2);  while( !cnt2.eof ) {	while( !cnt2.eof && (cnt1.eof || cnt1.addr > cnt2.addr) ) {/*	  printf("writing %08x %08x\n",cnt1.addr,cnt2.addr);  */	  out[0] = cnt2.addr;	  out[1] = (cnt2.remaining < 0 ? -1 : 1);	  if( write(fd,out,8) !=8)		goto err;	  if( write(fd,b2,msHeader.bucketSize) != msHeader.bucketSize)		goto err;	  GetNextBucket(&cnt2,b2);	}	if( (!cnt1.eof) && (!cnt2.eof) ) {	  if( cnt1.addr != cnt2.addr )		printf("Address mismatch\n");	  CalcDiff(b1,b2,b3);	  out[0] = cnt2.addr;	  out[1] = (cnt2.remaining < 0 ? -1 : 1);/*	  printf("writing %08x %08x\n",cnt1.addr,cnt2.addr); */	  if( write(fd,out,8) !=8)		goto err;	  if( write(fd,b3,msHeader.bucketSize) != msHeader.bucketSize)		goto err;	  GetNextBucket(&cnt1,b1);	  GetNextBucket(&cnt2,b2);	}  }  out[0] = 0;  out[1] = 0;  if( write(fd,out,8)!=8)	goto err;  close(fd);  close(cnt1.fd);  close(cnt2.fd);  return;  err:  printf("Errro in MemStatDiff");}intGetLineFromFile(FILE * f, char *buffer, int bufsize){    int i;    int n;     for (i = 0; i < bufsize-1; i++) {	   n = fgetc(f);	   if (n ==EOF) {		  return 0;	   }	   buffer[i] = n;	   if (n == '\n') break;    }    buffer[i] = '\000';    return i+1;}static voidGetNextBucket(struct Context *cnt, uint *bucket){  if( cnt->eof )	printf("EOF, %i\n",cnt->fd);  if( cnt->remaining > 0 )	--cnt->remaining;  if( cnt->remaining < 0 )	++cnt->remaining;  if( !cnt->remaining ) {	if( read(cnt->fd,&cnt->addr,8)!=8)	  goto err;	if( !cnt->addr) {	  cnt->eof = 1;	  return;	}  } else {	if( cnt->remaining < 0 )	  cnt->addr += 4;	else	  cnt->addr += simRecHighRes;  }/*  printf("Getting %08x for %i\n",cnt->addr,cnt->fd); */  if( read(cnt->fd,bucket,msHeader.bucketSize)!=msHeader.bucketSize)	goto err;  return;err:  printf("Error Getnextbucket %08x %i\n",cnt->addr,cnt->fd);  exit(1);} 	 static void CalcDiff(uint *buck1,uint *buck2, uint *buck3){    fprintf(stderr,"calcdiff not implemented \n");}static int GetLog2(long x){   long i;   int r=0;   for(i=1;i<x;i*=2)      r++;   if( i !=  x ) {       fprintf(stderr,"Error: GetLog2(%i) is undefined \n",x);      exit(1);   }   return r;}

⌨️ 快捷键说明

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