私はデバイスドライバとカーネルプログラミングを学んでいます。 Jonathan Corbetの本によると、デバイスドライバには機能がありませんmain()
。
だから、2つの質問があります。
main()
デバイスドライバに機能が必要ない理由は何ですか?- カーネル自体に
main()
機能がありますか?
誰でも私にこれを説明できますか?
ベストアンサー1
ユーザー空間プログラムでは、main()
プログラムのエントリポイントです。libc初期化コードによって呼び出されるバイナリが実行されるとき。カーネルコードはlibcに依存する余裕はありません。なぜなら、libc自体はメモリ割り当て、I / O、プロセス管理などのためにカーネルシステムコールインターフェイスに依存しているからです。
main()
つまり、カーネルコードではと同じですstart_kernel()
。ブートローダによって呼び出されるカーネルイメージをロードしたら、それをメモリに抽出し、必要なハードウェアとメモリページングを設定します。start_kernel()
ほとんどのシステム設定を行い、最終的にinitプロセスを作成します。
Linuxカーネルモジュールのエントリポイントは、マクロを呼び出してカーネルに登録するinit関数ですmodule_init()
。登録されたモジュール初期化関数は次のようになります。カーネルコードによって呼び出されるdo_initcalls()
カーネルの起動中にこの関数を通過しました。