home *** CD-ROM | disk | FTP | other *** search
- Path: sparky!uunet!math.fu-berlin.de!uni-paderborn.de!uni-paderborn.de!klin
- From: klin@iat.uni-paderborn.de (Peter Klingebiel)
- Newsgroups: comp.sys.sgi
- Subject: HELP: Kernel values on IRIX 4.0.5
- Date: 27 Jan 1993 15:23:42 GMT
- Organization: Uni-GH Paderborn, Germany
- Lines: 81
- Sender: klin@uni-paderborn.de (Peter Klingebiel)
- Distribution: world
- Message-ID: <1k69duINN7c@news.uni-paderborn.de>
- NNTP-Posting-Host: mlap-ws7.uni-paderborn.de
- Keywords: nlist
-
- Hi,
-
- On a SGI Indigo R4000 running IRIX 4.0.5 I'm trying to read some kernel
- values (physmem, freemem, and sysinfo), but this fails. I use the following
- C program to read these kernel variables:
-
- #include <stdio.h>
- #include <sys/types.h>
- #include <sys/param.h>
- #include <nlist.h>
- #include <unistd.h>
- #include <sys/sysinfo.h>
-
- #define UNIX "/unix"
- #define KMEM "/dev/kmem"
-
- static struct nlist nl[] = {
- #define SYSINFO 0
- { "sysinfo", 0L, 0, 0 },
- #define PHYSMEM 1
- { "physmem", 0L, 0, 0 },
- #define FREEMEM 2
- { "freemem", 0L, 0, 0 },
- { NULL, 0L, 0, 0 }
- };
-
- int kmem;
- struct sysinfo oldinfo;
- int physmem, freemem;
-
- main()
- {
- off_t o;
- int n;
-
- if((kmem = open(KMEM, 0)) < 0)
- perror("kmem error");
- if(nlist(UNIX, nl) < 0)
- perror("nlist error");
-
- printf("sysinfo=%lx\n", nl[SYSINFO].n_value);
- printf("physmem=%lx\n", nl[PHYSMEM].n_value);
- printf("freemem=%lx\n", nl[FREEMEM].n_value);
-
- if(nl[SYSINFO].n_value == 0 || nl[PHYSMEM].n_value == 0 || nl[FREEMEM].n_value == 0)
- fprintf(stderr, "data error\n");
-
- if((o = lseek(kmem, (off_t) nl[PHYSMEM].n_value, SEEK_SET)) == (off_t) -1)
- fprintf(stderr, "seek physmem %lx\n", o);
- if((n = read(kmem, &physmem, sizeof(physmem))) != sizeof(physmem))
- fprintf(stderr, "read physmem %d\n", n);
- if((o = lseek(kmem, nl[FREEMEM].n_value, 0)) == (off_t) -1)
- fprintf(stderr, "seek freemem %lx\n", o);
- if((n = read(kmem, &freemem, sizeof(freemem))) != sizeof(freemem))
- fprintf(stderr, "read freemem %d\n", n);
- if((o = lseek(kmem, nl[SYSINFO].n_value, 0)) == (off_t) -1)
- fprintf(stderr, "seek sysinfo %lx\n", o);
- if((n = read(kmem, &oldinfo, sizeof(oldinfo))) != sizeof(oldinfo))
- fprintf(stderr, "read sysinfo %d\n", n);
- }
-
- The output of the program is as follows:
-
- sysinfo=0
- physmem=88113ec0
- freemem=88113f3c
- data error
- seek physmem ffffffff
- read physmem -1
- seek freemem ffffffff
- read freemem -1
- read sysinfo -1
-
- Why this? I'm sure sysinfo is defined in the kernel. Why I can't lseek?
- Are the addresses as returned from nlist wrong?
-
- Peter Klingebiel
- klin@iat.uni-paderborn.de
-
-
-
-