0

スタックオーバーフローの皆さん、よろしくお願いします!

fpirntf() を XNU カーネル tcp_xxx.c ファイルに追加しようとしているので、TCP が移動するときにパラメーターをファイルに出力して、TCP の動作をよりよく理解できるようになりますが、次のような致命的なエラーが発生します。

$ sudo make ARCH_CONFIGS=X86_64 KERNEL_CONFIGS=DEBUG
CC tcp_output.o
/Users/wangweikai/Desktop/xnubuilder/xnu-2422.90.20/bsd/netinet/tcp_output.c:135:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
         ^
1 error generated.
make[7]: *** [tcp_output.o] Error 1
make[6]: *** [build_all] Error 2
make[5]: *** [do_all] Error 2
make[4]: *** [build_all] Error 2
make[3]: *** [build_all_recurse_into_conf] Error 2
make[2]: *** [build_all_recurse_into_bsd] Error 2
make[1]: *** [build_all_bootstrap_DEBUG^X86_64^NONE] Error 2
make: *** [all] Error 2

xnu ソース コードに stdio.h がないように見えます。これを解決するために、xcode 5.0.2 を再インストールし (これのみが xnu-2422 で動作します)、ブート可能な mach_kernel を出力しました。ターミナルで「xcode-select --install」でコマンドラインツールをインストールしようとしましたが、どちらも機能しませんでした。ところで、#include なしで printf() を追加してもエラーは発生しません。印刷関数は stdio.h 以外の名前のファイルで定義されているようです。

私のポイントはTCPパラメータ(輻輳ウィンドウサイズや次のシーケンス番号など)がファイルにどのように変化するかを記録することなので、これを行う方法があれば教えてください.xnuとCはまったく初めてです.プログラミング。

よろしくお願いします。

4

1 に答える 1

3

標準 I/O (つまり、stdio) はカーネルでは使用できません。カーネルからデバッグ情報を出力するには、printf();を呼び出します。その出力はカーネル ログに表示されます。カーネルから直接ファイルにデータを書き込むのは複雑であり、あまりお勧めできません。(この場合、たとえば、書き込み先のファイルがネットワーク ボリューム上にある場合など、実際にはハード ロックアップにつながる可能性があります!)

C プログラミングが初めての場合、これは最初のプロジェクトとしては適していません。カーネルの開発は、特に XNU カーネルの場合、困難で容赦のないものです。多くの場合、エラーによってコンピューターがクラッシュし、データが失われる可能性があり、デバッグ サービスが利用できないことがよくあります。ただし、OS カーネルを調べたいという気持ちがある場合は、Linux カーネルの方がはるかに使いやすく、仮想マシンで簡単に起動してデバッグでき、ドキュメントも充実しています。

于 2014-07-13T05:00:17.133 に答える