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模式来完成吗?这里面细节是怎样的?
请大家对我的理解和疑问不吝赐教,多多点评

参考技术A 换成物理地址

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的疑问的主要内容,如果未能解决你的问题,请参考以下文章

DataBind()的疑问

httpclient的疑问求解答

CSS TBODY的一些疑问

请教一个TP5模型查询疑问

语法:反意疑问句

小小的锁,大大的疑问?Lock疑问?