我正在阅读copy_fom_user的Linux内核代码,它取决于架构,我专注于x86架构。
但是我得到了两个实现。
一个是here(在arch / x86 / lib / usercopy_32.c中),而另一个是here(在include / asm-generic / uaccess.h中)。
哪一个最终会被编译到内核中。我猜前者是真的,但我不确定。更奇怪的是,前者具有函数名_copy_from_user而不是copy_from_user
在阅读内核代码时,我总是遇到这种混淆。例如,由于条件编译,相同的函数可能具有多个实现,并且我无法确定通常使用哪个。是否有任何工具,给定一个编译的内核和一个感兴趣的函数,告诉你相应的二进制代码,以便你可以反汇编它?或者如果能告诉你二进制代码对应的源代码会更好。
答案 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()
函数的宏包装器,这些函数在每个体系结构上的实现方式不同。