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 に答える