1

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

但是我有两个实现。

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

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

在阅读内核代码时,我总是有这种困惑。例如,由于条件编译,同一个函数可能有多个实现,我无法确定一般会使用哪一个。有没有什么工具,给定一个编译好的内核和一个感兴趣的函数,告诉你相应的二进制代码,以便你可以反汇编它?或者如果能告诉你二进制代码对应的源代码就更好了。

4

1 回答 1

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()函数的宏包装器,它们在每个架构上的实现方式不同。

于 2012-05-09T17:49:41.920 回答