*BSD News Article 4165


Return to BSD News archive

Path: sserve!manuel!munnari.oz.au!mips!mips!darwin.sura.net!zaphod.mps.ohio-state.edu!moe.ksu.ksu.edu!maverick.ksu.ksu.edu!news
From: brtmac@maverick.ksu.ksu.edu (Brett McCoy)
Newsgroups: comp.unix.bsd
Subject: vmmeter and vmtotal structures
Date: 26 Aug 1992 16:01:03 -0500
Organization: Kansas State University
Lines: 69
Message-ID: <17grefINN3qt@maverick.ksu.ksu.edu>
NNTP-Posting-Host: maverick.ksu.ksu.edu

I've been trying to make a program that is similar to vmstat under
SunOS for 386BSD.  However, it appears that the _sum and _total
structures in the kernel are not being used.  All I get are 0's for
all the values in them.  The following program should read the _sum
and _total structures (struct vmmeter and struct vmtotal,
respectively), from the kernel address space.  The hostname read is
just there as a test to make sure that I could actually read something
from kernel memory.  It works successfully.  You have to run this
under gdb if you want to actually see what it reads from the kernel
(who needs printf's anyway).  Am I doing something terribly wrong?
I've done stuff like this with SunOS 4.x and haven't had any problems.
If these structures aren't being used, are there any plans to add
that ability to the kernel?  If not I may tackle it myself, but I
don't want to reinvent the wheel.

++Brett;

compile this with 'gcc -g -o vmstat vmstat.c -lutil'

--- cut here ---
#include <sys/vmmeter.h>
#include <stdio.h>
#include <nlist.h>

extern int errno;
extern char* sys_errlist[];

struct nlist nl[] = {
    {"_sum"},
#define NL_SUM		0
    {"_total"},
#define NL_TOTAL	1
    {"_hostnamelen"},
    {"_hostname"},
    {""}
};

main(int argc, char** argv)
{
    struct vmmeter sum;
    int sum_offset;
    struct vmtotal total;
    int total_offset;
    int len;
    char name[50];

    if (kvm_openfiles(NULL, NULL, NULL) == -1) {
	perror("kvm_openfiles");
	return -1;
    }

    if ((len = kvm_nlist(&nl)) != 0) {
	fprintf(stderr, "Problem with kvm_nlist.\n");
	return -1;
    }
    kvm_read(nl[2].n_value, &len, sizeof(sum));
    kvm_read(nl[3].n_value, &name, len);

    if ((len = kvm_read(nl[NL_SUM].n_value, &sum, sizeof(sum))) <= 0) {
	fprintf(stderr, "Problem reading sum.\n");
	return -1;
    }
    if ((len = kvm_read(nl[NL_TOTAL].n_value, &total, sizeof(total))) <= 0) {
	fprintf(stderr, "Problem reading total.\n");
	return -1;
    }

    kvm_close();
}