Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Feb 2012 12:15:41 -0700
From:      Ian Lepore <freebsd@damnhippie.dyndns.org>
To:        Svetlin Manavski <svetlin.manavski@itrinegy.com>
Cc:        freebsd-hackers@freebsd.org
Subject:   Re: How to access kernel memory from user space
Message-ID:  <1329938141.21804.4.camel@revolution.hippie.lan>
In-Reply-To: <CACRNAiv_huiJuzXHsEKNHdFdnpFuAK7fimjWbVVfmdRth2nVDA@mail.gmail.com>
References:  <CACRNAiv_huiJuzXHsEKNHdFdnpFuAK7fimjWbVVfmdRth2nVDA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 2012-02-22 at 17:24 +0000, Svetlin Manavski wrote:
> Hi all,
> I have a very similar problem as described in this thread back in 2009:
> 
> http://lists.freebsd.org/pipermail/freebsd-hackers/2009-January/027367.html
> 
> I have a kernel module producing networking stats which I need to
> frequently read from the user space. A copy of the data structure would be
> too expensive so I need to access the kernel data directly from the user
> space.
> 
> Unfortunately Alexej's code crashes in the following area:
> 
> vm_map_lookup(&kmem_map, addr, VM_PROT_ALL, &myentry, &myobject, &mypindex,
> &myprot, &mywired); /* OUT */
> vm_map_lookup_done(kmem_map, myentry);
> I am using 64bit FreeBSD 8.2 on Intel Xeon hardware.
> Any idea how to make a stable implementation on my platform?
> 
> Thank you,
> Svetlin
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe@freebsd.org"

I've never done this, but if I needed to, I think the first thing I'd
try is to use an mmap(2) of /dev/kmem to map the memory you need into
userspace (of course your userspace app will need to be running with
root privs to do this).  

That leaves the interesting problem of locating what offset within the
kernel virtual address space you need to map to get at your data.  Two
things come to mind... have your kernel module export the address in a
sysctl (that feels kind of hack-ish but it should be quick and easy to
do), or use libkvm's kvm_nlist() function to locate the symbol within
your module (I think that should be possible; again I've never actually
done any of this).

-- Ian





Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1329938141.21804.4.camel>