home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / comp / sys / sgi / 19158 < prev    next >
Encoding:
Text File  |  1993-01-28  |  2.5 KB  |  95 lines

  1. Path: sparky!uunet!math.fu-berlin.de!uni-paderborn.de!uni-paderborn.de!klin
  2. From: klin@iat.uni-paderborn.de (Peter Klingebiel)
  3. Newsgroups: comp.sys.sgi
  4. Subject: HELP: Kernel values on IRIX 4.0.5
  5. Date: 27 Jan 1993 15:23:42 GMT
  6. Organization: Uni-GH Paderborn, Germany
  7. Lines: 81
  8. Sender: klin@uni-paderborn.de (Peter Klingebiel)
  9. Distribution: world
  10. Message-ID: <1k69duINN7c@news.uni-paderborn.de>
  11. NNTP-Posting-Host: mlap-ws7.uni-paderborn.de
  12. Keywords: nlist
  13.  
  14. Hi,
  15.  
  16. On a SGI Indigo R4000 running IRIX 4.0.5 I'm trying to read some kernel
  17. values (physmem, freemem, and sysinfo), but this fails. I use the following
  18. C program to read these kernel variables:
  19.  
  20. #include <stdio.h>
  21. #include <sys/types.h>
  22. #include <sys/param.h>
  23. #include <nlist.h>
  24. #include <unistd.h>
  25. #include <sys/sysinfo.h>
  26.  
  27. #define UNIX    "/unix"
  28. #define KMEM    "/dev/kmem"
  29.  
  30. static struct nlist nl[]  = {
  31. #define SYSINFO 0
  32.   { "sysinfo", 0L, 0, 0 },
  33. #define PHYSMEM 1
  34.   { "physmem", 0L, 0, 0 },
  35. #define FREEMEM 2
  36.   { "freemem", 0L, 0, 0 },
  37.   { NULL, 0L, 0, 0 }
  38. };
  39.  
  40. int kmem;
  41. struct sysinfo oldinfo;
  42. int physmem, freemem;
  43.  
  44. main()
  45. {
  46.   off_t o;
  47.   int n;
  48.  
  49.   if((kmem = open(KMEM, 0)) < 0)
  50.     perror("kmem error");
  51.   if(nlist(UNIX, nl) < 0)
  52.     perror("nlist error");
  53.  
  54.   printf("sysinfo=%lx\n", nl[SYSINFO].n_value);
  55.   printf("physmem=%lx\n", nl[PHYSMEM].n_value);
  56.   printf("freemem=%lx\n", nl[FREEMEM].n_value);
  57.  
  58.   if(nl[SYSINFO].n_value == 0 || nl[PHYSMEM].n_value == 0 || nl[FREEMEM].n_value == 0)
  59.     fprintf(stderr, "data error\n");
  60.  
  61.   if((o = lseek(kmem, (off_t) nl[PHYSMEM].n_value, SEEK_SET)) == (off_t) -1)
  62.     fprintf(stderr, "seek physmem %lx\n", o);
  63.   if((n = read(kmem, &physmem, sizeof(physmem))) != sizeof(physmem))
  64.     fprintf(stderr, "read physmem %d\n", n);
  65.   if((o = lseek(kmem, nl[FREEMEM].n_value, 0)) == (off_t) -1)
  66.     fprintf(stderr, "seek freemem %lx\n", o);
  67.   if((n = read(kmem, &freemem, sizeof(freemem))) != sizeof(freemem))
  68.     fprintf(stderr, "read freemem %d\n", n);
  69.   if((o = lseek(kmem, nl[SYSINFO].n_value, 0)) == (off_t) -1)
  70.     fprintf(stderr, "seek sysinfo %lx\n", o);
  71.   if((n = read(kmem, &oldinfo, sizeof(oldinfo))) != sizeof(oldinfo))
  72.     fprintf(stderr, "read sysinfo %d\n", n);
  73. }
  74.  
  75. The output of the program is as follows:
  76.  
  77.      sysinfo=0
  78.      physmem=88113ec0
  79.      freemem=88113f3c
  80.      data error
  81.      seek physmem ffffffff
  82.      read physmem -1
  83.      seek freemem ffffffff
  84.      read freemem -1
  85.      read sysinfo -1
  86.  
  87. Why this? I'm sure sysinfo is defined in the kernel. Why I can't lseek?
  88. Are the addresses as returned from nlist wrong?
  89.  
  90. Peter Klingebiel
  91. klin@iat.uni-paderborn.de
  92.  
  93.  
  94.  
  95.