userspace address to bus address

Florian Bauer florian.bauer at
Mon Sep 12 13:45:50 EDT 2011

I'm currently writing my first kernel module, but i got stuck with address
translations. I want my pcie device to access a buffer which was allocated
in userspace (page aligned, currently smaller than one page to ignore
scattering). I tried to translate the userspace address to a bus address
in my ioctrl handler like this:

void __user *data = arg;
get_user_pages(current, current->mm, (unsigned long)data, len/*1*/, 1, 0,
&pages, NULL);
void* kvaddr = kmap(pages[0]);
unsigned long baddr = virt_to_bus(kaddr);

data is page-aligned and was locked in userspace with mlock.
There is some address in baddr, but the device does not write to the
correct location and sometimes causes kernel freezes. Can someone tell me,
what is wrong with this code?TheI device works with a address, that was
received in different way (closed source driver).
I use 32 bit Ubuntu with an 2.6.32 kernel.

More information about the Kernelnewbies mailing list