How to access kernel memory from user space

Ian Lepore freebsd at damnhippie.dyndns.org
Wed Feb 22 19:15:45 UTC 2012


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 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to "freebsd-hackers-unsubscribe at 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




More information about the freebsd-hackers mailing list