Messages in this thread | | | Date | Sun, 23 Oct 2011 05:23:44 -0400 | Subject | Re: copy_*_user | From | Xin Tong <> |
| |
I found that __copy_from_user_ll(void *to, const void __user *from, unsigned long n) eventually calls some asm which use mov and rep on the passed-in to & from pointers. This is in kernel mode and to & from are virtual addresses ? are not the kernel accessing physical RAM directly ( without pagetable ) ?
Thanks
Xin
On Sat, Oct 22, 2011 at 10:50 PM, Américo Wang <xiyou.wangcong@gmail.com> wrote: > On Sun, Oct 23, 2011 at 1:06 AM, Xin Tong <xerox.time.tech@gmail.com> wrote: >> I am investigating copy_from_user and copy_to_user in linux under >> i386. These two function both take a pointer with virtual address and >> a pointer with physical address. >> >> copy_from_user calls __copy_from_user_ll and copy_to_user calls >> __copy_to_user_ll. It make sense to me that __copy_to_user_ll converts >> the virtual address to physical address using the current process's >> page table. >> > [...] >> But it seems to be that __copy_from_user_ll is not converted the >> address at all before attempting to copy. Can someone help explain to >> me why ? >> > > You missed that __copy_to_user_ll() only does that when CONFIG_X86_WP_WORKS_OK > is not defined. And there is a comment right inside __copy_to_user_ll() said: > > > /* > * CPU does not honor the WP bit when writing > * from supervisory mode, and due to preemption or SMP, > * the page tables can change at any time. > * Do it manually. Manfred <manfred@colorfullife.com> > */ > > this is why it uses kmap_atomic()+memcpy() to copy the data. > > Also, all the addresses are virtual address. > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |