1

アーキテクチャに依存する copy_fom_user の Linux カーネル コードを読んでおり、x86 アーキテクチャに焦点を当てています。

しかし、それには2つの実装があります。

1 つはこちら(arch/x86/lib/usercopy_32.c) にあり、もう 1 つはこちら(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 に答える