哪一个是真正的copy_from_user()?

时间:2012-05-09 17:46:27

标签: linux-kernel

我正在阅读copy_fom_user的Linux内核代码,它取决于架构,我专注于x86架构。

但是我得到了两个实现。

一个是here(在arch / x86 / lib / usercopy_32.c中),而另一个是here(在include / asm-generic / uaccess.h中)。

哪一个最终会被编译到内核中。我猜前者是真的,但我不确定。更奇怪的是,前者具有函数名_copy_from_user而不是copy_from_user

在阅读内核代码时,我总是遇到这种混淆。例如,由于条件编译,相同的函数可能具有多个实现,并且我无法确定通常使用哪个。是否有任何工具,给定一个编译的内核和一个感兴趣的函数,告诉你相应的二进制代码,以便你可以反汇编它?或者如果能告诉你二进制代码对应的源代码会更好。

1 个答案:

答案 0 :(得分:0)

通常,如果特定于体系结构的子目录中存在一个模块,那么就是正在使用的模块。否则,通用的就是它。

对于给定的模块,.c是正确的。 .h中很少有可执行代码。我有2.6.27.8的uaccess.h方便:

#ifndef _ASM_GENERIC_UACCESS_H_
#define _ASM_GENERIC_UACCESS_H_

/*
 * This macro should be used instead of __get_user() when accessing
 * values at locations that are not known to be aligned.
 */
#define __get_user_unaligned(x, ptr)                                    \
({                                                                      \
        __typeof__ (*(ptr)) __x;                                        \
        __copy_from_user(&__x, (ptr), sizeof(*(ptr))) ? -EFAULT : 0;    \
        (x) = __x;                                                      \
})


/*
 * This macro should be used instead of __put_user() when accessing
 * values at locations that are not known to be aligned.
 */
#define __put_user_unaligned(x, ptr)                                    \
({                                                                      \
        __typeof__ (*(ptr)) __x = (x);                                  \
        __copy_to_user((ptr), &__x, sizeof(*(ptr))) ? -EFAULT : 0;      \
})

#endif /* _ASM_GENERIC_UACCESS_H */

仔细看看。这些是用于调用基础__copy_from_user()__copy_to_user()函数的宏包装器,这些函数在每个体系结构上的实现方式不同。