2

copyout()AMD64 の FreeBSDの関数の定義はどこにありますか?

( http://www.unix.com/man-page/FreeBSD/9/copyout/ )

私が見つけることができる唯一の場所はsys/sys/systm.h.

定義/宣言は次のとおりです。

int     copyout(const void * __restrict kaddr, void * __restrict udaddr,
        size_t len) __nonnull(1) __nonnull(2);

それは宣言ですか、それとも定義ですか?__nonnull(1)とはどういう__nonnull(2)意味ですか?

4

1 に答える 1

3

これは関数プロトタイプであり、宣言とも呼ばれます。実装 (選択した場合は定義) は、カーネル ソースにあります。それらはオンラインで、または (ソースをインストールすることを選択した場合) ローカルの FreeBSD マシン ( の下) で見つけることができます/usr/src/sys。カーネルがコンパイルされるハードウェアに応じて、実際にはいくつかのコピーがあります。(ちなみに、関数名は「古い」ものです — 私がそれらに出会ったのは 1980 年代半ばで、その時点ではよく知られていました)。

カーネル ソースには、ハードウェア プラットフォームに応じて、これらの関数のいくつかの実装が含まれています。たとえば、FreeBSD 10 では、amd64 バージョンはアセンブリ言語で記述されています (たとえば、/usr/src/sys/amd64/amd64/support.S の SVN を参照してください)。同じリリースで、C で (powerpc サブツリーの下に) 書かれ、現在のソースで書き直された実装が 1 つだけ見つかりまし。そのため、「どこ」がソースであるかを知るには、いくつかの調査を行い、ハードウェア プラットフォームと FreeBSD のリリースに対応するソースを見つける必要があります。

__nonnull指定されたパラメーターが明らかに null ポインターでないことを確認するように指示するコンパイラ ディレクティブです。たとえば、次のメーリング リストのコメントを参照してください。

于 2015-06-05T08:31:43.020 に答える