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>