私の意見はそうです。外の世界(非特権プロセッサモード)へのすべての有用な露出は、最初に外の世界で実行されているプロセスを必要とするためです。それには、一時的なRAM内のファイルシステムでさえ、ファイルシステムが必要になります。
別のエンジニアが私に反対しますが、私が知らないすべてのケースを超えてこれを証明することはできません。
この質問に対する答えは、「ランニング」の定義に依存しますか?
プログラムを実行するようにカーネルを実行しないため、これは奇妙な質問です。カーネルは、プログラムを実行するプラットフォームです。もちろん、セットアップとシャットダウンのコードがありますが、カーネルを単独で実行することはできません。常にメインの「init」プロセスが必要です。そして、カーネルがなければ、パニックになります。 initがカーネルを終了しようとすると、パニックになります。
最近のinitプロセスはsystemdのようなものです。特に指定がない場合、カーネルは/sbin/init
で始まる場所のリストからプログラムを実行しようとします。こちらのinit Paramをご覧ください http://man7.org/linux/man-pages/man7/bootparam.7.html 緊急時には、init=/bin/bash
を使用してLinuxを起動できます。ただし、実行するファイルシステム上のファイルを常に指定する方法に注意してください。
したがって、カーネルが起動するとファイルシステムがない場合、カーネルはパニックになります。ファイルシステムがないと、initをロードする方法がないためです。
カーネルがドライバをロードしてファイルシステムにアクセスする必要がある、ニワトリと卵の状況が原因で、混乱が生じる場合があります。これを回避するために、重要なドライバとセットアップスクリプトを含むディスク上のイメージから初期RAMディスクがロードされます。これらは、ファイルシステムがロードされる前に実行されます。ただし、最初のRAMディスク自体がファイルシステムであることは間違いありません。最初のramdiskで/init
が呼び出されます(これは最初のramdiskに格納されています)。多くのディストリビューションでは、最終的にこれが/sbin/init
を呼び出します。これもファイルシステムなしでは不可能です。
答えは、ファイルシステムなしで文字通り意味するのか、それとも質問が実際の記述方法とは少し異なる解釈を意図されているのかによって異なります。質問の解釈方法のわずかな違いに対する答えは次のとおりです。
カーネルコードの一部を書き換えて、ファイルシステムなしで動作するシステムにする必要がある理由は次のとおりです。
execve
システムコールによって開始されます。execve
を使用してプログラムが開始された後、それを開始した実行可能ファイルをマップ解除することができますが、これを行うには、すぐにクラッシュせずに、実行可能メモリマッピングを作成する必要があります。 tファイルに支えられており、ジャンプして実行可能ファイルのマッピングを解除する前に、有用なコードで初期化する必要があります。
したがって、実行中のユーザーモードプログラムは、ファイルにバッキングされたメモリマッピングがない状態で存在し、ファイルにバッキングされたすべてのファイル記述子を閉じることができます。ルートディレクトリと現在の作業ディレクトリを持つことを止めることはできませんが、それらを控えることができます。
したがって、この状態でカーネルコードを実装して、ファイルシステムをプログラムの下から引き離し、実行を継続させることはできますが、実用的ではないようです。そして、ファイルシステムを使用するという中間状態を経由せずにその最終状態に到達することは、有益な利点がないため、さらに多くの作業になるでしょう。
一部の特殊なユースケースに役立つ設定
ブロックデバイスの使用を回避すると便利な場合があります。ブート時に、カーネルはメモリファイルシステムを作成し、cpio
を実行する前に、そのファイルシステムにinit
アーカイブの内容を取り込むこともできます。このようにして、システムを完全にメモリベースのファイルシステムから実行できます。
これは、状態を保持したくないシステムで、システムを再起動時に白紙の状態から開始したい場合に役立ちます。
もちろん、カーネルに制御を与える前に、カーネルとcpioアーカイブが何らかの方法でメモリに存在する必要があります。彼らがそこに着いた方法は、ブートローダーの仕事です。最終的に実行中のシステムがブロックデバイスを使用していない場合でも、ブートローダーはそれらをブロックデバイスからロードできます。ただし、ネットワーク経由で起動するなどして、ブロックデバイスを使用せずに、ブートローダーがカーネルとcpioアーカイブを取得することもできます。
Linuxでは、ほぼ すべてのデバイスはファイルです なので、実行するにはファイルシステムが必要です。