copy_from_user的疑问
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了copy_from_user的疑问相关的知识,希望对你有一定的参考价值。
看到有个函数:
copy_from_user(void *to, const void __user *from, unsigned long n),从用户空间拷贝数据到内核空间。疑问出来了:
1.如果to和from是逻辑地址:
(1)from是用户空间没问题,内核空间的to地址怎么得到的?
(2)copy_from_user肯定会触发系统调用,负责无法对内核空间进行写操作。
(3)copy_from_user不会在内核调用,否则无法区分from是哪个进程的地址,自然无法定位到物理地址。
2.如果to和from是物理地址,那一点问题都没有。
再追加一个疑问:
copy_from_user进入内核后是怎么实现copy的,到最后cpu执行指令时,如果cpu没有切换工作模式,cpu得到的还是内核空间的逻辑地址from和to,mmu只会把两个地址都映射成内核的物理地址啊,怎么能完成功能呢?难道会把from和to转换成物理地址,切换cpu模式来完成吗?这里面细节是怎样的?
请大家对我的理解和疑问不吝赐教,多多点评
code
asmlinkage void sys_print_val(int a) { printk("in sys_print_val: %d\n",a); return; } asmlinkage void sys_str2num(char __user *str, int str_len, int __user *ret) { char s[1000]; int num=0, i; if (!copy_from_user(s, str, str_len)) { for (i=0;i<str_len;i++) num=num*10+*(s+i)-‘0‘; } copy_to_user(ret, &num, sizeof(int)); }
以上是关于copy_from_user的疑问的主要内容,如果未能解决你的问题,请参考以下文章