- 论坛徽章:
- 0
|
原帖由 albcamus 于 2009-4-16 15:57 发表 ![]()
这样吧, 能分析一下copy_from_user的代码,看看到底是不是 用内核地址去访问用户内存的吗?
稍微看了一下,对asm不太熟,对于copy_from_user(), 注释里说了"user context only", 所以copy_from/to_user 一般是用于system call, 所以kernel使用process page table 应给是没有问题,并通过user address 来access user space memory是可以的。 (但是通过我说的 user addr -> phy addr -> kernel virtual addr也是可以的,see __copy_to_user_ll() with CONFIG_X86_WP_WORKS_OK defined, kernel 就是通过get_users_pages来得到对应于这个user addr的struct page, 然后在通过kmap_atomic()得到对应的kernel virtual address).
上面说了在system call里,copy_from_user一般用于读取user space传进来的参数。但是在一些aio操作中,kernel想要access user space memory的话,就必须通过get_user_pages()现得到所对应的struct page,在通过kmap_atomic()得到这个page所对应的kernel virtual address.
因为这是已经不是在原来的user process context中了。
另外一个地方就是,kernel通过buddy system 分配一个page, 他也需要将这个page来得到kernel virtual address来访问这个page对应的物理地址。在slab中会用到kmem_getpages(),可以参考。
所以,kernel肯定是把low memory [0,896M)的物理地址线性的map到[3G,3G+896M)。 |
|