デフォルトでは、私は組み込みLinuxが単一のアプリケーションを実行したいのですが、最小限のカーネルプロセスと最小限のユーザー領域プロセスを使用します。
- 私はカーネルやルートファイルシステムのサイズにあまり興味がありません。 (もちろん薄いものがまだ好まれます。)
- したがって、カーネルに追加で組み込まれたモジュールは、必要でないときに実行されない限り大丈夫です。後で使用/有効にできると思います。
- また、「ps」、「top」などのコマンドを実行できるように監視するカーネルプロセスがまだ必要です。
- 「Init」プログラムを変更して、ユーザー領域プロセスを有効/無効にできることを知っています。そうですか?
- しかし、カーネルプロセスを有効/無効にする方法は?
- ----私のアプリケーションにどのカーネルプロセスが必要かをどうやって知ることができますか?
ありがとうございます!
答え1
特定のカーネルAPIをサポートするために存在するため、カーネルスレッドを個別に無効にする一般的な方法はありません(例[kworker/*]
:ジョブキュー)またはサブシステム(たとえば、フラッシュおよび他のバックグラウンドジョブに関連するブロックサブシステムのスレッド)、またはモジュール(ファイルシステム、デバイスマッパーなどを管理するために使用されるスレッド)。
場合によっては、それを使用するカーネルAPIは実際にはオプションではなく、ジョブキューの場合と同様にカーネルスレッドを使用せず、同じ機能を提供する代替手段を提供しないため、実際には無効にすることはできません。 (しかし、カーネル開発者は、このAPIで使用されるスレッドの総数を減らすよう努めました。)
場合によっては、特定のスレッドを無効にすることができますが、通常、カーネルサブシステムまたはモジュール全体を無効にするまでスレッドを無効にすることができます。たとえば、ext4を使用しなくなった場合は、ext4カーネルスレッドもなくなります。
ここで質問が間違っているようです。カーネルスレッドはオーバーヘッドの原因ではありません。しばしばその逆は本当です。一部のプロシージャとコールバックが移動されました。入力するカーネルスレッドをより効率的に実行できるようにし、同じタスクを実行するための別々のメカニズムを作成するのではなく、カーネルスケジューラを再利用してバックグラウンドで定期的に実行するようにします。
カーネルスレッドは実際に追加のメモリを消費せず、カーネルアドレス空間のみを共有します。 (技術的には、各スレッドには追加のスレッドが必要task_struct
ですが、これは組み込みシステムでも基本的には関係ありません。)
組み込みシステムのカーネル機能を無効にすることは意味がありますが、実行中のカーネルスレッドではなく、不要または調整できる特定のカーネル構成に集中する必要があります。これは非常に明白ですが(実行時ps
など)、上記のように、これが実際にシステムリソースを使用しているわけではありません。したがって、効率の向上を探している場合は、カーネルスレッドに集中するよりも他の場所で役に立つものを見つける可能性が高くなります。