0

在 Linux 系统中,函数 copy_to_user 和 copy_from_user 到底是在哪里定义和实现的?

4

1 回答 1

5

asm/uaccess.h例如,它在/usr/src/linux-3.0.6-gentoo/include/asm-generic/uaccess.h中定义:

static inline long copy_from_user(void *to,
                const void __user * from, unsigned long n)
{
        might_sleep();
        if (access_ok(VERIFY_READ, from, n))
                return __copy_from_user(to, from, n);
        else
                return n;
}

static inline long copy_to_user(void __user *to,
                const void *from, unsigned long n)
{
        might_sleep();
        if (access_ok(VERIFY_WRITE, to, n))
                return __copy_to_user(to, from, n);
        else
                return n;
}

并且__copy_to_user

#ifndef __copy_to_user
static inline __must_check long __copy_to_user(void __user *to,
                const void *from, unsigned long n)
{
        if (__builtin_constant_p(n)) {
                switch(n) {
                case 1:
                        *(u8 __force *)to = *(u8 *)from;
                        return 0;
                case 2:
                        *(u16 __force *)to = *(u16 *)from;
                        return 0;
                case 4:
                        *(u32 __force *)to = *(u32 *)from;
                        return 0;
#ifdef CONFIG_64BIT
                case 8:
                        *(u64 __force *)to = *(u64 *)from;
                        return 0;
#endif
                default:
                        break;
                }
        }

        memcpy((void __force *)to, from, n);
        return 0;
}
#endif
于 2012-12-07T09:41:05.103 回答